菜单的工作原理及编写应用
今天赶了2场酒,累死了,但还是坚持看完了第6课,写了点笔记,大家鼓励鼓励嘛,不要看看就走了
1、菜单如果选择了pop-up属性,是不能响应命令的
菜单idm_test--框假类cmainframe--消息command--响应函数OnTest()
|
其实可以为不同的类定制这样的消息响应,响应顺序为:view-doc-mainframe-app
2、消息的分类
? 标准消息
除WM_COMMAND之外,所有以WM_开头的消息。
从CWnd派生的类,都可以接收到这类消息。
? 命令消息
来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
从CCmdTarget派生的类,都可以接收到这类消息。
? 通告消息
由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。
从CCmdTarget派生的类,都可以接收到这类消息。
CWnd : CCmdTarget : CObject
从CWnd派生的类,都可以接收到标准消息。
从CCmdTarget派生的类,都可以接收到命令消息。
于是从CWnd派生的类既可以接收标准消息,也可以接收命令消息。
而app类和doc类都是直接从CCmdTarget派生的
命令消息机制与标准消息类似,只是在.cpp文件中其消息宏有点不一样ON_COMMAND(IDM_TEST,OnTest)
3、命令消息的路由和标准消息不一样
AfxWndProc //mfc将窗口过程函数替换为此函数
|
AfxCallWndProc //
|
WindowProc //CWnd类成员函数
|
OnWndMsg //判断消息类型
___________|____________
| |
OnCommand OnNotify //命令消息(完成命令消息路由) , 通告消息
|__________ ___________|
|
OnCmdMsg
OnCommand路由过程:mainframe(无判断直接交)->view->doc->view->mainframe->app
4、标记菜单(有钩号)
菜单结构
3 300 301 302 303 304
2
1
0
0 1 2 3 4
5、CWnd::GetMenu
CMenu* GetMenu() const; //获取框架上菜单的指针
CMenu : CObject
CMenu::GetSubMenu
CMenu* GetSubMenu(int nPos)const; //获取子菜单的指针
CMenu::CheckMenuItem
UINT CheckMenuItem(UINT nIDCheckItem, UINT nCheck); //第一个参数的含义由第二个参数决定
菜单id MF_BYCOMMAND //按id访问
菜单索引号 MF_BYPOSITION //按索引访问