[MFC] Cum adaug meniu unei aplicatii dialog-based?

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

[MFC] Cum adaug meniu unei aplicatii dialog-based?

Post by Ovidiu Cucu » 08 Aug 2011, 08:45

Problema
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
  1. In editorul de resurse, se adauga si se completeaza o resursa tip "Menu".
  2. Se seteaza meniul pentru dialogul principal din editorul de resurse (proprietatea "Menu") sau, la run-time folosind functia CWnd::SetMenu.
  3. 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);
             }
          }
       }
    }
  4. In continuare folosim wizard-ul pentru maparea de comenzi (ON_COMMAND) si UI update commands (ON_UPDATE_COMMAND_UI).
Vezi si << Back to MFC index



Post Reply