MFC 對話框中動態創建N級菜單以及響應事件


創建一個基於對話框的工程,工程名為CreateMenu

為該對話框增加一個文件菜單項和測試菜單項,如下圖所示

1 2

測試菜單項至少要有一個子菜單項

在對話框屬性中關聯該菜單

在resource.h中增加一個ID_TESTMENU宏

#define ID_TESTMENU          5000

 

在對話框中添加一個Button按鈕,建立消息映射,編輯代碼如下

void CCreateMenuDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    char buf[2];
    //獲取頂級菜單
    CMenu* pMenu=GetMenu();
    //獲取1級菜單
    CMenu* pFileMenu=pMenu->GetSubMenu(0);
    CMenu* pTestMenu=pMenu->GetSubMenu(1);
    //添加2級菜單
    if(pTestMenu->GetSafeHmenu()==NULL) 
        return;
    //添加一個2級彈出菜單,將"文件"菜單項作為該菜單的子菜單
    pTestMenu->AppendMenu(MF_POPUP,(UINT)pFileMenu->m_hMenu,"文件");
    //添加一個2級彈出菜單,該菜單的子菜單為空
    pTestMenu->AppendMenu(MF_POPUP,(UINT)pTestMenu->m_hMenu,"測試");
    //添加10個2級普通菜單
    for(UINT m_ID=1;m_ID<=10;m_ID++)
    {
        itoa(m_ID,buf,10);
        pTestMenu->AppendMenu(MF_SEPARATOR);
        pTestMenu->AppendMenu(
            MF_STRING,m_ID+ID_TESTMENU,"2級菜單"+CString(buf));
    }
 
    //添加n級菜單
    CMenu* pnMenu=pTestMenu->GetSubMenu(2);
    pnMenu->AppendMenu(MF_POPUP,(UINT)pnMenu->m_hMenu,"3級菜單");
    for(int i=0;i<5;i++)
    {
        pnMenu=pnMenu->GetSubMenu(0);
        if(pnMenu==NULL) return;
        itoa(i+4,buf,10);
        pnMenu->AppendMenu(
            MF_POPUP,(UINT)pnMenu->m_hMenu,buf + CString("級菜單"));
    }
    pnMenu->GetSubMenu(0)->AppendMenu(
        MF_STRING,ID_TESTMENU,"9級菜單");
}

 

響應單擊菜單的事件

添加OnCommand的消息映射,編輯代碼如下

BOOL CCreateMenuDlg::OnCommand(WPARAM wParam, LPARAM lParam) 
{
    // TODO: Add your specialized code here and/or call the base class
    UINT uMsg=LOWORD(wParam);
    char buf[2];
    if(uMsg==ID_TESTMENU)
    {
                MessageBox("HELLO!");
    }
    for(UINT i=1;i<=10;i++)
    {
        if(uMsg==ID_TESTMENU+i)
        {
            itoa(i,buf,10);
            MessageBox("HELLO! " + CString(buf));
        }
    }
    return CDialog::OnCommand(wParam, lParam);
}

 

 

 

運行結果:

3

 

源碼下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM