弹出式菜单(PopMenu)大家都熟悉,在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单。通常情况下,弹出式菜单在鼠标右键单击 时弹出,当然,也可以根据需要随时弹出。 在VC++5的MFC中,管理菜单的类叫CMenu。下面我向大家介绍建立一个弹出式菜单的基本方法。
一、在资源编辑器中建立一个菜单资源
新建一个菜单资源,比如把菜单的ID号为IDC_POPMENU。此菜单有一项两层,即有一个可弹出的菜单项,而此菜单项的弹出内容即为将要建立的弹 出式菜单的内容。如右图,“可弹出项”下的菜单即为将要建立的弹出式菜单的内容。实际上,“可弹出项”这个名称在以后的操作中不会被用到,但VC++5不 允许直接建立弹出式菜单,所以采用先建立“可弹出项”的方法。
至于每一个菜单项的消息映射,与一般的菜单相同。

二、使用CMenu类对象
CMenu类的成员函数较多,但建立弹出式菜单只需用到其中几个成员函数。
1、LoadMenu函数
原型:BOOL LoadMenu( UINT nIDResource );
其中nIDResource是菜单资源的ID号,这里用的是刚建立的IDC_POPMENU。
2、GetSubMenu函数

原型:CMenu* GetSubMenu( int nPos ) const;
此函数用于得到子菜单的指针。nPos为层数,0为第一层子菜单……以此类推。
由于我们需要的是“可弹出项”的第一层子菜单,因此用GetSubMenu(0)来得到第一层子菜单的类指针。
3、TrackPopupMenu函数
原型:BOOL TrackPopupMenu( UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = NULL );
其中:
nFlags为屏幕坐标属性和鼠标坐标属性
屏幕坐标属性:
TPM_CENTERALIGN 横向将菜单以x居中
TPM_LEFTALIGN 横向将菜单以x左对齐

TPM_RIGHTALIGN 横向将菜单以x右对齐
鼠标按键属性(只在响应WM_CONTEXTMENU消息时有效):
TPM_LEFTBUTTON 连续按? 右键不会连续弹出菜单,鼠标右键不可用于选定菜单项
TPM_RIGHTBUTTON 连续按鼠标右键会连续弹出菜单,鼠标右键可用于选定菜单项
x,y均为屏幕坐标lpRect 菜单所占的区域。如果为NULL,当用户在菜单以外的区域按鼠标键时,菜单会消失
三、实例
1、当鼠标右键单击程序窗口的客户区时,程序会收到一条WM_CONTEXTMENU消息,此时是弹出菜单的最好时机
用ClassWizard中的“Add Windows Message Handler”功能添加对WM_CONTEXT消息的响应函数,函数中代码如下:
void CMyDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menu; //定义CMenu类对象
menu.LoadMenu(IDC_POPMENU); //装入刚建立的菜单IDC_POPMENU menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,pWnd);
/*GetSubMenu(0)得到IDC_POPMENU的第一层子菜单,TrackPopupMenu将菜单弹出到(x,y)处。由于设置为TPM_LEFTALIGN,所以菜单以(x,y)为左上角。*/
}
2、在其他时候弹出菜单也可以,比如,可以响应WM_LBUTTONDOWN消息。这样,在鼠标左键单击时也能弹出菜单
用ClassWizard中的“Add Windows Message Handler”功能添加对WM_LBUTTONDOWN消息的响应函数,函数中代码如下:
void CMfc5Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CMenu menu; //定义CMenu类对象 menu.LoadMenu(IDC_POPMENU); //装入刚建立的菜单 IDC_POPMENU ClientToScreen(&point); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
/*GetSubMenu(0)得到IDC_POPMENU的第一层子菜单,TrackPopupMenu将菜单弹出到(x,y)处。由于设置为TPM_LEFTALIGN,所以菜单以(x,y)为左上角。*/
ScreenToClient(&point);
CDialog::OnLButtonDown(nFlags, point);
}
注意:在WM_LBUTTONDOWN消息中得到的point对象所存的坐标是相对于窗口客户区的,而TrackPopupMenu中的x,y需要是 相对于屏幕的,所以需用ClientToScreen函数进行转换,但此消息响应函数要调用CDialog::OnLButtonDown (nFlags, point),故应该用ScreenToClient函数将point所存的坐标还原为相对于窗口客户区的。

LoadMenu使用方法相关推荐

  1. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  2. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  3. 在(CListView)列表视图中添加右键菜单的方法

    使用弹出式菜单(PopMenu) 弹 出式菜单(PopMenu)大家都熟悉,在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单.通常情况下,弹出式菜单在鼠标右键单击时弹出,当 然,也可以根据需要 ...

  4. CMenu类的使用方法

    CMenu类从CObject类派生而来.为什么要使用CMenu类呢?AppWzard不是把菜单做好了吗?在资源编辑器上修改菜单不是很方便吗?我是个vc++初学者,自从当斑竹以来,天天看贴子,也学到了不 ...

  5. CListCtrl 使用方法总结

    CListCtrl 使用方法总结 分类: MFC 2011-03-07 13:47 13人阅读 评论(0) 收藏 举报 转自:http://blog.csdn.net/lixiaosan/archiv ...

  6. CListCtrl使用方法

    1.设置列表风格 //设置列表风格 LONG styles; styles = GetWindowLong(m_list.m_hWnd,GWL_STYLE); styles &= ~LVS_T ...

  7. 给对话框添加菜单 工具栏 状态栏简易方法

    先建立一个基于Dialog 的程序,我给他起了个名字叫:DlgMenuToolbar. 一.如何往基于Dialog的程序添加菜单 [1.1] 先添加菜单(IDR_MENU1)资源,并加上需要的菜单项. ...

  8. vc++常用函数方法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 一.打开 ...

  9. CListCtrl控件使用方法总结

    原文地址:https://www.cnblogs.com/sura/archive/2012/05/15/2501132.html 列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可 ...

最新文章

  1. 当我说要做大数据工程师时他们都笑我,直到三个月后……转
  2. 中石油训练赛 - Incremental Induction(贪心)
  3. android 那几种动画,Android 动画实现几种方案
  4. QueryPerformanceFrequency 和 QueryPerformanceCounter用法
  5. mysql使用cmd命令连接_通过cmd命令连接mysql
  6. php跨域有那些方法,PHP跨域访问的3种方法
  7. Jetpack 新成员 AndroidX App Startup 实践以及原理分析
  8. 粘贴时word左下角出现“正在与服务器联系以获取信息,按ESC取消”
  9. TiDB聚簇表和非聚簇表
  10. MybatisPlus:使用SQL保留字(关键字)
  11. python+selenium之悠悠博客学习笔记
  12. 数据库触发器实例讲解
  13. 高并发系统设计二十六(配置中心)
  14. 2022中国MarTech领域最具商业合作价值企业盘点
  15. JS数组中SORT方法使用详解
  16. Android 图文混排 异步加载图片
  17. 搭建简单的struts2框架
  18. C++实现单源最短路算法
  19. 使用 PHP 实现简单的图片上传
  20. FZU:I. Fire Game

热门文章

  1. 无法启动此程序,因为计算机中丢失msvcrtd.dll,Win7打开剑灵提示“丢失d3dx10_43.dll、MSVCRTD.dll文件”怎么办?...
  2. linux raid和mdadm,linux的raid和mdadm
  3. 当前记录集不支持更新_微信现已正式支持修改微信号!微信7.0.16内测版更新(附下载)...
  4. Struts2的自动装配
  5. python多线程和多进程使用
  6. ArcMap上发布地图服务前,“将图形转为要素的选项”时报“输出名称无效”错误...
  7. windows下自制动画层引擎 - 放两个demo
  8. MySQL DBA面试全揭秘
  9. AngularJS深入(1)——加载启动
  10. StandardContext