菜单
菜单为用户和Windows应用程序之间的交互提供了主要方法,将应用程序的功能有效地的组织分类,便于用户快速访问。
一、菜单的5个部分组成:
菜单栏、菜单(就是单击菜单栏上菜单标题时出现的命令列表)、
菜单项(包括 命令、分隔条和子菜单标题)、子菜单、分隔条
菜单就是一和资源 。
二、菜单消息
WM_COMMAND 和 UPDATE_COMMAND_UI
i::::消息的分类 :
1)标准消息
除WM_COMMAND之外,所有以WM_开头的消息都是,
从CWnd派生的类,都可以接收到这类消息。
2)命令消息
来自菜单、加速键或工具栏按钮的消息。以WM_COMMAND形式呈现,
它有标识(ID)来区分,在SDK中,通过参数wParam参数来识别。
3)通告消息
由控件产生的消息,以WM_COMMAND呈现
从CCmdTarget派生的类,都 可以接收到这类消息。
注:CWnd是CCmdTarget 的派生类
从上可看出WM_COMMAND为菜单命令消息,需要注意的是:
我们可以新建一个单文档类型 的工程,菜单类的命令响应可以在
CMainFrame,CMenuApp,CMenuDoc,CMenuView 都 可以添加
但是响应顺序不同:View ->Doc ->Frame->App
其中App和Doc它们可以接收命令消息 ,但不可以接收标准消息。
II:::::命令更新机制
菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消息,谁捕获
CN_UPDATE_COMMAND_UI消息,MFC就在其中创建一个CCmdUI对象。
我们可以通过手工或利用ClassWizard在消息映射中添加ON_UPDATE_COMMAND_UI
这个宏来捕获 CN_UPDATE_COMMAND_UI消息 。
而在后台所做的工作是,当要显示菜单时,操作系统发出WM_INITMENU_UPOPUP消息,然后由MFC
的基类发CFrameWnd接管。它创建一个CCmdUI对象,并与第一个菜单项相关联,调用对象的一个
成员函数DoUpdate()。这个函数发出CN_UPDATE_COMMAND_UI消息,这休消息带有指向CCmdUI对象
的指针。同不念旧恶CCmdUI对象就设置为第二个菜单项相关联。这样顺序进行,直到完成所有菜单项。(菜单项的更新为依次更新)
更新命令UI程序仅应用于弹出式菜单项上,不能应用于永久显示的顶级菜单项目上。