Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Переопределение CEdit


Автор: Алексеу 26.6.2008, 13:27
Здравствуйте, господа!

Нужно срочно написать программу типа блокнотика, однако застопорился на одной детали, которая никак не дает продвинуться в функционале - нужно чтобы в блокнотике работало контекстное меню своего образца. По умолчанию у CEdit свое контекстное меню. Его нужно убрать и заменить собственным. Для этого нужно переопределить класс CEdit, унаследовав его. Однако как это сделать?

Вот так мы его наследуем:

class EdBox : public CEdit
{
...
}

а что нужно делать внутри чтобы убрать контекстное меню и поставить свое? 
Я просто в тупике...

Буду очень благодарен за любую подсказку.

Автор: voov 26.6.2008, 13:36
если нужна програмка типа блокнотика, то зачем эдит?
По-моему, проще сделать проект типа SDI и класс представления унаследовать от CEditView или CRichEditView.
Так объем работы будем меньше, а функциональность программки больше

Автор: Алексеу 26.6.2008, 13:39
voov, к сожалению програмка учебная и нужно ее сотворить именно на основе CEdit, а вот как убрать стандартное меню...  smile 

Автор: tonchitos 26.6.2008, 14:08
ну так в чем проблема - переопределите функцию контекстного меню, и в нем работайте со своим меню... главное ф-ию базового класса не вызывайте...

Автор: Алексеу 26.6.2008, 14:10
tonchitos, а можете показать приблизительно как это делать? Собственно, для того и совета попросил т.к. не могу сделать этого...

Автор: tonchitos 26.6.2008, 14:27
типа такого, вот набросок:

Код


class myEdit: public CEdit
{
    DECLARE_DYNAMIC(myEdit)
// Constructors
public:
    myEdit();
    BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

    CMenu m_PopupMenu;
// Operations
    virtual void OnInitialUpdate(); // called first time after construct

    afx_msg void OnContextMenu(CWnd* pWnd, CPoint pos)
    {
        m_PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, pos.x, pos.y, AfxGetMainWnd());
    }

// Implementation
public:
    // virtual OK here - ~CWnd already virtual
    virtual ~myEdit();
};

void myEdit::OnInitialUpdate()
{
    m_PopupMenu.LoadMenu(IDR_CONTEXT);
        ASSERT(m_PopupMenu!=NULL);
}


всю фигню типа карты сообщений и прочего напишешь сам?

Автор: voov 26.6.2008, 14:29
Код

void EdBox::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
    CMenu menu;
    menu.LoadMenu(IDR_MENU_CONTEXT);

    CMenu* pPopup = menu.GetSubMenu(0);

    ASSERT(pPopup != NULL);

    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}


меню должно быть попап, т.е. должен быть корневой элемент, который отображаться не будет, а все необходимые пункты меню должны быть внутри корневого

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)