1. 程式人生 > >MFC中動態新增選單項和響應選單事件

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("右鍵選單"));
http://www.cnblogs.com/mx113/archive/2009/12/05/1617678.html