FAQ:WinAPI VCPP:OnUpdate для пунктов меню — различия между версиями
Материал из Весельчак У
RXL (обсуждение | вклад) (Новая: ===Почему не вызывается OnUpdate для пунктов меню (не получается ни затенить, ни отметку поставить)?=== В диа...) |
RXL (обсуждение | вклад) |
||
Строка 40: | Строка 40: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | [[Category:FAQ:WinAPI VCPP]] | + | [[Category:FAQ:WinAPI VCPP]] [[Category:FAQ:MFC]] |
Текущая версия на 22:15, 3 октября 2009
Почему не вызывается OnUpdate для пунктов меню (не получается ни затенить, ни отметку поставить)?
В диалоге (CDialog) у меню апдейт не происходит сам, в отличие от мейнфрейма (CFrameWnd). Для этого нужно сделать апдейт самим, в обработчике сообщения WM_KICKIDLE.
Визардом этот обработчик не добавляется, поэтому можно переопределить виртуальную DefWindowProc() и там обработать:
// этот файл надо включить, там определёна WM_KICKIDLE #include <afxpriv.h> LRESULT CMyDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_KICKIDLE) { // делаем апдейт для всех пунктов меню CMenu* pMainMenu = GetMenu(); if (pMainMenu) { CCmdUI cmdUI; for (UINT n = 0; n < pMainMenu->GetMenuItemCount(); n++) { CMenu* pSubMenu=pMainMenu->GetSubMenu(n); if (!pSubMenu) continue; cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount(); for (UINT i = 0; i < cmdUI.m_nIndexMax; i++) { cmdUI.m_nIndex = i; cmdUI.m_nID = pSubMenu->GetMenuItemID(i); cmdUI.m_pMenu = pSubMenu; cmdUI.DoUpdate(this, FALSE); } } } } return CDialog::DefWindowProc(message, wParam, lParam); }