您的位置:首页 > 其它

【原创】MFC中动态创建N级菜单以及响应事件

2009-12-05 23:27 721 查看
创建一个基于对话框的工程,工程名为CreateMenu

为该对话框增加一个文件菜单项和测试菜单项,如下图所示







测试菜单项至少要有一个子菜单项

在对话框属性中关联该菜单

在resource.h中增加一个ID_TESTMENU宏

#define ID_TESTMENU          5000

 

在对话框中添加一个Button按钮,建立消息映射,编辑代码如下

void CCreateMenuDlg::OnButton1()


[code]{


// 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级菜单");


}

[/code]

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

响应单击菜单的事件

添加OnCommand的消息映射,编辑代码如下

BOOL CCreateMenuDlg::OnCommand(WPARAM wParam, LPARAM lParam)


[code]{


// 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);


}

[/code]

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

运行结果:





 

源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: