1、 VC+应用编程第第 2 2 章章 MFCMFC应用程序概述应用程序概述 VC+应用编程本章内容 2.2 MFC应用程序框架 2.3 消息映射与消息处理 2.4 程序调试 2.5 应用实例 VC+应用编程2.2 MFC2.2 MFC应用程序框架应用程序框架 下面通过一个实例介绍利用下面通过一个实例介绍利用MFC AppWizardexe创建应用程序框架的步骤。创建应用程序框架的步骤。2.2.1 创建创建MFC应用程序框架应用程序框架 VC+应用编程【例【例2.12.1】编写一个】编写一个SDISDI单文档应用程序单文档应用程序Li2_1Li2_1,程序运行后,程序运行后,通过消息框输出通过消息
2、框输出“这是一个单文档应用程序!这是一个单文档应用程序!”的提示信息。的提示信息。(1)选择File菜单下的New菜单项,系统弹出New对话框。单击单击输入输入工程名保存文件路径默认默认 VC+应用编程 单文档界面单文档界面(SDI)(SDI)应用应用程序。应用程序运行时,程序。应用程序运行时,只能打开一个文档。只能打开一个文档。多文档界面多文档界面(MDI)(MDI)应用应用程序。应用程序可以同程序。应用程序可以同时打开多个文档。时打开多个文档。基于对话框的应用程序。基于对话框的应用程序。应用程序将显示一个简应用程序将显示一个简单的对话框来处理用户单的对话框来处理用户的输入,的输入,(2)M
3、FC AppWizard-Step 1(2)MFC AppWizard-Step 1对话框主要用于选择应用程序对话框主要用于选择应用程序类型。类型。AppWizardAppWizard可以创建可以创建3 3种类型的应用程序框架。种类型的应用程序框架。语言种类语言种类是否支持是否支持文档文档/视图视图结构结构 VC+应用编程(3)MFC AppWizard-Step 2 of 6(3)MFC AppWizard-Step 2 of 6对话框中主要用于选择对话框中主要用于选择应用程序所支持数据库方式。应用程序所支持数据库方式。不包含任何数据库支持不包含任何数据库支持包含最低限度的数据库包含最低限度
4、的数据库支持支持创建对应表的一个数据创建对应表的一个数据库类和一个视图类,不库类和一个视图类,不附加标准文件支持附加标准文件支持创建对应表的一个数据创建对应表的一个数据库类和一个视图类,并库类和一个视图类,并附加标准文件支持附加标准文件支持 VC+应用编程(4)(4)在在MFC AppWizard-Step 3 of 6MFC AppWizard-Step 3 of 6对话框中选择对话框中选择应用程应用程序所支持的复合文档类型序所支持的复合文档类型。不支持任何复合文档不支持任何复合文档应用程序作为复合文档容器,包含应用程序作为复合文档容器,包含可以链接或嵌入的可以链接或嵌入的ActiveXAc
5、tiveX对象对象应用程序仅仅可以创建能够嵌入到应用程序仅仅可以创建能够嵌入到其他应用程序中的文档,但是不能其他应用程序中的文档,但是不能作为一个单独运行的应用程序作为一个单独运行的应用程序应用程序可以单独运行,同时也可应用程序可以单独运行,同时也可以作为一个对象嵌入到其他应用程以作为一个对象嵌入到其他应用程序中序中应用程序能够作为容器包含嵌入或应用程序能够作为容器包含嵌入或链接的链接的ActiveXActiveX对象,同时也能够对象,同时也能够作为一个可以嵌入到其他程序中的作为一个可以嵌入到其他程序中的对象对象 VC+应用编程(5)(5)在在MFC AppWizard-Step 4 of 6
6、MFC AppWizard-Step 4 of 6对话框中设置应用程对话框中设置应用程序的外观特征。序的外观特征。添加工具栏添加工具栏自动生成状态栏自动生成状态栏添加打印和打印预览菜单项添加打印和打印预览菜单项在帮助菜单中自动添加索引和在帮助菜单中自动添加索引和使用帮助菜单项使用帮助菜单项使应用程序的外观呈三维显示使应用程序的外观呈三维显示消息应用程序接口消息应用程序接口应用程序具有应用程序具有TCP/IPTCP/IP通信功能通信功能传统风格工具条传统风格工具条Internet ExplorerInternet Explorer风格工具条风格工具条 VC+应用编程(6)(6)在在MFC App
7、Wizard-Step 5 of 6MFC AppWizard-Step 5 of 6对话框中设置应用程序对话框中设置应用程序的风格。的风格。创建标准的创建标准的MFCMFC应用程序应用程序创建类似于创建类似于WindowsWindows资源管资源管理器风格的应用程序理器风格的应用程序在生成的程序框架的源文在生成的程序框架的源文件中加入注释件中加入注释不加入注释信息不加入注释信息使用动态链接库使用动态链接库 使用静态链接库使用静态链接库 VC+应用编程(7)(7)在在MFC AppWizard-Step 6 of 6MFC AppWizard-Step 6 of 6对话框中,可以设对话框中,可
8、以设置向导生成的文件名和类名。置向导生成的文件名和类名。设置类名设置类名设置文件名设置文件名 VC+应用编程(8)(8)打开项目工作区中的打开项目工作区中的ClassViewClassView类视图,单击类视图,单击CLi2_1ViewCLi2_1View类左边的类左边的“+”+”展开视图类,双击打开展开视图类,双击打开OnDrawOnDraw()()函数,并添加代码。函数,并添加代码。void CLi2_1View:OnDraw(CDC*pDC)CLi2_1Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for na
9、tive data hereMessageBox(这是一个单文档应用程序!这是一个单文档应用程序!,消息框消息框,MB_ICONEXCLAMATION|MB_OKCANCEL);VC+应用编程(9)(9)选择选择BuildBuild菜单中的菜单中的Build Li2_1.exeBuild Li2_1.exe菜单项,对工菜单项,对工程进行编译和链接,生成可执行文件。再选择程进行编译和链接,生成可执行文件。再选择BuildBuild菜菜单中的单中的Execute Li2_1.exeExecute Li2_1.exe菜单命令运行程序。菜单命令运行程序。VC+应用编程MFC概述概述 MFCMFC是用来
10、编写是用来编写WindowsWindows应用程序的应用程序的C+C+类类集,该类集以层次结构组织起来,其中集,该类集以层次结构组织起来,其中封装了封装了大部分大部分Windows APIWindows API函数和函数和WindowsWindows控件控件,它,它所包含的功能涉及到整个所包含的功能涉及到整个WindowsWindows操作系统。操作系统。MFCMFC不仅为用户提供了不仅为用户提供了 WindowsWindows图形环境下图形环境下应用程序的框架,而且还提供了创建应用程序应用程序的框架,而且还提供了创建应用程序的组件。的组件。VC+应用编程MFCMFC还很好地保持了程序的向下兼
11、容性还很好地保持了程序的向下兼容性用来编写用来编写WindowsWindows应应用程序的用程序的C+C+类集类集以层次结构组织以层次结构组织封装了大部分封装了大部分APIAPI函数函数提供了图形环境下应用程序的框架提供了图形环境下应用程序的框架提供了创建应用程序的组件提供了创建应用程序的组件提供了大量的基类供程序员根据不同的应用环境进行扩充提供了大量的基类供程序员根据不同的应用环境进行扩充允许在编程过程中自定义和扩展应用程序中的类允许在编程过程中自定义和扩展应用程序中的类较好的移植性,较好的移植性,可移植于众多的平台可移植于众多的平台MFCMFC VC+应用编程MFCMFC应用程序框架结构类
12、的继承关系:应用程序框架结构类的继承关系:2.2.2 MFC应用程序框架结构类应用程序框架结构类CCmdTargetCWinThreadCWndCDocumentCDocTemplateCWinAppCViewCFrameWndCMDIChildWndCMDIFrameWndCSingleDocTemplateCMultiDocTemplateCObject VC+应用编程1.CObject1.CObject类类 CObjectCObject是是MFCMFC类库的类库的根类根类,它几乎描述了所有,它几乎描述了所有MFCMFC类的一些公共特性,并且给所有由它派生出的类类的一些公共特性,并且给所有
13、由它派生出的类提供了提供了3 3种重要特性种重要特性,即:即:串行化支持串行化支持、运行时类信运行时类信息支持息支持以及以及诊断和调试支持诊断和调试支持。2.CCmdTarget2.CCmdTarget类类 命令类命令类CCmdTargetCCmdTarget是是CObjectCObject的子类,它是的子类,它是MFCMFC库中所有具有消息映射属性的类的公共基类。从库中所有具有消息映射属性的类的公共基类。从CCmdTargetCCmdTarget派生的类能在程序运行时动态创建对象派生的类能在程序运行时动态创建对象和处理命令消息。和处理命令消息。VC+应用编程3.CWinApp3.CWinAp
14、p类类 应用程序类应用程序类CWinAppCWinApp是是CWinThreadCWinThread的子类,的子类,封封装了初始化、运行、终止应用程序的代码装了初始化、运行、终止应用程序的代码。可以。可以由此派生自己的应用类。由此派生自己的应用类。成员函数成员函数功能功能InitInstance()应用程序的初始化;创建文档模板、应用程序的初始化;创建文档模板、文档、文档视图和主窗口文档、文档视图和主窗口Run()处理消息循环处理消息循环OnIdle()当没有窗口消息需要处理时,被窗口当没有窗口消息需要处理时,被窗口框架调用框架调用ExitInstance()退出程序时,该函数被调用退出程序时
15、,该函数被调用 VC+应用编程5.CFrameWnd5.CFrameWnd类类 CFrameWndCFrameWnd类是类是CWndCWnd类的派生类。它是所有其他类的派生类。它是所有其他框架窗口类的基类,主要框架窗口类的基类,主要用来管理一个窗口用来管理一个窗口。CFrameWndCFrameWnd类的对象是一个框架窗口,包括边框、类的对象是一个框架窗口,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。的视图。4.CWnd4.CWnd类类 窗口类窗口类CWndCWnd提供了提供了MFCMFC中所有窗口类的基本中所有窗口类的基本功能
16、。从功能。从CWndCWnd派生的类可以拥有自己的窗口,并派生的类可以拥有自己的窗口,并对它进行控制。对它进行控制。VC+应用编程6.CView6.CView类类 视图类视图类CViewCView是是CWndCWnd类的子类。视图类及其派类的子类。视图类及其派生类用于管理框架窗口的客户区。生类用于管理框架窗口的客户区。7.CDocument7.CDocument类类 文档类文档类CDocumentCDocument负责装载和维护文档。文档负责装载和维护文档。文档包括应用程序的工作成果或环境设置数据等,可包括应用程序的工作成果或环境设置数据等,可以是程序需要保存的任何内容。以是程序需要保存的任何
17、内容。VC+应用编程8.8.菜单类:菜单类:CMenuCMenu类类 该类是该类是CObjectCObject类的子类,用于管理菜单。它是一个类的子类,用于管理菜单。它是一个Windows HMenuWindows HMenu的封装,提供了与窗口有关的菜单资源建的封装,提供了与窗口有关的菜单资源建立、修改、跟踪及删除的成员函数。立、修改、跟踪及删除的成员函数。9.9.对话框类:对话框类:CDialogCDialog类类 由于对话框是一个特殊的窗口,所以该类是从由于对话框是一个特殊的窗口,所以该类是从CWndCWnd类类中派生出来的。对话框子层次结构包括通用对话框类中派生出来的。对话框子层次结构
18、包括通用对话框类CDialogCDialog以及支持文件选择、颜色选择、字体选择、打印、以及支持文件选择、颜色选择、字体选择、打印、替换文本的公共对话框子类。替换文本的公共对话框子类。VC+应用编程10.10.设备环境类:设备环境类:CDCCDC类类 该类及其子类支持设备描述表对象,是该类及其子类支持设备描述表对象,是CObjectCObject类的类的子类。子类。CDCCDC类是一个较大的类,包括许多成员函数,如映类是一个较大的类,包括许多成员函数,如映射函数、绘画工具函数、区域函数等,通过射函数、绘画工具函数、区域函数等,通过CDCCDC对象的成对象的成员函数可以完成所有的绘画工作员函数可
19、以完成所有的绘画工作.VC+应用编程 一个一个MFCMFC应用程序并不直接操作上述类,而是应用程序并不直接操作上述类,而是以上述类为以上述类为基类派生新的类基类派生新的类,从而构建,从而构建WindowsWindows应用程序的基本框架。应用程序的基本框架。例如,应用程序例如,应用程序Li2_1Li2_1中的类与这些基类的派生关系中的类与这些基类的派生关系:类名称 基 类 说 明 CLi2_1App CMainFrame CLi2_1View CLi2_1Doc CWinApp CFrameWnd CView CDocument 应用程序类 框架窗口类 视图类 文档类 VC+应用编程MFC 中
20、全局函数和全局变量中全局函数和全局变量 以以Afx为前缀的函数为前缀的函数(数据库类函数和数据库类函数和DDX函数除函数除外外)和变量,在目前的版本中,都表示全局函数或全和变量,在目前的版本中,都表示全局函数或全局变量。局变量。AfxAbort:无条件终止一个应用程序无条件终止一个应用程序AfxBeginThread:创建一个新线程并执行它创建一个新线程并执行它AfxEndThread:终止当前正在执行的线程终止当前正在执行的线程AfxFormatString:格式化字符串格式化字符串AfxMessageBox:显示一个显示一个Windows消息框消息框AfxGetApp:返回当前应用程序对象
21、的指针返回当前应用程序对象的指针AfxGetInstanceHandle:返回标识当前应用程序对象的句柄:返回标识当前应用程序对象的句柄AfxRegisterWndClass:注册用于创建:注册用于创建Windows窗口的窗口类窗口的窗口类常见全局函数常见全局函数 VC+应用编程1.1.应用程序向导生成的文件应用程序向导生成的文件 下面以例下面以例2.12.1中创建的应用程序中创建的应用程序Li2_1Li2_1为例,介绍为例,介绍MFC AppWizardexeMFC AppWizardexe向导所生成的各类文件及功能。向导所生成的各类文件及功能。2.2.3 MFC应用程序分析应用程序分析 V
22、C+应用编程(1)头文件与实现文件头文件与实现文件 MainFrm.h和和MainFrm.cpp:定义和实现窗口框架:定义和实现窗口框架类类CMainFrame。CLi2_1Doc.h和和CLi2_1Doc.cpp:定义和实现文档:定义和实现文档类类CLi2_1Doc。CLi2_1View.h 和和CLi2_1View.cpp:定义和实现视:定义和实现视图类图类CLi2_1View。CLi2_1.h 和和CLi2_1.cpp:定义和实现应用程序类:定义和实现应用程序类CLi2_1App。Resource.h:定义工程中所有资源标识符,给资源:定义工程中所有资源标识符,给资源ID分配一个整数值。
23、分配一个整数值。StdAfx.h和和StdAfx.cpp:用于建立一个预编译的头:用于建立一个预编译的头文件文件CLi2_1.PCH和一个预定义的类型文件和一个预定义的类型文件StdAfx.obj。VC+应用编程(2)资源文件资源文件Li2_1.rc和和Li2_1.rc2:Li2_1.rc文件是程序所使用的文件是程序所使用的所有所有Windows资源的列表。资源的列表。Li2_1.ico:应用程序的图标所使用的图标文件。:应用程序的图标所使用的图标文件。Li2_1Doc.ico:应用程序的文档图标文件。文档图:应用程序的文档图标文件。文档图标一般显示在多文档程序界面上。标一般显示在多文档程序界
24、面上。Toolbar.bmp:工具栏按钮的位图文件。:工具栏按钮的位图文件。VC+应用编程(3)项目工作区文件和工程文件项目工作区文件和工程文件Li2_1.dsw:保存当前工作区所包含的工程的信:保存当前工作区所包含的工程的信息。息。Li2_1.dsp:包含当前工程的设置、工程中的文:包含当前工程的设置、工程中的文件等信息。件等信息。VC+应用编程(4)其他文件其他文件 Li2_1.clw:该文件是类信息文件。它保存了:该文件是类信息文件。它保存了ClassWizard编辑现有类或增加新类时需使用的类信编辑现有类或增加新类时需使用的类信息,同时还保存了创建、编辑消息映射和成员函数所息,同时还保
25、存了创建、编辑消息映射和成员函数所需的信息。需的信息。ReadMe.txt:该文件是工程自述文件。主要介绍所:该文件是工程自述文件。主要介绍所创建文件的内容和功能,以及添加用户代码、更改使创建文件的内容和功能,以及添加用户代码、更改使用语言的方法。用语言的方法。VC+应用编程2.2.应用程序的执行过程应用程序的执行过程 启动theAppAfxWinMain()AfxGetApp()InitInstance()Run()消息循环消息循环处理处理收到收到WM_QUITExitInstance()在应用程序的初始在应用程序的初始化过程中,同时还构造了化过程中,同时还构造了文档模板,产生最初的文文档模
26、板,产生最初的文档、视图和主框架窗口,档、视图和主框架窗口,并生成工具栏和状态栏。并生成工具栏和状态栏。VC+应用编程消息对话框消息对话框 一种简单的对话框,用户可以直接调用消息对话框函数一种简单的对话框,用户可以直接调用消息对话框函数来使用它,而不需要自己创建。来使用它,而不需要自己创建。Visual C+Visual C+提供提供三个消息对话三个消息对话框函数框函数,它们的原型为:,它们的原型为:MFCMFC全局函数:全局函数:int AfxMessageBox(LPCTSTR lpText,UINT nType=MB_OK,UINT nIDHelp=0);Windows APIWindo
27、ws API函数:函数:int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT nType);CWndCWnd类的成员函数:类的成员函数:int CWnd:MessageBox(LPCTSTR lpText,LPCTSTR lpCaption=NULL,UINT nType=MB_OK);要显示要显示的文本的文本对话框对话框标题标题对话框按对话框按钮风格钮风格 VC+应用编程 VC+应用编程 VC+应用编程Li2_1void CLi2_1View:OnDraw(CDC*pDC)CLi2_1Doc*pDoc=GetDocume
28、nt();ASSERT_VALID(pDoc);/TODO:add draw code for native data hereMessageBox(这是个单文档应用程序!这是个单文档应用程序!,消息框消息框,MB_ICONEXCLAMATION|MB_OKCANCEL);VC+应用编程2.2.4 文档文档/视图结构视图结构 文档视图体系结构是文档视图体系结构是MFCMFC应用程序框架结构应用程序框架结构的基石,它定义了的基石,它定义了一种程序结构一种程序结构。文档对象:文档对象:保存应用程序的数据保存应用程序的数据视图对象视图对象:控制视图显示数据:控制视图显示数据 文档与视图的关系是一对多
29、的关系,也就是说,文文档与视图的关系是一对多的关系,也就是说,文档中的数据可以以不同的方式显示。档中的数据可以以不同的方式显示。VC+应用编程 应用程序对象 文档模板对象 文档对象 视图对象 框架窗口对象 VC+应用编程2.3 消息映射与消息处理消息映射与消息处理 WindowsWindows消息主要有消息主要有3 3种类型种类型:标准标准WindowsWindows消息消息、控件消息控件消息和和命令消息命令消息。1 1标准标准WindowsWindows消息消息除除WM_COMMANDWM_COMMAND以外,所有以以外,所有以“WM_WM_”为前缀的消为前缀的消息都是标准息都是标准Wind
30、owsWindows消息消息;由由窗口类窗口类或或视图类视图类处理处理;都有默认的处理函数,它们在都有默认的处理函数,它们在CWndCWnd类中进行了预类中进行了预定义。定义。2.3.1 消息的类别及其描述消息的类别及其描述 VC+应用编程标准的标准的WindowsWindows消息又分为消息又分为3 3类:类:键盘消息键盘消息、鼠标消息鼠标消息和和窗口消息窗口消息。(1)(1)键盘消息键盘消息 键盘消息与键盘某个键的动作相关联。常见的键键盘消息与键盘某个键的动作相关联。常见的键盘消息有以下几种。盘消息有以下几种。WM_KEYDOWNWM_KEYDOWN、WM_KEYUPWM_KEYUP:按下
31、、释放非系统键产生的:按下、释放非系统键产生的消息。消息。WM_CHARWM_CHAR:输入非系统字符时产生的消息。:输入非系统字符时产生的消息。VC+应用编程(2)(2)鼠标消息鼠标消息 鼠标消息涉及到鼠标的单击、双击、拖动等。常用的鼠标消息涉及到鼠标的单击、双击、拖动等。常用的鼠标消息有以下几种。鼠标消息有以下几种。WM_MOUSEMOVEWM_MOUSEMOVE:鼠标移动时产生的消息。:鼠标移动时产生的消息。WM_RBUTTONDOWNWM_RBUTTONDOWN:鼠标右键按下时产生的消息。:鼠标右键按下时产生的消息。WM_LBUTTONDOWNWM_LBUTTONDOWN:鼠标左键按下
32、时产生的消息。:鼠标左键按下时产生的消息。WM_LBUTTONDBLCLICKWM_LBUTTONDBLCLICK:鼠标双击时产生的消息。:鼠标双击时产生的消息。VC+应用编程(3)(3)窗口消息窗口消息 窗口消息一般与创建窗口、绘制窗口、移动窗口消息一般与创建窗口、绘制窗口、移动窗口和销毁窗口等动作有关。窗口和销毁窗口等动作有关。在在MFCMFC应用程序中,窗口消息是由视图类、应用程序中,窗口消息是由视图类、窗口类及它们的派生类处理的。窗口类及它们的派生类处理的。VC+应用编程2.2.控件消息控件消息 控件消息是指控件或其他子窗口向父窗口发送控件消息是指控件或其他子窗口向父窗口发送的的WM_
33、COMMANDWM_COMMAND消息。消息。与其他标准的与其他标准的WindowsWindows消息一样,控件消息也应消息一样,控件消息也应该在视图类、窗口类中进行处理。但是,如果用户该在视图类、窗口类中进行处理。但是,如果用户单击按钮控件时,发出的控件通知消息单击按钮控件时,发出的控件通知消息BN_CLICKEDBN_CLICKED将作为命令消息来处理。将作为命令消息来处理。VC+应用编程3.3.命令消息命令消息 命令消息是由菜单项、工具栏按钮、快捷键等命令消息是由菜单项、工具栏按钮、快捷键等用户界面对象发出的用户界面对象发出的WM_COMMANDWM_COMMAND消息。消息。命令消息与
34、其他消息不同,它可被更广泛的对命令消息与其他消息不同,它可被更广泛的对象如文档、文档模板、应用程序对象、窗口和视图象如文档、文档模板、应用程序对象、窗口和视图等处理。等处理。VC+应用编程2.3.2 MFC消息映射机制消息映射机制 MFC MFC采用采用消息映射消息映射来处理消息;来处理消息;消息映射机制包括消息映射机制包括一组消息映射宏一组消息映射宏,用于把一个,用于把一个WindowsWindows消息和其消息处理函数联系起来。消息和其消息处理函数联系起来。所有从所有从CCmdTargetCCmdTarget类派生出来的类都能够拥有自类派生出来的类都能够拥有自己的消息映射。己的消息映射。与
35、与MFCMFC消息映射机制有关的宏有以下消息映射机制有关的宏有以下3 3个:个:DECLARE_MESSAGE_MAP()DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(MyClass,MybaseClassBEGIN_MESSAGE_MAP(MyClass,MybaseClass)END_MESSAGE_MAP()END_MESSAGE_MAP()VC+应用编程BEGIN_MESSAGE_MAP(MyClass,MybaseClass)/AFX_MSG_MAP(MyClass)/ClassWizard维护消息映射宏的标记维护消息映射宏的标记 ON_./MFC预定
36、义消息映射宏预定义消息映射宏 ON_MESSAGE(message,memberFun)/用户自定义消息映射宏用户自定义消息映射宏 /AFX_MSG_MAPEND_MESSAGE_MAP()其中,其中,MyClass是拥有消息映射的派生类名,是拥有消息映射的派生类名,MybaseClass 是其基类名。是其基类名。VC+应用编程【例【例2.22.2】利用利用ClassWizardClassWizard为例为例2.12.1中生成的应用程序中生成的应用程序Li2_1Li2_1添加鼠标右键按下消息,即添加鼠标右键按下消息,即WM_RBUTTONDOWNWM_RBUTTONDOWN消息,并消息,并为为
37、FileFile菜单下的菜单下的OpenOpen菜单项添加消息处理函数,分析菜单项添加消息处理函数,分析ClassWizardClassWizard类向导所进行的消息映射。类向导所进行的消息映射。1、进行消息映射、进行消息映射2、编写消息响应函数代码、编写消息响应函数代码 VC+应用编程2.3.3 自定义消息处理自定义消息处理 定义消息名、分配定义消息名、分配IDID值及完成消息映射。值及完成消息映射。WindowsWindows将所有的消息值分为将所有的消息值分为4 4段:段:0 x00000 x00000 x03FF0 x03FF段段:用于用于WindowsWindows系统消息系统消息0
38、 x04000 x04000 x7FFF0 x7FFF段段:用于用户自定义的窗口消息用于用户自定义的窗口消息0 x80000 x80000 xBFFF0 xBFFF段段:为为WindowsWindows保留值保留值0 xC0000 xC0000 xFFFF0 xFFFF段段:用于应用程序的字符串消息。用于应用程序的字符串消息。VC+应用编程常量常量WM_USER(为为0 x0400)与第一个自定义消息值相对应与第一个自定义消息值相对应(1)利用)利用#define语句直接定义自己的消息,如下所示:语句直接定义自己的消息,如下所示:#define WM_MESSAGE WM_USER+3/自定义
39、消息自定义消息WM_MESSAGE(2)调用窗口消息注册函数)调用窗口消息注册函数RegisterWindowMessage()来定来定义一个义一个Windows消息,由系统分配消息一个整数值。消息,由系统分配消息一个整数值。UINT RegisterWindowMessage(LPCTSTR lpString);其中参数其中参数lpString是要定义的消息名,调用成功后将返回是要定义的消息名,调用成功后将返回该消息的该消息的ID值。值。VC+应用编程【例【例2.32.3】编写一个自定义消息应用程序,并添加编写一个自定义消息应用程序,并添加WM_RBUTTONDOWNWM_RBUTTONDO
40、WN消息。当程序运行时,用户在视图窗口中消息。当程序运行时,用户在视图窗口中单击鼠标右键,则调用自定义消息处理函数,输出文本单击鼠标右键,则调用自定义消息处理函数,输出文本“自定义消息自定义消息WM_MYMESSAGEWM_MYMESSAGE的处理函数被调用!的处理函数被调用!”。1、定义消息、定义消息2、在、在.h文件中定义消息响应函数文件中定义消息响应函数3、在、在.cpp中进行消息映射中进行消息映射4、编写消息响应函数代码、编写消息响应函数代码 VC+应用编程应用实例 编写一个单文档应用程序编写一个单文档应用程序Sy2,程序运行后,程序运行后,首先在视图窗口中输入文本,然后通过键盘上的光
41、首先在视图窗口中输入文本,然后通过键盘上的光标键控制该文本向左、向右、向上和向下标键控制该文本向左、向右、向上和向下4个方向移个方向移动。动。DC(Device Context)设备环境)设备环境 OnDraw()函数函数 GetDocumnet()函数函数 TextOut()系统函数系统函数 VC+应用编程设备环境 MFC AppWizard应用程序向导创建的OnDraw()函数自动支持所获取的设备环境,接受一个参数为指向CDC对象的指针。VC+应用编程 OnDraw()函数和函数和GetDocumnet()函数都函数都是视图类的成员函数。是视图类的成员函数。OnDraw()函数:是一个虚函
42、数,负责文档对象的数据在用户视图区的显示输出。GetDocumnet()函数:用于获取当前文档对象的指针m_pDocument。在向导生成的成员函数在向导生成的成员函数OnDrawOnDraw()()中调用了函数中调用了函数GetDocumentGetDocument()()通过获取的文档类指针可以在视图中显示通过获取的文档类指针可以在视图中显示文档内容。文档内容。VC+应用编程TextOut函数 原型:TextOut(int x,int y,const CString&str );功能:在屏幕上指定位置输出字符串在屏幕上指定位置输出字符串 void CTest3View:OnDraw(CDC
43、*pDC)CTest3Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data herepDC-TextOut(30,30,hello world!);VC+应用编程 创建项目 添加成员(视图类)CString m_string;int x;int y;初始化成员 添加WM_CHAR字符消息处理函数 添加WM_KEYDOWN键盘消息处理函数 输出文本 VC+应用编程2.5 2.5 程序调试程序调试 程序调试分为源程序语法错误的修改和程序程序调试分为源程序语法错误的修改和程序逻辑设计错误的修改两个阶
44、段,编译器只能找出逻辑设计错误的修改两个阶段,编译器只能找出源程序的语法错误,程序的逻辑设计错误只能靠源程序的语法错误,程序的逻辑设计错误只能靠程序员利用调试工具来手工检查和修改。程序员利用调试工具来手工检查和修改。VC+应用编程2.4.1 2.4.1 查找源程序中的语法错误查找源程序中的语法错误 语法错误分为语法错误分为:一般错误一般错误(error):(error):出现该错误时将不会产生可出现该错误时将不会产生可执行程序执行程序;警告错误警告错误(warning):(warning):出现该错误时能够生成可出现该错误时能够生成可执行程序,但程序运行时可能发生错误,严重的执行程序,但程序运
45、行时可能发生错误,严重的warningwarning错误还会引起死机现象。错误还会引起死机现象。VC+应用编程 如果程序有语法错误,则在执行编译、链接命令如果程序有语法错误,则在执行编译、链接命令时,时,Visual C+Visual C+编译器将在输出窗口中给出语法错误编译器将在输出窗口中给出语法错误提示信息,但链接错误提示信息不能给出错误发生的提示信息,但链接错误提示信息不能给出错误发生的具体位置。具体位置。在输出窗口中双击错误提示信息或按在输出窗口中双击错误提示信息或按F4F4键可以返键可以返回到源程序编辑窗口,并通过一个箭头符号定位到产回到源程序编辑窗口,并通过一个箭头符号定位到产生错
46、误的语句。生错误的语句。VC+应用编程2.4.2 2.4.2 调试器调试器 为了查找和修改程序中的逻辑设计错误,为了查找和修改程序中的逻辑设计错误,Visual Visual C+IDEC+IDE提供了重要的调试工具提供了重要的调试工具DebugDebug。单击单击Build|Start DebugBuild|Start Debug菜单中的菜单项,可以菜单中的菜单项,可以启动启动DebugDebug。VC+应用编程Start DebugStart Debug子菜单中有子菜单中有GoGo、Step IntoStep Into、Run To CursorRun To Cursor及及Attach
47、to ProcessAttach to Process菜单项菜单项开始或继续调试程序,到开始或继续调试程序,到某个断点、程序的结束或某个断点、程序的结束或需要用户输入的地方停止需要用户输入的地方停止 程序执行到当前光标程序执行到当前光标处,相当于在光标处处,相当于在光标处临时设置了一个断点临时设置了一个断点单步执行程序的每单步执行程序的每一个指令,能进入一个指令,能进入被调用的函数内部被调用的函数内部将调试器与一将调试器与一个正在运行的个正在运行的进程相连接进程相连接 VC+应用编程 调试过程开始后,调试过程开始后,DebugDebug主菜单取代主菜单取代BuildBuild主主菜单出现在菜单
48、栏中,同时出现一个可停靠的调菜单出现在菜单栏中,同时出现一个可停靠的调试工具栏和一些调试窗口。试工具栏和一些调试窗口。Debug 菜单 当前位置 断点 Variable 窗口 Watch 窗口 VC+应用编程 即使源程序没有语法错误,但最后生成的可执行程序也即使源程序没有语法错误,但最后生成的可执行程序也没有像程序设计要求的那样运行,这类程序设计上的错误被没有像程序设计要求的那样运行,这类程序设计上的错误被称为逻辑设计错误或缺陷称为逻辑设计错误或缺陷(bug)(bug)。跟踪调试程序是查找此类逻辑设计错误方法中最常采用跟踪调试程序是查找此类逻辑设计错误方法中最常采用的动态方法。跟踪调试的基本原
49、理就是在程序运行过程的某的动态方法。跟踪调试的基本原理就是在程序运行过程的某一阶段观测程序的状态。而在一般情况下程序是连续运行的一阶段观测程序的状态。而在一般情况下程序是连续运行的,所以我们必须使程序在某一点停下来。,所以我们必须使程序在某一点停下来。2.4.3 2.4.3 跟踪调试程序跟踪调试程序 VC+应用编程 选择选择EditEdit菜单下的菜单下的BreakpointsBreakpoints菜单项,显示菜单项,显示BreakpointsBreakpoints对话框。对话框。1.1.设置断点设置断点 设置断点的设置断点的3 3种方式:种方式:u按位置按位置u按表达式的值按表达式的值u按窗
50、口消息按窗口消息 VC+应用编程 2.2.控制程序运行控制程序运行 Step OverStep Over:运行当前箭头指向的代码:运行当前箭头指向的代码(只运行一条代码只运行一条代码)。Step Into Step Into:如果当前箭头所指的代码是一个函数:如果当前箭头所指的代码是一个函数的调用,则用的调用,则用Step IntoStep Into进入该函数并进行单步执行。进入该函数并进行单步执行。Step OutStep Out:如果当前箭头所指向的代码是在某一函:如果当前箭头所指向的代码是在某一函数内部,用它可使程序运行至函数返回处。数内部,用它可使程序运行至函数返回处。Run to C