【笔试/面试】MFC(六)—— 菜单
2016-04-16 20:29
246 查看
(1)菜单是属于框架窗口(CMainFrame)的
顺序如下:
View
Doc
MainFrame
App
除 WM_COMMAND 外,所以以WM_开头的消息。从CWnd 派生的类,都可以接收到这类消息。
(2)命令消息(OnCommand)
菜单项、加速键或工具栏上的按钮,这类消息都以 WM_COMMAND 呈现。在 MFC 中,通过菜单项的标识(ID)来区分不同的命令消息。
从 CCmdTarget 派生的类,都可接收到这类消息。
(3)通告消息(OnNotify)
由控件产生的消息,例如,按钮的单击,列表框的选择等均可产生此类消息,为的是像其父窗口(通常为对话框)通知事件的发生。这类消息也是以 CM_COMMAND 形式呈现。
从 CCmdTarget 派生的类,都可以接受到这类消息。
在 CMainFrame 类的 OnCreate 函数处:
(2)创建缺省菜单(粗体)
(3)屏蔽某一菜单项
这样设置之后,好像没什么卵用,此时需要在 CMainFrame 构造函数处,手动的添加
(4)移走菜单
(5)加载 Menu
对菜单消息的响应
MainFrame 类、App 类、Doc 类、View 类均可对菜单消息进行捕获和响应:顺序如下:
View
Doc
MainFrame
App
消息的分类
(1)标准消息除 WM_COMMAND 外,所以以WM_开头的消息。从CWnd 派生的类,都可以接收到这类消息。
(2)命令消息(OnCommand)
菜单项、加速键或工具栏上的按钮,这类消息都以 WM_COMMAND 呈现。在 MFC 中,通过菜单项的标识(ID)来区分不同的命令消息。
从 CCmdTarget 派生的类,都可接收到这类消息。
(3)通告消息(OnNotify)
由控件产生的消息,例如,按钮的单击,列表框的选择等均可产生此类消息,为的是像其父窗口(通常为对话框)通知事件的发生。这类消息也是以 CM_COMMAND 形式呈现。
从 CCmdTarget 派生的类,都可以接受到这类消息。
菜单编程
(1)创建标记菜单(左侧有对号)在 CMainFrame 类的 OnCreate 函数处:
GetMenu()->GetSubMenu(0)->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED); GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_CHECKED);
(2)创建缺省菜单(粗体)
GetMenu()->GetSubMenu()->SetDefaultItem(1, true); GetMenu()->GetSubMenu()->SetDefaultItem(ID\_FILE_OPEN, false);
(3)屏蔽某一菜单项
GetMenu()->GetSubMenu()->EnableMenuItem(ID_FILE_OPEN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
这样设置之后,好像没什么卵用,此时需要在 CMainFrame 构造函数处,手动的添加
m_bAutoMenuEnable = false;,对菜单项的屏蔽操作才会一如预期(这会涉及 MFC 独特的菜单更新机制)。m_bAutoMenuEnable 变量继承自 CFrameWnd。
(4)移走菜单
SetMenu(NULL);
(5)加载 Menu
SetMenu(NULL); CMenu menu; menu.LoadMenu(IDR_MAINFRAME); SetMenu(&menu); menu.Detach(); // 将句柄和 C++ 对象断开 // 因为是局部对象
相关文章推荐
- 一个大四求职菜鸟的web前端之路(终)
- 码农小汪-设计模式-模板方法
- 写了 35 年代码的老程序员的最大遗憾
- 码农小汪-设计模式-享元模式 FlyWeight
- 程序员的自我提升
- lintcode 之 最长公共子串
- 【笔试/面试】MFC(五)
- 码农小汪-设计模式之-命令模式
- 模拟面试感受之一
- 面试题87:玛瑙项链
- 剑指offer 面试题15: 链表中倒数第k个结点 题解
- 剑指 4000 offer-面试题45:圆圈中最后的数字
- 某公司面试block
- JAVA多线程和并发基础面试问答
- 腾讯2面
- leetcode之largest number
- 面试题目——String
- 人生第一面总结
- 轻松搞定面试中的链表题目
- 腾讯实习生面试