大家好,欢迎来到IT知识分享网。
菜单相关编程,MFC中MENU简单了解
——————————–
菜单是用户和应用程序交互的一种途径。
POP-UP类型的菜单称为 弹出式菜单,vc默认顶层菜单为弹出式菜单。这种菜单不能响应命令。顶层菜单并不是只能由弹出式菜单组成,将顶层菜单的POPUP选项驱动,就变成了一个菜单项 可以响应命令。
响应菜单项命令的顺序依次是:视类(view) 文档类(doc) 框架类(mainframe) 应用程序类(全局对象theapp)
windows消息的分类
1-标准消息
除WM_COMMAND之外,所以以WM_开头的消息都是标准消息。从CWnd派生的类,都可以接受到这类消息、
2-命令消息
来自菜单、加速键或者工具栏按钮的消息。这类消息都以WM_COMMAND形式呈现。在MFC中,通过菜单项的标示(ID)来区分不同的命令消息。在SDK中,通过消息的wParam参数识别(wParam的低字节序存储了消息的ID)。从CCmdTarget派生的类,都可以接受这类消息。
3-通过消息
由控件产生的消息,例如按钮的单击、列表框的选择都会产生这类消息。目的是为了向其父窗口通知事件的发生。这类消息也是以WM_COMMAND形式呈现。从CCmdTarget派生的类,都可以接受这类消息。
通过MSDN的MFC类层次结构图,发现CWnd实际上是派生与CCmdTarget类。也就是说,凡是CWnd派生的类,他们既可以接受标准消息也可以接受命令消息和通告消息。对于从CCmdTarget派生的类,则只能接受命令消息和通告消息,不能接受标准消息。
===================
菜单命令的路由
MFC在项目的三个地方增加了与菜单命令消息响应函数相关的信息,
1在view类头文件中,在两个AFX_MSG注视宏之间添加了命令消息响应函数原型。
2在view类的源文件中,增加2处信息、 一处在两个AFX_MSG_MAP注释宏之间添加了ON_COMMAND宏,将菜单ID号和命令响应函数关联起来。
另一处在源文件中增加了命令响应函数的实现代码。
WindowProc函数是CWnd类的一个成员函数。
====================
菜单基本操作
菜单结构 、需要分清 子菜单和菜单项的概念。
一个包含多个菜单项的popup菜单叫做子菜单
具体的某个单项即菜单项
菜单项的访问可以通过2种方式,菜单项的标示OR位置索引。对于子菜单,只能通过索引号来进行访问,因为子菜单是没有标识号的。
===========
GetMenu 获取程序的菜单栏的指针
GetSubMenu 获取子菜单的指针
GetMenu是CWnd类的成员函数,而GetSubMenu函数是CMenu的成员函数。
CheckMenuItem 函数为菜单项添加标记。
SetDefaultItem 函数设置默认菜单项。
另外子菜单中的分隔栏是占据索引位置的。
一个菜单也只能有一个默认菜单项
SetMenuItemBitmaps函数实现菜单项前面带有图形的功能。
EnableMenuItem函数设置菜单项的状态:能够使用,禁用、或者变灰显示。
SetMenu函数实现移除和装载菜单。
Detach函数完成将菜单句柄与菜单对象分离的功能。(如果在设置的时候,定义了局部菜单对象,则一定要在调用SetMenu设置菜单之后,立即调用。)
=================================================
MFC菜单命令更新机制
(这里是转载的文章)
对于每一个菜单项,有两个响应函数UPDATE_COMMAND_UI 和COMMAND :
UPDATE_COMMAND_UI COMMAND
处理菜单对应的用户界面 处理该菜单对应的功能
要改变菜单命令项的状态,可以调用EnableMenuItem或是CheckMenuItem函数。但是这使得程序杂乱无章,因为没有一个固定的 位置和固定的原则来处理菜单项状态。MFC提供一种直觉并且仍旧依赖消息观念的方式,解决这个问题,这就是UPDATE_COMMAND_UI消息。其设 计理念是,每当菜单被拉开并尚未显示之前,其菜单项(以及对应之工具栏按钮)都会收到UPDATE_COMMAND_UI消息,这个消息和 WM_COMMAND有同样的路由,我们(程序员)只要在适当的类别放置其处理函数,并在函数中做某些判断,便可决定如何显示菜单项。
具体更新机制如下:
当我们选择编辑菜单(一个下拉菜单,假设包括复制,剪切,粘贴三个菜单项)的时候,在编辑菜单被展开但是并没有显示的时候,操作系统会发出 WM_INITMENUPOPUP消息,然后由程序窗口的基类如CFrameWnd接管。它会创建一个CCmdUI对象,并与程序的一第个菜单项(复制) 关联,调用该对象的一个成员函数DoUpdate()。这个函数发出CN_UPDATE_COMMAND_UI消息,这条消息带有一个指向CCmdUI对 象的指针。这是,系统会判断是否存在一个ON_UPDATE_COMMAND_UI宏去捕捉这个菜单项的消息。如果找到这样一个宏,就调用相应的消息响应 函数进行处理,在这个函数中,可以利用传递过来的CCmdUI对象去调用响应的函数,使该菜单可以使用,或者禁用该菜单项。当更新完第一个菜单项后,同一 个CCmdUI对象就设置为与第二个菜单项(剪切)想关联,依次完成所有的菜单项的处理。
如果要在程序中设置某个菜单项的状态,首先通过ClassWiiard为这个菜单项添加UPDATE_COMMAND_UI消息响应函数,然后在这个函数中进行状态设置即可。
=============
AppendMenu函数实现了将一个新的菜单项目添加到一个指定菜单项目的末尾。
InsertMenu实现了再两个子菜单或者菜单项之间插入一个新的菜单项。
DeleteMenu可以删除一个菜单项目或者子菜单以及子菜单下的菜单项,主要取决于调用这个函数的对象。如果该对象是程序的菜单栏对象,那么删除的就是指定的子菜单;如果该对象是一个子菜单对象,那么删除的就是子菜单下的菜单项。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/29408.html