按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
ON_MAND(ID_FILE_OPEN; CWinApp::OnFileOpen)
// Standard print setup mand
ON_MAND(ID_FILE_PRINT_SETUP; CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
MFC AppWizard 生成的应用程都已经自动包含消息映射的代码,但用户也可以在源程序
中手动添加。同时 Visual C++另一个强大的工具 ClassWizard 也提供了处理消息映射表的自动
化机制。当然,ClassWizard 只能够生成类和消息处理的框架,包括创建消息处理函数的声明,
而具体的实现代码还需要用户去补充。
在类中,消息处理函数都是类的成员函数 。当程序要对一个消息进行响应时,消息映射
机制就会自动调用该函数。用 ClassWizard 添加消息处理函数时,会自动添加以下 3 部分内
容:
o 在类的定义中添加该消息处理成员函数的函数声明;
o 在类的消息映射表中加入相应的消息映射表项;
o 在类的实现中加入该消息处理成员函数的函数实现。
注意 ClassWizard 添加的函数实现中,只是一个不能完成任何操作的空函数框架,还需
要加入具体的实现代码。但当用户手动添加消息处理函数时,也必须添加上述 3 部分内容。
对于标准 Windows 消息,在 CWnd 类中已经预定义了默认的处理函数,有确定的函数名,
一般以 On 开头,以消息名为函数名的后半部分,例如 WM_PAINT 消息的处理函数为
OnPaint(),WM_CREATE 消息处理函数是 OnCreate() 。这些预定义的消息处理函数根据消息
的不同有不同的参数和返回值。
对于控件通知消息和命令消息,一般没有默认的消息处理函数,可以由用户自定义。MFC
建议这类函数命名应遵循一些约定,一般以 On 开头,函数名中应包含该消息的简要说明,
ClassWizard 在创建这类消息处理函数时会提供一个建议的函数名,一般无需
方便阅读代码。
修改。例如 OnFileOpen()函数表明处理命令标识符 ID_FILE_OPEN 的命令消息。
本章和以后的章节都将主要利用 ClassWizard 为程序添加消息处理函数。因此下面简要
介绍一下 ClassWizard 对话框,如图 3…1 所示。在 IDE 主菜单栏中选择“View|ClassWizard ”
菜单命令,或者在开发环境的界面中直接按快捷键 Ctrl+W,即可打开“MFC ClassWizard ”
对话框。选择“Message Maps ”的选项卡,即可进行编辑消息映射的设置。
·44 ·
…………………………………………………………Page 54……………………………………………………………
第 3 章 菜单与加速键
图 3…1 消息映射选项卡
ClassWizard 对话框的“Message Maps ”(消息映射)选项卡中的各项功能介绍如下:
o Project (工程)下拉列表框:用于选择需要编辑的工程名称。
o Class name (类名)下拉列表框:用于选择需要编辑消息映射的类的名称。选择好类
后,在该下拉列表框 和“Project ”下拉列表框的下一行将显示所选类的头文件和源文
件路径。
o Object IDs (对象ID )列表框:以列表形式显示可以产生消息的对象的 ID,包括菜单
项、按钮等的 ID 。该列表框的第一项总是显示所选择的类。
o Messages (消息)列表框:列举在“Object IDs ”列表框中选定的对象所能产生的各种
消息。
o Member functions (成员函数)列表框:以列表形式显示选定的类中的成员函数。该列
表框中只列出与消息处理函数以及 MFC 中与消息处理有关的虚函数。前者标记为
“W ”,并在函数名后显示对应的消息映射宏;后者标记为“V ”。
o Add Class (添加类)按钮:单击该按钮,添加新的类到工程中。该按钮在“MFC
ClassWizard ”对话框中的所有选项卡中都存在。
o Add Function (添加函数)按钮:单击该按钮添加选定消息的新的消息处理函数,包
括在消息映射定义中添加对应的宏指令,在选定的类中添加该消息处理函数的声明和
完成基本功能的代码实现。如果选定的消息已经有消息处理函数,则该按钮无效。对
于对象产生的消息,单击该按钮将弹出如图 3…2 所示的对话框,要求用户输入消息处
理函数的名称,在“Member function name ”(成员函数名称)输入框中输入函数名,
确定后 ClassWizard 就会自动添加该消息处理函数。对于由该选定的类产生的消息,
MFC 已经定义好了消息处理函数名称,单击“Add Function ”按钮将直接添加该消息
处理函数,不会提示用户输入自定义的函数名。注意,只有单击“MFC ClassWizard ”
的“OK ”按钮或者“Edit Code ”按钮退出“MFC ClassWizard ”对话框后,ClassWizard
才会真正修改源文件。
·45 ·
…………………………………………………………Page 55……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
图 3…2 添加消息处理函数的对话框
o Delete Function (删除函数)按钮:单击该按钮删除选定消息的消息处理函数,包括函
数的声明和定义该消息映射的宏语句。如果选定的消息没有消息处理函数,则该按钮
无效。注意,当该函数已经存在于源文件中时,单击该按钮会提示如图 3…3 所示的对
话框,告诉用户 ClassWizard 只能删除该函数的声明和定义该消息映射的宏语句,而
无法删除该函数的实现代码,用户需要手动删除。
图 3…3 提示用户手动删除消息处理函数的对话框
o Edit Code (编辑代码)按钮:单击该按钮退出“MFC ClassWizard ”对话框,同时 IDE
的代码编辑窗口直接转到选定消息的处理函数进行编辑。该按钮也使得在“MFC
ClassWizard ”中所做的更改生效。如果选定的消息没有消息处理函数,则该按钮无效。
o OK (确定)按钮:单击该按钮使得在“MFC ClassWizard ”中的编辑生效,并退出“MFC
ClassWizard ”对话框。
o Cancel (取消)按钮:单击该按钮取消所有“MFC ClassWizard ”对话框中的设置,并
退出“MFC ClassWizard ”对话框。
3。1。3 消息处理过程
在 Windows 程序设计中,消息的处理是通过消息循环进行接收与分发的。MFC 运用消
息映射机制封装了这一处理过程。下面介绍 MFC 中消息的处理过程。
1.标准 Windows 消息和控件通知消息
标准 Windows 消息和控件通知消息的处理过程比较简单。这类消息必须由 CWnd 或其派
生类的对象处理,消息传递到封装对应的窗口或子窗口的类的对象中。也就是说,当关闭程
序的时候,会产生一个 WM_CLOSE 消息并通知主框架类,主框架类调用相应的处理函数进
行程序关闭前的清理操作,如保存文件和数据等。
2 .命令消息
命令消息与其他两个类型的消息不同,它可以由应用程序其他类的对象(例如应用类对
象、文档对象和文档模板对象)处理。这就涉及一个消息传递路径的问题,具体来说就是允
·46 ·
…………………………………………