函数和菜单知识点(一)

函数:

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对象就设置为与第二个菜单项关联,依次顺序进行,直至所有的菜单项处理完毕。

你可能感兴趣的:(MFC读书笔记)