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


Автор: Амортизатор 31.7.2005, 00:35
Контекстное меню не обновляется, например CView::OnUpdatePaste - не вызывается при всплывании меню. Как быть?

Автор: Амортизатор 1.8.2005, 12:44
Вызов функции, отвечающей за обновление контекстного меню вызывается лишь при клике на одну из команд, а при появлении меню (при щелчке правой кнопкой мыши) не вызывается. Неужели никто с этим не сталкивался?

Автор: chaos 1.8.2005, 13:36
обрабатывай сообщение
WM_CONTEXTMENU

Автор: Амортизатор 1.8.2005, 17:41
Но я его и так отлавливаю.
Кажется, я толком не объяснил суть проблемы

Вот тут я отлавливаю то самое сообщение WM_CONTEXTMENU
Код

void CMapView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
// TODO: Add your message handler code here
    if (edit==false)
    return;
    CMapDoc* pDoc = GetDocument();
    CPoint pt=point;
    ScreenToClient(&pt);

    CMenu menu;
    int y=pDoc->PtInHouses(pt);
    if (y!=-1)
    {
        menu.LoadMenu(ContextMenu1);
        pDoc->IndentHouse(y);
        Invalidate(true);
    }
    else
        menu.LoadMenu(ContextMenu2);
    
    menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}


С командой Paste контекстного меню связана переменная ID_PASTE. С ней я ассоциирую On_update_UI

Код

CMapDoc* pDoc = GetDocument();
if (edit==false || pDoc->Accent()==-1)
    pCmdUI->Enable(false);
else
    pCmdUI->Enable(true);


Так вот эта функция по идее должна отображаться при правом щелке и показывании контексного меню (винда посылает сообщение WM_INITMENUPOPUP и формируется объект CCmdUI, которому посылается сообщение WM_UPDATE_UI и которое не удается перехватить)

Автор: Earnest 2.8.2005, 17:25
Дело в том, что у view нет обработчика WM_INITMENUPOPUP. В MFC-framework такой обработчик есть только у FrameWnd. Поэтому вариантов 2: либо ловишь сам WM_INITPOPUPMENU в своем view, либо передаешь в TrackPopupMenu не this, а parent frame, тогда update'ы дойдут до view по стандартному пути диспетчиризации команд. Второй вариант проще, если речь идет только о легкой модификации пунктов меню (enable, setcheck, etc). Первый - если нужно модифицировать меню по-крупному.
Не уверена на 100%, т.к. давно в этом разбиралась, но, мо-моему, так.

Автор: Амортизатор 3.8.2005, 09:47
Спасибо. Воспользовался вторым вариантом.

Автор: pvl 16.11.2005, 21:57
Я так понял Вы разобрались с этим вопросом, пожалуйста ответьте кодом как нажать на кнопку чужого контекстного меню?

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