MFC添加右键菜单
2015-03-24 22:39
246 查看
学习MFC刚开始,第一件事就是学习右键菜单
右键弹出菜单
为什么想写右键菜单,其实MFC右键菜单并不难,但是比较恶心。在一次做项目的过程中使用了OnRButtonUp这个事件来触发右键菜单,可是有一次我查看了一下内存,我狂点右键之后,内存在不断增加,而且不是说增加几次之后就不增加了,一直增加。这种现象可能在学习的时候表现的不明显(具体明显的原因还不太清楚,可能跟程序大小有关,也可能跟界面刷新频率有关,也不排除跟我选择的是基于对话框而非给予文档的有关),但是程序做大之后可能会比较明显。当时为了解决这个问题费了很多脑筋,浪费了两天的宝贵时间,又是查msdn又是上网查,总是找不到解决办法。后来看到一个帖子用OnContextMenu这个事件来触发右键菜单,我抱着试试看的心理来用,结果发现用了这个事件之后真的是腰不酸了,腿不疼了,内存也不增长了。既然都说到这了,那就把具体的步骤写一下吧。
本文适合人群:初学者,使用OnRButtonUp事件有内存问题的人。
正文:例子
1.建立一个基于对话框的的MFC程序。
2.Insert->Resource->Menu。
3.可以给menu改一个id,也可以不改。
4.把菜单搞成这样的(搞成别的样的也可以)。
5.在对话框对应的类上点右键->Add WindowsMessage Handler->WM_CONTEXTMENU->编辑之。
6.修改OnContextMenu函数
{CSDN:COED:27}
voidCRButtonMenuDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler codehere
CMenu popMenu;
popMenu.LoadMenu(IDR_RBTN_MENU); //载入菜单
CMenu *pPopup;
pPopup=popMenu.GetSubMenu(0); //获得子菜单指针
pPopup->EnableMenuItem(ID_1,MF_BYCOMMAND|MF_ENABLED); //允许菜单项使用
pPopup->EnableMenuItem(ID_2,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); //不允许菜单项使用
//ClientToScreen(&point); //将客户区坐标转换成屏幕坐标
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); //显示弹出菜单,参数依次为(鼠标在菜单左边|跟踪右键,x,y,this)
pPopup->Detach();
popMenu.DestroyMenu();
}
{CSDN:COED:28}
注意:在OnContextMenu这个事件函数中不需要使用ClientToScreen(&point);这个函数来转换坐标,因为它自动就转了,你再给它转又歪了。
右键弹出菜单
为什么想写右键菜单,其实MFC右键菜单并不难,但是比较恶心。在一次做项目的过程中使用了OnRButtonUp这个事件来触发右键菜单,可是有一次我查看了一下内存,我狂点右键之后,内存在不断增加,而且不是说增加几次之后就不增加了,一直增加。这种现象可能在学习的时候表现的不明显(具体明显的原因还不太清楚,可能跟程序大小有关,也可能跟界面刷新频率有关,也不排除跟我选择的是基于对话框而非给予文档的有关),但是程序做大之后可能会比较明显。当时为了解决这个问题费了很多脑筋,浪费了两天的宝贵时间,又是查msdn又是上网查,总是找不到解决办法。后来看到一个帖子用OnContextMenu这个事件来触发右键菜单,我抱着试试看的心理来用,结果发现用了这个事件之后真的是腰不酸了,腿不疼了,内存也不增长了。既然都说到这了,那就把具体的步骤写一下吧。
本文适合人群:初学者,使用OnRButtonUp事件有内存问题的人。
正文:例子
1.建立一个基于对话框的的MFC程序。
2.Insert->Resource->Menu。
3.可以给menu改一个id,也可以不改。
4.把菜单搞成这样的(搞成别的样的也可以)。
5.在对话框对应的类上点右键->Add WindowsMessage Handler->WM_CONTEXTMENU->编辑之。
6.修改OnContextMenu函数
{CSDN:COED:27}
voidCRButtonMenuDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler codehere
CMenu popMenu;
popMenu.LoadMenu(IDR_RBTN_MENU); //载入菜单
CMenu *pPopup;
pPopup=popMenu.GetSubMenu(0); //获得子菜单指针
pPopup->EnableMenuItem(ID_1,MF_BYCOMMAND|MF_ENABLED); //允许菜单项使用
pPopup->EnableMenuItem(ID_2,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); //不允许菜单项使用
//ClientToScreen(&point); //将客户区坐标转换成屏幕坐标
pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); //显示弹出菜单,参数依次为(鼠标在菜单左边|跟踪右键,x,y,this)
pPopup->Detach();
popMenu.DestroyMenu();
}
{CSDN:COED:28}
注意:在OnContextMenu这个事件函数中不需要使用ClientToScreen(&point);这个函数来转换坐标,因为它自动就转了,你再给它转又歪了。
相关文章推荐
- MFC在对话框添加右键菜单
- MFC中的CListCtrl添加右键菜单消息响应实例分析
- MFC如何添加右键空白处菜单
- MFC CListCtrl控件添加右键菜单
- MFC 添加右键菜单选项功能
- MFC基于对话框最小化到托盘,并鼠标右键添加菜单以及对应菜单功能
- MFC学习笔记.day03-菜单,图形标记菜单创建,菜单栏禁用,命令响应,右键弹出菜单,添加菜单
- MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单 .
- MFC右键菜单的添加
- MFC中的CListCtrl添加右键菜单消息响应实例分析
- MFC总结(5)---ListCtrl添加右键菜单
- MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单
- mfc使用CListCtrl添加右键菜单及双击(以默认方式)打开文件。
- MFC添加右键菜单
- MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单
- MFC添加右键菜单
- MFC添加右键菜单
- mfc 给CTreeCtrl添加右键菜单CTreeCtrl
- MFC为应用程序添加托盘(右键托盘,弹出菜单)
- MFC:在CView(或CScrollView等)界面上动态添加右键菜单