函数:
CWnd::Getmenu();CMenu* GetMenu() const;
用来获取指向菜单项对象的指针
CWnd::GetSubMenu();CMenu* GetSubMenu(int nPos) const;
用于获取由nPos参数指定的子菜单的指针
UINT CHeckMenuItem(UINT nIDCheckItem,UINT nCheck);
为菜单项添加标记或者移除菜单项的标记
BOOL SetDefaultItem(UINT uItem,BOOL fByPos = FALSE);
设置默认菜单项
BOOLSetMenuItemBitmap( UINT mPosition, UINT nFlags,const CBitmap* pBmpUnchecked ,const CBitmap* pBmpChecked );
设置图形标记菜单项
LoadBitmap
加载位图资源
int GetSystemMetrics(int nIndex);
用来获取相关系统信息
EnableMenuItem(UINT nIDEnableItem,UINT nEnable);
设置菜单项的状态:能够使用、禁用或者变灰显示
BOOL SetMenu(CMenu* pMenu);
移除或者装载菜单
CMenu::Detach()
将菜单句柄和菜单对象分离
知识点:
Windows消息的分类:
1、标准消息
除WM_COMMAND之外,所有以WM_开头的消息都是标准消息,从CWnd派生的类都可以接收这类消息;
2、命令消息
来自菜单,加速键或工具栏按钮的消息。这类消息都是以WM_COMMAND形式出现,在MFC中,通过菜单项的标识(ID)来区分不同的命令消息,在SDK中,通过消息的wParam参数识别。从CCmdTarget派生的类,都可以接收这类型消息。
3、通告消息
有由控件产生的消息,如按钮的单击、列表框的选择等都会产生这类消息,目的是为了向其父窗口(通常是对话框)通告事件的发生。这类消息也是以WM_COMMAND的形式出现的,从CCmdTarget派生的类,都可以接收这类消息。
而CWnd派生于CCmdTarget类,故从CWnd类派生的类可以接收三种消息,而从CCmdTarget派生的类只能接收后两种消息。
文档类(CDoc)和应用程序类(CApp)都派生于CCmdTarget类。
消息路由机制
点击菜单项,最先接收到菜单命令消息的是框架类,框架类把消息交给视类,视类根据命令消息映射机制查找自身是否对此消息响应,如果响应,则调用相应的响应函数进行处理,消息路由过程结束。如果对此消息不进行响应,则将消息交给文档类,文档类重复上述步骤,如果对消息响应,则调用相应的响应函数,消息路由过程结束。不响应则将消息交给视类,视类再交给框架类。框架类查看自己对这个命令消息是否响应,如果不响应,将消息交给应用程序类,由后者进行最后的处理。
菜单项和子菜单
菜单项相当于楼层,有索引号和标识号,子菜单相当于楼层的房间,只有索引号,没有标识号。
分隔栏在子菜单中占据索引位置
一个子菜单只能有一个默认菜单项
设置图形标记菜单
1、新建位图资源 2、在CMainFrame类的OnCreate类中添加图形标记菜单
菜单命令更新机制:
当要显示菜单时,操作系统发出WM_INITMENUPOPUP消息,然后由程序窗口的基类如CFrameWnd接管。此基类创建一个CCmdUI对象,并与程序的第一个菜单项关联,调用该对象的一个成员函数DoUpdate()。此函数发出CN_UPDATE_COMMAND_UI消息,这条消息带有一个指向CCmdUI对象的指针。此时,系统判断是否存在ON_UPDATE_COMMAND_UI宏去捕获这个菜单项消息,如果有,则调用相应的响应函数来处理,是菜单项可用或者禁用,更新完第一个菜单项之后,同一个CCmdUI对象就设置为与第二个菜单项关联,依次顺序进行,直至所有的菜单项处理完毕。