La o aplicatie SDI/MDI, un meniu este adaugat de MFC AppWizard. De asemenea, pentru SDI/MDI, framework-ul MFC ofera suport pentru UI (user-interface) update commands, ceea ce inseamna ca se pot folosi macro-uri gen ON_UPDATE_COMMAND_UI pentru a mapa handlere in care se pot seta in mod dinamic item-urile de meniu (enable/disable, check/uncheck, text, etc).
Cum se pot face acestea si intr-o aplicatie dialog-based?
Rezolvare
- In editorul de resurse, se adauga si se completeaza o resursa tip "Menu".
- Se seteaza meniul pentru dialogul principal din editorul de resurse (proprietatea "Menu") sau, la run-time folosind functia CWnd::SetMenu.
- In clasa dialogului principal se mapeaza mesajul WM_INITMENUPOPUP si se adauga suport pentru UI update commands.
Code: Select all
void CMainDialog::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); CCmdUI cmdUI; const UINT nCount = pPopupMenu->GetMenuItemCount(); for(UINT nMenuIndex = 0; nMenuIndex < nCount; nMenuIndex++) { CMenu* pSubMenu = pPopupMenu->GetSubMenu(nMenuIndex); if(NULL == pSubMenu) { cmdUI.m_nIndexMax = nCount; for(UINT nItem = 0; nItem < nCount; nItem++) { cmdUI.m_nIndex = nItem; cmdUI.m_nID = pPopupMenu->GetMenuItemID(nItem); cmdUI.m_pMenu = pPopupMenu; cmdUI.DoUpdate(this, FALSE); } } } }
- In continuare folosim wizard-ul pentru maparea de comenzi (ON_COMMAND) si UI update commands (ON_UPDATE_COMMAND_UI).