MFC 單文檔中動態添加菜單項和響應菜單事件
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
新建一個單文檔程序
在查看菜單項中增加兩個子菜單,分別為隱藏工具欄(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("右鍵菜單"));
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成