創建一個基於對話框的工程,工程名為CreateMenu
為該對話框增加一個文件菜單項和測試菜單項,如下圖所示
測試菜單項至少要有一個子菜單項
在對話框屬性中關聯該菜單
在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);
}
運行結果: