提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|使用教程|编辑:鲍佳佳|2021-05-08 10:28:03.007|阅读 532 次
概述:在上一节中讲的是VS2010的菜单资源,本节主要讲菜单及CMenu类的使用。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
在上一节中讲的是VS2010的菜单资源,本节主要讲菜单及CMenu类的使用。
在内容开始前为大家介绍一款MFC界面开发控件:
Xtreme Toolkit Pro:是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
CMenu类的主要成员函数
MFC为菜单的操作提供了CMenu类,下面就常用的几个成员函数进行简单的介绍。
BOOL LoadMenu(UINT nIDResource);
加载菜单资源,并将其附加到CMenu对象上。参数nIDResource指定了要加载的菜单资源的ID。如果菜单加载成功则返回TRUE,否则返回FALSE。
BOOL DeleteMenu(UINT nPosition,UINT nFlags);
在菜单中删除一个菜单项。参数nPosition指定要删除的菜单项。参数nFlags就用来解释nPosition的意义,为MF_BYCOMMAND时说明nPosition表示菜单项的ID,为MF_BYPOSITION时说明nPosition表示菜单项的位置,第一个菜单项的位置为0。如果删除菜单项成功则返回TRUE,否则返回FALSE。
BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = 0);
用来在指定位置显示一个浮动的弹出式菜单。参数nFlags指定屏幕坐标和鼠标位置的标志,可以是以下取值:
TPM_CENTERALIGN:菜单在水平方向上相对于参数x指定的坐标值居中显示
TPM_LEFTALIGN:菜单的左侧与参数x指定的坐标值对齐
TPM_RIGHTALIGN:菜单的右侧与参数x指定的坐标值对齐
TPM_BOTTOMALIGN:菜单的底部与参数y指定的坐标值对齐
TPM_TOPALIGN:菜单项的顶部与参数y指定的坐标值对齐
TPM_VCENTERALIGN:菜单在垂直方向上相对于参数y指定的坐标值居中显示
这里先介绍这几个比较常用的,其他可参见MSDN。参数x指定弹出式菜单的水平方向的屏幕坐标,参数y指定菜单顶部垂直方向上的屏幕坐标,参数pWnd指明哪个窗口拥有此弹出式菜单,不能为NULL,参数lpRect忽略。
UINT CheckMenuItem(UINT nIDCheckItem,UINT nCheck);
在弹出菜单中为菜单项增加选中标记或移除选中标记。参数nIDCheckItem指定要选中或取消选中的菜单项。参数nCheck指定菜单项的选中状态和如何根据nIDCheckItem确定菜单项的位置,可以是MF_CHECKED或MF_UNCHECKED与MF_BYPOSITION或MF_BYCOMMAND的组合,这几个标志的含义如下:
MF_BYCOMMAND:为默认值。说明参数nIDCheckItem表示菜单项的ID
MF_BYPOSITION:说明参数nIDCheckItem表示菜单项的位置,第一个菜单项的位置是0
MF_CHECKED:为菜单项添加选中标记
MF_UNCHECKED:为菜单项移除选中标记
该函数返回菜单项之前的状态:MF_CHECKED或MF_UNCHECKED, 如果菜单项不存在则返回0xFFFFFFFF。
UINT EnableMenuItem(UINT nIDEnableItem,UINT nEnable);
激活、禁用菜单项或使其变灰。参数nIDEnableItem指定要激活、禁用或变灰的菜单项。参数nEnable指定操作的类型,可以是MF_DISABLED、MF_ENABLED或MF_GRAYED与MF_BYCOMMAND或MF_BYPOSITION的组合,这些值的含义如下:
MF_BYCOMMAND:同CheckMenuItem
MF_BYPOSITION:同CheckMenuItem
MF_DISABLED:禁用菜单项,使其不能被选择但不变灰
MF_ENABLED:激活菜单项,使其能够被选择并由变灰状态恢复
MF_GRAYED:禁用菜单项,使其不能被选择并变灰
该函数返回菜单项之前的状态:MF_DISABLED、MF_ENABLED或MF_GRAYED
CMenu* GetSubMenu(int nPos) const;
获取弹出菜单的CMenu对象。参数nPos指定弹出菜单在菜单中的位置,不能使用ID。返回值是CMenu对象的指针,该CMenu对象的m_hMenu成员为由nPos指定的弹出菜单的句柄,如果不存在这样的CMenu对象则返回NULL,然后创建一个临时弹出菜单。
CMenu类的成员函数先讲这些,如果大家需要用其他的函数可以到MSDN中查看,解释的很清楚。
菜单消息
菜单主要能发送两种消息:COMMAND消息和UPDATE_COMMAND_UI消息。下面分别讲解:
COMMAND消息:在菜单项被点击时发送该消息。
UPDATE_COMMAND_UI消息:用来维护菜单项的各项状态,包括激活、禁用、变灰、选中、未选中等。在下拉菜单每次打开的时候,所有菜单项的此消息都会被发送出去。如果所属类中为菜单项的该消息添加了处理函数,则执行相应函数更新菜单状态,如果菜单项没有此消息处理函数,也没有COMMAND消息的处理函数,那么它就会变灰。
菜单的应用实例
鸡啄米先讲一下本实例要实现的功能,此实例是在上一节创建的单文档工程Example34的基础上完成的,上一节中为主菜单栏添加了“Tools”菜单项,并设置它的第一个子菜单项为“Draw”,另外我们还要为主菜单栏添加“Settings”项,然后为其添加一个子菜单项“Draw Enable”,我们通过“Draw Enable”菜单项的选中状态控制菜单项“Draw”的激活状态,如果“Draw Enable”菜单项选中,则“Draw”菜单项激活,点击它弹出一个MessageBox,否则“Draw”菜单项禁用。程序中已经在Example34View类中自动生成了OnRButtonUp(UINT /* nFlags */, CPoint point)函数,并在其中实现了弹出右键菜单的功能,这里鸡啄米用CMenu类的TrackPopupMenu成员函数重新做一遍。
注意:Example34的CMainFrame类中定义的菜单并没有使用常用的CMenu类,而是用的CMFCMenuBar类(自VS2008起提供),但菜单的消息处理函数的添加是相同的。
下面是具体步骤:
1. 打开Example34工程的IDR_MAINFRAME菜单资源,在“Help”菜单项前通过“Insert New”操作插入一个菜单项,Caption设为“Settings”,在新菜单项的子菜单中再添加一个菜单项,Caption设为“Draw Enable”,ID默认为ID_SETTINGS_DRAWENABLE。
2. 因为此菜单为CMainFrame所拥有,所以我们在CMainFrame类中对菜单进行操作。在“MainFrm.h”中为CMainFrame类添加成员变量bool m_bDraw,以标识当前是否可以点击Tools->Draw菜单项,并在CMainFrame类的构造函数中为m_bDraw初始化:m_bDraw = TRUE。
3. 为菜单项Tools->Draw的COMMAND消息和UPDATE_COMMAND_UI消息分别添加处理函数CMainFrame::OnToolsDraw()和OnUpdateToolsDraw(CCmdUI *pCmdUI),这里要注意,添加处理函数时class list中应选择CMainFrame,修改两个函数的实现为:
C++代码
void CMainFrame::OnToolsDraw() { // TODO: Add your command handler code here // 弹出提示框 MessageBox(_T("Draw")); } void CMainFrame::OnUpdateToolsDraw(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here // 根据m_bDraw的值设置是否激活 pCmdUI->Enable(m_bDraw); }
4. 为菜单项Settings->Draw Enable的COMMAND消息和UPDATE_COMMAND_UI消息分别添加处理函数CMainFrame::OnSettingsDrawenable()和OnUpdateSettingsDrawenable(CCmdUI *pCmdUI),并将它们的实现修改为:
C++代码
void CMainFrame::OnSettingsDrawenable() { // TODO: Add your command handler code here // 绘图使能标识取反 m_bDraw = !m_bDraw; } void CMainFrame::OnUpdateSettingsDrawenable(CCmdUI *pCmdUI) { // TODO: Add your command update UI handler code here // 根据m_bDraw的值设置是否选中 pCmdUI->SetCheck(m_bDraw); }
5. 运行程序,效果图如下:
6. 接下来我们要重新实现右键菜单。大家以后可以仿照VS2010自动生成的代码实现右键菜单,也可以用鸡啄米下面讲到的方法。首先将CExample34View::OnRButtonUp(UINT /* nFlags */, CPoint point)函数内的代码都注释掉,保证原来的弹出方法失效。
7. 自动生成代码是在鼠标弹起时实现的右键菜单,我们这里改为在鼠标按下时就弹出右键菜单。在class view类视图中点击CExample34View,然后在属性页的messages列表中找到WM_RBUTTONDOWN,添加其消息响应函数CExample34View::OnRButtonDown(UINT nFlags,CPoint point),修改其实现为:
8. 最终的右键菜单效果:
本节内容不少,大家可以慢慢消化。菜单的讲解就到这里了。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢