MFC 單文檔中動態添加菜單項和響應菜單事件


新建一個單文檔程序

在查看菜單項中增加兩個子菜單,分別為隱藏工具欄(ID_HIDE),新建菜單(ID_NEWMENU)

在Resource.h中增加一個ID_NEWMENU宏

#define ID_NEWMENU        WM_USER+101

 

操作工具欄和狀態欄

使用GetDescendantWindow函數獲取工具欄和狀態欄的指針

為ID_HIDE添加消息映射,編輯代碼如下

    static bool m_Hide=false;
    m_Hide=!m_Hide;
    //獲取工具欄指針
    CWnd* pWndToolBar=(CWnd*)GetDescendantWindow(AFX_IDW_TOOLBAR);
    //獲取狀態欄指針
    CWnd* pWndStatusBar=(CWnd*)GetDescendantWindow(AFX_IDW_STATUS_BAR);
    CMenu* pMenu=GetMenu();
    CMenu* pSubMenu=pMenu->GetSubMenu(2);
    if(m_Hide)
    {
        pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"顯示工具欄");
        if(pWndStatusBar!=NULL)    pWndStatusBar->SetWindowText("隱藏工具欄");
        if(pWndToolBar!=NULL)    pWndToolBar->ShowWindow(SW_HIDE);
    }
    else
    {
        pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"隱藏工具欄");
        if(pWndStatusBar!=NULL)    pWndStatusBar->SetWindowText("顯示工具欄");
        if(pWndToolBar!=NULL)    pWndToolBar->ShowWindow(SW_SHOW);
    }

 

動態添加子菜單

為ID_NEWMENU增加消息映射,編輯代碼如下

    static UINT m_NewMenu=ID_NEWMENU+1;
    //獲取菜單
    CMenu* pMenu=GetMenu();
    //獲取索引為2的菜單項,即第3列菜單
    CMenu* pSubMenu=pMenu->GetSubMenu(2);
    char buffer[1];
    itoa(m_NewMenu-ID_NEWMENU,buffer,10);
    if(m_NewMenu<=ID_NEWMENU+5)
    {
        pSubMenu->AppendMenu(MF_SEPARATOR); //分隔線
        pSubMenu->AppendMenu(MF_STRING | MF_ENABLED,m_NewMenu++,
                                    CString("新的菜單 ")+buffer);    
    }
    //如果m_bAutoMenuEnable為true,則會依次檢查View、Document、Frame的
    //消息映射表是否有這個彈出菜單中每個菜單項的處理函數,如果沒有就會把那一項改為灰的   
    m_bAutoMenuEnable=false;

 

添加OnCommand的消息映射用來響應添加的子菜單項,代碼如下

UINT uMsg=LOWORD(wParam);
    for(UINT i=ID_NEWMENU+1;i<=ID_NEWMENU+5;i++)
        if(uMsg==i)
        {
            char buffer[1];
            itoa(i-ID_NEWMENU,buffer,10);
            MessageBox(CString("新的菜單 ") + buffer);
        }

 

右鍵菜單

在View類中添加OnRButtonDown的消息映射,代碼如下

    CMenu pPopMenu;
    pPopMenu.CreatePopupMenu();
    if(pPopMenu==NULL);
    pPopMenu.AppendMenu(MF_STRING,ID_NEWMENU+6,"右鍵菜單");
    this->ClientToScreen(&point);
    pPopMenu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);

 

在View類中添加OnCommand的消息映射用來響應右鍵菜單的事件

UINT uMsg=LOWORD(wParam);
    if(uMsg==ID_NEWMENU+6)
        MessageBox(CString("右鍵菜單"));
 


免責聲明!

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



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