【摘要】:本节演示在MFC中,开发弹出对话框的过程和弹出对话框消息处理的过程。MFC的消息处理不是使用一个全局的回调函数,而是创建一个与窗口关联的派生类,用于消息关联的成员函数来接收和处理窗口的消息。在类向导中选择对应的消息,添加与该消息关联的成员函数来处理该消息,这就是MFC的消息映射机制。MFC的消息映射机制,一般不需要开发者解析这些复杂的数据,因为消息映射函
本章第4节演示了在Win32模式下以C语言方式开发的弹出对话框的过程以及消息处理的过程。本节演示在MFC中,开发弹出对话框的过程和弹出对话框消息处理的过程。
1)执行File→Open Workspace命令,新建工程,如图3-33所示。
2)在下拉列表中选择第3节建立的“MFC32”工程目录,再双击dsw文件打开工程,如图3-34所示。

图3-33 打开工程

图3-34 打开工作区文件
3)执行File→New命令,或者按快捷键<Ctrl+N>插入资源脚本文件,如图3-35所示。

图3-35 在工程中插入资源脚本
4)按快捷键<Ctrl+1>或<Ctrl+R>,在ResourceView中添加对话框资源,如图3-36所示。

图3-36 在资源视图中插入对话框资源
5)修改程序启动函数CMyApp::InitInstance的代码,启动时弹出刚添加的对话框。

6)编译代码,运行并查看结果,弹出了一个对话框,如图3-37所示。
在MFC工程中,如何实现WM_PAINT和WM_LBUTTONDOWN之类的消息处理?
7)执行View→ClassWizard命令,或按快捷键<Ctrl+W>打开类向导,如图3-38所示
“ClassWizard”菜单项,只有当在Resource View中插入了资源后才被激活)。

图3-37 查看运行结果

图3-38 通过主菜单打开类向导
8)初次使用ClassWizard要建立类向导管理文件(.clw),单击“是”按钮,如图3-39所示。
9)在选择资源文件对话框中直接单击“OK”按钮,就创建好了向导文件,如图3-40所示。
10)初次弹出类向导(MFC ClassWizard),“Class name”下拉列表可能是空的,如图3-41所示。

图3-39 打开类向导时的提示

图3-40 初次建立类向导文件(.clw)

图3-41 MFC类向导
11)在类向导中单击“Add Class…”按钮,在弹出的菜单中选择“New”命令,如图3-42所示。
12)在“New Class”对话框的“Name”文本框中,输入类名“CMyDlg”,如图3-43所示。
在“Base class”下拉列表中选择基类名称“Cdialog”,最后单击“OK”按钮完成“CMyDlg”类的创建。其中,类名第一个大写字母以“C”开头代表class,如果结尾是“Dlg”则代表dialog对话框类。
13)在“Class name”中显示新创建的CDialog类“CMyDlg”,如图3-44所示。
在左边“Object IDs”列表框中选中对话框类名,在“Messages”列表框中列出了所有与对话框相关的消息。
14)单击“OK”按钮,在类视图中显示通过类向导创建的“CMyDlg”类,如图3-45所示。

图3-42 新建一个MFC派生类
(www.chuimin.cn)
图3-43 新建CDialog派生类

图3-44 类向导中的消息映射管理

图3-45 通过类向导创建CDialog派生类
15)再次修改MFC32.cpp中的启动程序代码。

16)按<F7>键编译。
如果出现错误提示“fatal error C1083:Cannot open include file:'mfc32.h'…”,则按<F4>键显示错误所在位置,在MyDlg.cpp中删除这行代码即可。
#include"stdafx.h"
//#include"mfc32.h"
#include"MyDlg.h"
…
17)再按<F7>键编译。
如果错误提示是“error C2065:'IDD_DIALOG1':undeclared identifier”,则按<F4>键显示错误所在位置。在MyDlg.h中类名的前面,添加定义资源ID的头文件"Resource.h"。
#include"Resource.h"
class CMyDlg:public CDialog
{
…
18)编译代码,运行并查看结果,如图3-46所示。
在MFC工程中,如何作消息处理呢?其实通过类向导添加消息映射函数,进行消息处理要比Win32程序效率高得多,刚才已经看到了类向导中列出了所有的相关消息。
19)执行View→ClassWizard命令,者按快捷键<Ctrl+W>打开类向导。

图3-46 查看运行结果
在Messages消息列表中选中“WM_MOUSEMOVE”,然后双击该列表项或者单击“Add Function”按钮,添加WM_MOUSEMOVE的消息映射函数,如图3-47所示。
20)在下方的成员函数列表(Member functions)中,出现与WM_MOUSEMOVE消息关联的成员函数OnMouseMove,如图3-48所示。

图3-47 在类向导中添加消息映射函数

图3-48 添加消息映射函数
21)双击OnMouseMove函数或单击“Edit Code”按钮,进入该函数修改代码。

22)编译并运行,测试代码,如图3-49所示。
当鼠标光标在对话框的客户区域移动时,在标题栏显示了不同的坐标位置,当单击鼠标或按<Ctrl><Shift>等键时也有显示。
23)MFC程序的消息映射机制。
Win32工程的消息处理机制,就是每个窗口都关联一个全局的消息回调函数。在消息回调函数中,通过对消息类型的判别来响应不同的消息。MFC的消息处理不是使用一个全局的回调函数,而是创建一个与窗口关联的派生类,用于消息关联的成员函数来接收和处理窗口的消息。在类向导中选择对应的消息,添加与该消息关联的成员函数来处理该消息,这就是MFC的消息映射机制。

图3-49 查看运行结果
在Win32的消息处理机制中,每一个消息类型(uMsg)发送到窗口内时,可能在wParam和lParam中携带一些相关的数据。例如,在WM_COMMAND的消息中,在wParam中记录了单击的按钮或者菜单项等ID号码。而在WM_LBUTTONDOWN的消息中,在lParam中记录了单击界面的(x,y)坐标等。Win32解析这些附带数据的过程比较烦琐,需要阅读MSDN手册中详细的说明资料。MFC的消息映射机制,一般不需要开发者解析这些复杂的数据,因为消息映射函数会自动在参数中将解析好的数据传递过来。例如,OnMouseMove(UINT nFlags,CPoint point)函数,再参照MSDN即可轻而易举地进行消息处理。
相关推荐