(3)命令消息:包括来自于用户界面对象的WM_COMMAND消息。框架对命令消息的分配与其他消息不太一样,命令消息可以被分配到更多的对象进行处理。
在MFC应用程序中,是看不见用来分配消息的switch语句的,实际上,该语句存在于CWinApp类的成员函数Run()中。但是对用户而言,并不需要在Run()函数里做工作,MFC提供了消息映射来进行处理。在MFC应用程序中,每个可以接收Windows消息或命令的框架类都拥有自己的“消息映射”。应用程序框架使用消息映射将消息或命令与相应的处理函数联系起来,从CCmdTarget类派生出来的所有类都可以拥有消息映射,这包括应用程序类、主框架窗口类、文档类和视图类等等。
可以处理Windows消息和控件通知消息的是窗口类:从CWnd 类派生。这包括CFrameWnd类、CMDIFrameWnd类、CMDIChildWnd类、CView类和CDialog类,或者是用户自己从上述类中派生出来的子类。命令消息可以被更多类型的对象处理,这包括文档类、文档模板类、应用程序类、窗口类和视图类等。从感觉上说,命令消息对哪个对象起了作用,就应该由该对象来处理该命令消息。
为了使用户对MFC应用程序的消息驱动机制有一初步的了解,便于更深入地介绍MFC的消息机制,先通过一个简单的例子程序介绍一下在MFC应用程序中是如何进行消息的映射的。
在Windows应用程序中,菜单的使用是很频繁的,处理来自菜单的命令消息是程序的一大任务,这里就先通过一个使用菜单命令的程序进行说明。
首先需要建立一个新的项目。在File菜单中选择New命令,在弹出的New对话框中选择Projects标签,选择程序类型为MFC AppWizard(exe),输入项目名为TestMsg,单击OK按钮进入项目设置:
(1)选择单文档界面,选中文档/视图结构支持,并选择英语为资源语言类型。
(2)不需支持任何数据库功能,选择None。
(3)不需支持任何复合文档,故选择None;不要选中Automation与ActiveX Controls选项。
(4)保持缺省选项。
(5)保持缺省选择。
(6)保持缺省状况,单击Finish完成项目设置。
用户可以试着编译并运行现在的程序以检查程序的基本功能。
下面的目标是向TestMsg程序中添加一个下拉菜单Message,并包括不同的菜单项,选择某个菜单命令将在程序窗口中输出相应的字符串表明选择了该命令。已经完成的程序的Message菜单如图3-1所示,请读者注意程序中已经下拉的Message菜单项。