今天一个同事问到了我怎么用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
本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!