Windows应用程序与MS-DOS程序一个很大的不同点就在于其驱动方式:MD-DOS程序使用顺序执行的模式,如果要取得用户的输入,则需要用巨大的循环来不断地检测键盘或鼠标,或其他的输入设备;在Windows应用程序中,系统用消息来向应用程序传递信息,程序本身不需要去检测输入设备的动作,只要对系统传递过来的消息给予正确的处理就行了。
传统的Windows应用程序和MFC应用程序也还有一些不同:在传统的Windows应用程序中,使用一个巨大的switch语句来接收和处理消息;在MFC应用程序中,使用消息映射将特定的消息映射到相应的类的成员函数进行处理。
MFC的消息映射机制使得大部分的C++对象都可以处理消息,如应用程序框架、文档、视图等都可以接收和处理系统传递过来的消息。用户可以对一条消息或一系列消息、菜单命令、控件动作等进行消息映射。消息映射也提供了更新用户界面对象的途径,如菜单命令或工具条按钮的激活与取消,使得用户界面对象的状态与当前的内容相一致。
在MFC应用程序中,菜单命令、工具条按钮和加速键被称为“用户界面对象”,菜单命令提供了应用程序的全部或绝大部分的功能,而工具条按钮和加速键则提供了快速选择菜单命令的方法。因此,处理菜单命令和更新用户界面对象的状态是应用程序的基本任务。MFC提供了CMenu类使得用户可以方便地使用和管理应用程序的菜单,同时还提供了菜单编辑器、工具条编辑器和加速键编辑器(都是资源编辑器的组件),使得用户可以“可视”方式来编辑程序的用户界面对象。
所有的Windows应用程序都是使用“消息驱动”机制。对所有的事件,如鼠标按钮被按下、键盘被敲击或窗口被移动等,Windows系统都向相应的窗口发送消息通知事件的发生。MFC框架应用程序与其他任何Windows程序一样,也使用消息驱动机制,但是MFC框架提供了一些方法,使得消息的处理更容易。
消息可以细分为三类:
(1)Windows消息:主要包括以WM_开头的消息,但WM_COMMAND除外。Windows消息由窗口类或视图类进行处理。比如,如果用户改变了窗口的大小,则系统向应用程序发送WM_SIZE消息。
(2)控件通知消息:包括从控件或其他子窗口发送给其父窗口的WM_COMMAND消息。比如说,如果用户改变了文本框控件中的文本,该控件将向其父窗口发送包含着EN_CHANGE控件通知的WM_COMMAND消息。框架对控件通知消息的分配与其他以WM_开头的Windows消息一样,但BN_CLICKED是个例外,该控件通知消息的分配与下述命令消息一样。