MFC中動態新增選單項和響應選單事件
阿新 • • 發佈:2019-02-14
新建一個單文件程式
在檢視選單項中增加兩個子選單,分別為隱藏工具欄(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