今天一个同事问到了我怎么用MFC创建一个动态的弹出式的菜单,之前也没用过,不过根据之前的经验然后参考了一下网上的资料,现在将它记录一下,方便以后可能会用到。
第一步,首先定义一个CMenu对象:
CMenu *m_pMenu;
第二步,在初始化的时候new一个对象(在堆中):
//创建对象 m_pMenu = new CMenu();
第三步,在窗口初始化或需要(比如从文件中加载)的时候附加子菜单:
m_pMenu->CreatePopupMenu();
m_pMenu->AppendMenu(MF_STRING, 10000, _T("学号"));
m_pMenu->AppendMenu(MF_STRING, 10001, _T("姓名"));
m_pMenu->AppendMenu(MF_STRING, 10002, _T("性别"));第四步,在需要地方弹出子菜单,可以响应鼠标按钮消息,也可以是一个按钮,这里在按钮中响应,当然也可以在直接在响应鼠标消息之后创建子菜单和弹出(第三和第四步一起):
void CMenuDemoDlg::OnBnClickedButtonPopMenu()
{
// TODO: Add your control notification handler code here
POINT pt;
GetCursorPos(&pt);
m_pMenu->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
}第五步,响应点击了哪一个菜单的消息,重写虚函数OnCommand(WPARAM wParam, LPARAM lParam),然后在里面调用GetMenuString就可以获取选中的子菜单标题了,之后就可以处理你需要处理的事情了。
BOOL CMenuDemoDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
WORD wCode = HIWORD(wParam); //类型
WORD wID = LOWORD(wParam); //ID
if (0 == wCode)
{
//选中了第一个
if (10000 == wID)
{
CString str;
m_pMenu->GetMenuString(wID, str, MF_BYCOMMAND);
AfxMessageBox(str);
}
}
return CDialogEx::OnCommand(wParam, lParam);
}第六步,最后别忘记了在窗口销毁的时候销毁菜单和删除CMenu对象指针:
//窗口销毁时
BOOL CMenuDemoDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
if (NULL != m_pMenu)
{
//销毁菜单
if (NULL != m_pMenu->m_hMenu)
{
m_pMenu->DestroyMenu();
}
//删除CMenu对象
delete m_pMenu;
m_pMenu = NULL;
}
return CDialogEx::DestroyWindow();
}好久不用MFC了,消息路由的过程都忘得差不多了,不过框架和概念还是有的,抽出来然后放回去,就当是记录贴了。

下载地址:http://files.suchone.com/upload/2015/12/20151219005349_37849.zip
本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!