




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC MFC 菜单栏 CMenu 控件 2011 07 02 12 49 分类 C 菜单栏 在对话框窗口里显示菜单栏在对话框窗口里显示菜单栏 像工具栏一样 菜单栏在按件面板里没有对应的选项 但有一个菜单控件类 CMenu 所以 如果想要在对话框里显示菜单栏 就得像工具栏那样 到 ResourceView 选项卡里新建一 个菜单栏资源 步骤跟新建工具栏资源一样 只是资源类型是 Menu 菜单资源设计如下 图 如果想改菜单项文本内容的话 方法是右击要更改的菜单项 选择属性 接着会弹出这样 一个对话框 上面那个 ID 项就是该菜单项对应的 ID 号了 添加菜单项单击消息处理函数时会用到 而 标明项里的内容就是菜单项要显示的文本了 这里还得注意一下 弹出 这个选项 勾上这个选项表明对应的菜单项还有下级菜单 如 上面 转到 这个菜单项具有弹出属性 有下级菜单 设计好了菜单资源 接着我们就来在对话框显示菜单栏吧 方法是进入对话框编辑区 右 击对话框界面 选择属性 然后在菜单项里选择菜单资源 ID 号 回车 编译 运行 效果 如下图 当然还有第二种在对话框显示菜单的方法 调用 SetMenu 函数把菜单跟对话框关联起来 函数第一个参数是窗口句柄 第二个参数是菜单句柄 在 OnInitDialog 函数里添加如下语 句 CMenu menu 定义一个菜单类变量 menu LoadMenu IDR MENU1 装载 IDR MENU1 菜单资源 SetMenu 和当前窗口关联起来 menu Detach 分离 如果要处理菜单项单击消息的话 方法跟处理工具栏项单击消息一样 进入类向导 找到 对应的菜单项 ID 为它添加 COMMAND 消息处理函数 设置菜单左边显示位图和背景位图设置菜单左边显示位图和背景位图 CMenu 类里要了解的函数 SetMenuItemBitmaps 设置菜单项左边的位图 函数定义 BOOL SetMenuItemBitmaps UINT nPosition UINT nFlags const CBitmap pBmpUnchecked const CBitmap pBmpChecked nPostion 指明具体要设置的菜单项 可以是菜单项索引 菜单项 ID 具体由 nFlags 参数 指明 为 MF BYPOSITION 则以菜单项索引指明 为 MF BYCOMMAND 则第一个参数 nPosition 是菜单项 ID 号 pBmpUnchecked 未被检 测时显示的位图 正常时 pBmpChecked 检测时显示的图片 就是菜单项被打上勾时 所显示的图片 跟 CheckMenuItem 函数有关联 一个 API 函数 SetMenuInfo 这个函数可以设置菜单重绘时选择的填充画刷类型 该函数有 两个参数 第一个是要设置的菜单句柄 第二个是一个 MENUINFO 结构指针 我们只要 了解这结构里有一个成员 hbrBack 就行了 hbrBack 是一个画刷句柄 而菜单背景位图就 通过创建位图画刷来实现的 好了 以上面的工程为例 引入三张位图 ID 号默认不变 然后再引入一张位图 菜单背景 位图 ID IDB MENUBACK 接着在对话框类的 OnInitDialog 函数里添加如下语句 CMenu pMenu GetMenu 获取对话框关联菜单 CMenu pSubMenu pMenu GetSubMenu 0 获得子菜单 如果有 0 表示索引 对应 文件 菜单 for int i 0 iSetMenuItemBitmaps i MF BYPOSITION bmp Detach CBitmap bmp CBrush m BKBrush bmp LoadBitmap IDB MENUBACK m BKBrush CreatePatternBrush 创建位图画刷 MENUINFO mnInfo memset mnInfo cbSize sizeof MENUINFO mnInfo fMask MIM BACKGROUND mnInfo hbrBack m BKBrush SetMenuInfo pSubMenu m hMenu m BKBrush Detach 运行效果如下图 PS 不知道大家有没有碰到过这个问题 MENUINFO 结构未定义 解决的方法是进入文 件选项卡 FileView 在 Source File 文件下的 StdAfx cpp 文件里的最前面部分添加这个 语句 define WINVER 0 x0501 设计弹出式菜单设计弹出式菜单 CMenu 类里要了解的函数 TrackPopupMenu UINT nFlags int x int y CWnd pWnd LPCRECT lpRect NULL 该函数用于在界面显示菜单 nFlags 参数指明菜单显示标志 x y 用于确定菜单显示基于 的坐标点 pWnd 是菜单相关联的窗口 在 MFC 类库详解 中有关参数 nFlags 的解释如下 指定屏幕位置标志或鼠标键标志 屏幕位置标志可以为下列值之一 TPM CENTERALIGN使弹出菜单在水平方向相对于 x 指定的坐标居中 TPM LEFTALIGN 放置弹出菜单 以便弹出菜单在由坐标值 x 指定的位置 左对齐 TPM RIGHTALIGN 放置弹出菜单 以便弹出菜单在由坐标值 x 指定的位置 右对齐 鼠标键标志可以为下列值之一 TPM LEFTBUTTON 导致弹出菜单追踪鼠标左键 TPM RIGHTBUTTON导致弹出菜单追踪鼠标右键 以上面工程为例 给对话框添加鼠标右键抬起 WM RBUTTONUP 消息处理函数 在函 数里添加如下代码 void CSeventhDlg OnRButtonUp UINT nFlags CPoint point TODO Add your message handler code here and or call default CMenu Menu GetMenu ClientToScreen 将窗口坐标转换成屏幕坐标 Menu GetSubMenu 0 TrackPopupMenu TPM LEFTBUTTON TPM VERTICAL point x point y this Menu Detach CDialog OnRButtonUp nFlags point 要注意的是 要在界面显示的菜单 必须是一个弹出菜单 虽然 Menu TrackPopupMenu 也可以显示 但显然不是想要的结果 运行效果 动态 纯代码 创建一个菜单动态 纯代码 创建一个菜单 上面的例子 都是使用了菜单资源创建的菜单 这一次我们用代码来创建菜单 其实本质 跟前面的用控件类的 Create 函数创建一个控件一样 只不过这里的 Create 函数是 CreateMenu 和 CreatePopupMenu 函数 CMenu 类里要了解的函数 CreateMenu 创建一个主菜单 函数没有参数 CreatePopupMenu 创建一个具有弹出属性的菜单 函数没有参数 AppendMenu 往一个菜单里添加菜单项 或弹出式菜单 AppendMenu 函数定义如下 BOOL AppendMenu UINT nFlags UINT nIDNewItem 0 LPCTSTR lpszNewItem NULL nFlags 参数常用取值如下 MF STRING 表明添加的是一个不具有弹出属性的菜单项 MF POPUP 添加的一个弹出菜单项 MF SEPARATOR 添加的是一个菜单分隔条 MF OWNERDRAW 表明对应菜单具有自绘属性 nIDNewItem 参数 如果添加的是一个不具有弹出属性的菜单项 那么该值就是菜单项 ID 号 否则是弹出式菜单句柄 lpszNewItem 是菜单项名称 菜单文本内容 好了 接着我们来动态创建一个菜单 首先往对话框里添加一个按钮控件 当单击这个按 钮时 就创建菜单 响应这个按钮控件的单击消息 消息处理函数里添加如下代码 CMenu Menu Menu CreateMenu 创建一个主菜单 CMenu popMenu popMenu CreatePopupMenu 创建一个弹出式菜单 popMenu AppendMenu MF STRING 1001 新建 添加菜单项 popMenu AppendMenu MF STRING 1002 打开 popMenu AppendMenu MF STRING 1003 保存 Menu AppendMenu MF POPUP UINT popMenu m hMenu 文件 添加弹出菜单项 SetMenu 关联到窗口中 Menu Detach popMenu Detach 更改菜单项大小 宽高 设置菜单文本字体大小更改菜单项大小 宽高 设置菜单文本字体大小 由于 CMenu 类里并没有提供设置菜单项大小以及字体大小的函数 所以我们如果要实现 上述功能的话 只能采取自绘的方法 如果对 CMenu 类的某些函数不了解的话 可以参考 MFC 类大全 这里就不讲述了 首先从 CMenu 派生出一个子类 CNewMenu 类的类型为 Generic Class 然后往这个类添 加三个成员函数 MeasureItem 设置菜单宽高 DrawItem 自绘菜单 ChangeMenuItem 修改菜单项类型 三个函数分别定义如下 void CNewMenu MeasureItem LPMEASUREITEMSTRUCT lpMeasureItemStruct void CNewMenu DrawItem LPDRAWITEMSTRUCT lpDrawItemStruct void CNewMenu ChangeMenuItem CMenu pMenu 其中 MeasureItem 和 DrawItem 是 CMenu 类的虚函数 各函数的代码如下 void CNewMenu MeasureItem LPMEASUREITEMSTRUCT lpMeasureItemStruct lpMeasureItemStruct itemHeight 25 项高 lpMeasureItemStruct itemWidth 120 项宽 void CNewMenu DrawItem LPDRAWITEMSTRUCT lpDrawItemStruct CRect rect lpDrawItemStruct rcItem CDC dc dc Attach lpDrawItemStruct hDC dc FillSolidRect rect RGB 0 166 170 CFont Font Font CreatePointFont 125 宋体 创建字体 dc SelectObject CString pText CString lpDrawItemStruct itemData if lpDrawItemStruct itemState 菜单被选中 dc SetTextColor RGB 10 0 181 设置文本颜色 dc DrawText pText rect DT VCENTER DT LEFT DT SINGLELINE dc Detach void CNewMenu ChangeMenuItem CMenu pMenu int itemCount pMenu GetMenuItemCount for int i 0 iGetMenuItemID i 获取菜单项 ID 号 pMenu GetMenuString i pText MF BYPOSITION 获取菜单文本 ModifyMenu 函数最后一个参数对应 DRAWITEMSTRUCT 结构里的 itemData 变量 pMenu ModifyMenu i MF OWNERDRAW MF BYPOSITION MF STRING itemID LPSTR pTe xt if itemID 1 如果是一个弹出式菜单 ChangeMenuItem pMenu GetSubMenu i 必须让每个菜单项具有 MF OWNERDRAW 属性 不然接不到 WM MEASUREITEM 和 WM DRAWITEM 消息 而且菜单项不具有 MF OWNERDRAW 属性 即使接到消息 也无法自绘 所以上面的 ChangeMenuItem 函数就是用于修改菜单项属性 WM MEASUREITEM 和 WM DRAWITEM 消息不是直接发给菜单窗口的 会被父窗口给 收到 所以得处理父窗口的 WM MEASUREITEM 和 WM DRAWITEM 消息 给话框类添 加这两个消息处理函数 两个函数里的代码分别如下 void CFirstDlg OnMeasureItem int nIDCtl LPMEASUREITEMSTRUCT lpMeasureItemStruct TODO Add your message handler code here and or call default if lpMeasureItemStruct CtlType ODT MENU 如果类型是菜单 newMenu MeasureItem lpMeasureItemStruct 调用 CNewMenu 类的 MeasureItem 成员函数 else CDialog OnMeasureItem nIDCtl lpMeasureItemStruct void CFirstDlg On
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 融资担保终止书之债权债务清理协议
- 2025公务员选考面试题库及答案
- 法律考研专业试题及答案
- 测绘院专业考试题及答案
- 地矿专业测试题及答案解析
- 专业知识测试题及答案
- 小班下期期末汇报
- 区总工会工作总结
- 六上比的化简教学课件
- 时间文案励志工作总结
- 血液透析病人饮食管理
- 养老机构膳食服务基本规范
- 机械设计基础 第2章 机构的组成及自由度计算
- 雨季防汛防洪隐患排查制度
- 脚手架临时开口加固方案
- 华为公司考勤管理制度
- 《水利工程白蚁防治技术规程SLT 836-2024》知识培训
- 网络言论自我管理主题班会
- 中小学资助工作宣传与培训计划
- 2025年云南空港百事特商务有限公司招聘笔试参考题库含答案解析
- 向量的数量积说课
评论
0/150
提交评论