C++ 第七章 Visual C++ 编程基础.ppt
MFC 编程编程第七章第七章 Visual C+Visual C+编程基础编程基础ARM Vector TableFIQIRQ(Reserved)Data AbortPrefetch AbortSoftware InterruptUndefined InstructionReset0 x1C0 x180 x140 x100 x0C0 x080 x040 x001 13 32 2Windows API 编程编程Windows 程序运行机制程序运行机制 WindowsWindows是一种是一种典型的事件驱动运行机制典型的事件驱动运行机制;比如单击鼠标时,比如单击鼠标时,WindowsWindows系统会向特定的系统会向特定的窗口发送消息。窗口发送消息。在在Visual C+6.0Visual C+6.0中,一般消息处理都被包含中,一般消息处理都被包含在在MFCMFC中,用户特定的消息可由程序员自行处中,用户特定的消息可由程序员自行处理。理。MFCMFCMicrosoft Foundation Class LibraryMicrosoft Foundation Class Library 微软基础类库微软基础类库在在Visual C+6.0Visual C+6.0中,使用中,使用Class WizardClass Wizard等工等工具,可以是消息处理更方便,可控性强、封装具,可以是消息处理更方便,可控性强、封装性更好。性更好。7.1 Windows程序运行机制程序运行机制7.1.1Windows7.1.1Windows中的事件驱动与消息循环中的事件驱动与消息循环与与DOS应用程序不同,应用程序不同,Windows应用程序的运应用程序的运行机制并不是显示地运用一个函数来取得输入,行机制并不是显示地运用一个函数来取得输入,而是等待而是等待Windows系统将输入传递给系统将输入传递给Windows应用程序的窗口。应用程序的窗口。每个窗口都有一个被称为窗口过程的函数,当每个窗口都有一个被称为窗口过程的函数,当窗口有输入时,窗口有输入时,Windows系统将调用它。系统将调用它。窗口过程函数处理输入后将控制返回给窗口过程函数处理输入后将控制返回给Windows系统。系统。Windows系统以消息的形式将输入传给窗口过系统以消息的形式将输入传给窗口过程;程;这里的消息是指事件之间相互传送的具有一定这里的消息是指事件之间相互传送的具有一定意义的信号,意义的信号,Windows系统对每个输入事件都系统对每个输入事件都要产生输入消息。要产生输入消息。7.1.1Windows7.1.1Windows中的事件驱动与消息循环中的事件驱动与消息循环例例7.17.1分析通过鼠标在分析通过鼠标在Windows Windows 的画图程序的画图程序窗口中画一个矩形的消息传递和消息处理过窗口中画一个矩形的消息传递和消息处理过程;程;当单击当单击PaintBrushPaintBrush工具箱中的画矩形工具时,工具箱中的画矩形工具时,工具箱接收到单击鼠标的消息;工具箱接收到单击鼠标的消息;当用户在窗口中按下鼠标左键时,产生当用户在窗口中按下鼠标左键时,产生WM_LBUTTONDOWNWM_LBUTTONDOWN消息;消息;当用户在窗口内拖动鼠标时,产生当用户在窗口内拖动鼠标时,产生WM_MOUSEMOVEWM_MOUSEMOVE消息;消息;当用户在窗口中放下鼠标左键时,将产生当用户在窗口中放下鼠标左键时,将产生WM_LBUTTONUPWM_LBUTTONUP消息。消息。7.1.1Windows7.1.1Windows中的事件驱动与消息循环中的事件驱动与消息循环Windows系统首先接收到鼠标动作事件,然后产系统首先接收到鼠标动作事件,然后产生相应的消息并发给生相应的消息并发给PaintBrush窗口;窗口;PaintBrush窗口一直等待窗口一直等待Windows系统发给它的系统发给它的消息,当接收到消息时,消息,当接收到消息时,PaintBrush窗口的窗口窗口的窗口过程函数将处理接收到的消息;过程函数将处理接收到的消息;当消息处理完成后,将控制权返回给当消息处理完成后,将控制权返回给Windows系系统,然后在等待统,然后在等待Windows系统的消息。系统的消息。WindowsWindows应用程序在运行时就是不断地应用程序在运行时就是不断地等待消息,等待消息,处理消息,处理消息,又等待消息这个过程循环往复直到程又等待消息这个过程循环往复直到程序运行结束时为止,一般称这个过程为序运行结束时为止,一般称这个过程为消息循环消息循环。7.1.2 7.1.2 消息和消息处理消息和消息处理 在在WindowsWindows中,从消息的发出到消息的处理是一中,从消息的发出到消息的处理是一个复杂的过程,其中一个重要的概念是消息结构个复杂的过程,其中一个重要的概念是消息结构MSGMSG。消息结构消息结构MSGMSG:typedef struct tagMSGtypedef struct tagMSG HWND hwnd;/HWND hwnd;/接收消息的窗口句柄接收消息的窗口句柄UINT message;/UINT message;/标识一种标识一种消息类型,消息消息类型,消息IDIDWPARAM wParam;/WPARAM wParam;/消息消息数据成员数据成员,消息本身消息本身LPARAM lParam;/LPARAM lParam;/消息消息数据成员数据成员,消息本身消息本身DWORD time;/DWORD time;/消息放入消息队列中的消息放入消息队列中的时间时间POINT pt;/POINT pt;/消息被放入消息队列时消息被放入消息队列时鼠标坐标鼠标坐标 MSG,*PMSGMSG,*PMSG;7.1.2 7.1.2 消息和消息处理消息和消息处理MSGMSG数据成员含义:数据成员含义:1 1、HWNDHWND hwndhwnd:消息要发送到的应用程序窗口的消息要发送到的应用程序窗口的句句柄柄,如果是在一个有多个窗口的应用程序中用此数,如果是在一个有多个窗口的应用程序中用此数据成员可据成员可决定让哪个窗口接收消息决定让哪个窗口接收消息;2 2、UINT UINT messagemessage:是是一一个个数数值值用用于于惟惟一一标标识识一一种种消消息类型息类型;(;(消息消息IDID)3 3、WPARAM WPARAM wParamwParam:是是一一个个3232位位的的消消息息数数据据成成员员它它的确切意义取决于消息本身;的确切意义取决于消息本身;4 4、LPARAM LPARAM lParamlParam:也也是是一一个个3232位位的的消消息息数数据据成成员员它的确切意义也取决于消息本身;它的确切意义也取决于消息本身;5 5、DWORD DWORD timetime:消消息息放放入入消消息息队队列列中中的的时时间间,在在这这个个数数据据成成员员中中写写入入的的并并不不是是日日期期而而是是从从WindowsWindows启启动后所测量的时间值用于动后所测量的时间值用于保持消息正确的顺序保持消息正确的顺序;6 6、POINT POINT ptpt:消息被放入消息队列时的消息被放入消息队列时的鼠标坐标鼠标坐标;7.1.2 7.1.2 消息和消息处理消息和消息处理HWND 窗口句柄窗口句柄typedef unsigned int UINT;typedef UINT WPARAM;/就是无符号整形就是无符号整形 typedef long LONG;typedef LONG LPARAM;/就是长整形就是长整形 DWORDPOINT7.1.2 7.1.2 消息和消息处理消息和消息处理被送往应用程序的消息将被应用程序窗口的被送往应用程序的消息将被应用程序窗口的窗口过程函数窗口过程函数所接收,如程序员编写有相应所接收,如程序员编写有相应的函数,的函数,窗口过程函数窗口过程函数将执行对应的函数;将执行对应的函数;-这样消息就被响应。这样消息就被响应。消息对应的函数称为消息对应的函数称为消息函数。消息函数。一个消息函数只对应一个消息一个消息函数只对应一个消息,每个消息都,每个消息都有一个专门的函数来处理;有一个专门的函数来处理;如果程序员没有编写相应的消息函数,消息如果程序员没有编写相应的消息函数,消息将由窗口默认处理。将由窗口默认处理。7.1.2 7.1.2 消息和消息处理消息和消息处理回顾例回顾例7.17.1当用户在当用户在PaintBrushPaintBrush窗口中按下鼠标左键窗口中按下鼠标左键时,时,WindowsWindows系统发出系统发出WM_LBUTTONDOWNWM_LBUTTONDOWN消消息;息;消息的句柄是消息的句柄是PaintBrushPaintBrush窗口的句柄,因此窗口的句柄,因此消息被发往消息被发往PaintBrushPaintBrush窗口;窗口;当当PaintBrushPaintBrush窗口接收到消息后,该窗口的窗口接收到消息后,该窗口的窗口过程函数窗口过程函数立即调用立即调用该消息对应的消息该消息对应的消息函数函数对该消息进行处理:对该消息进行处理:记录下鼠标左键按记录下鼠标左键按下的位置坐标。下的位置坐标。7.1.2 7.1.2 消息和消息处理消息和消息处理当用户在窗口内拖动鼠标时,当用户在窗口内拖动鼠标时,WindowsWindows系系统发出统发出WM_MOUSEMOVEWM_MOUSEMOVE消息;消息;消息的句柄仍然是消息的句柄仍然是PaintBrushPaintBrush窗口的句柄,窗口的句柄,因此消息被发往因此消息被发往PaintBrushPaintBrush窗口;窗口;当当PaintBrushPaintBrush窗口接收到消息后,该窗口的窗口接收到消息后,该窗口的窗口过程函数窗口过程函数立即调用立即调用该消息对应的消息该消息对应的消息函数函数对该消息进行处理:对该消息进行处理:记录下鼠标当前的记录下鼠标当前的位置坐标,并以此点与鼠标左键按下的那位置坐标,并以此点与鼠标左键按下的那一点分别作为左上角和右下角画一个矩形,一点分别作为左上角和右下角画一个矩形,同时隐藏前一点与鼠标左键按下时的那一同时隐藏前一点与鼠标左键按下时的那一点所画的矩形。点所画的矩形。7.1.2 7.1.2 消息和消息处理消息和消息处理当鼠标不断移动,当鼠标不断移动,Windows系统不断的发出系统不断的发出WM_MOUSEMOVEWM_MOUSEMOVE消息;消息;该消息函数不断地重复以上的过程;该消息函数不断地重复以上的过程;最后当用户在窗口中放开鼠标左键时,最后当用户在窗口中放开鼠标左键时,Windows系统发出系统发出WM_LBUTTONUPWM_LBUTTONUP消息。消息。消息的句柄仍然是消息的句柄仍然是PaintBrushPaintBrush窗口的句柄,因此消窗口的句柄,因此消息被发往息被发往PaintBrushPaintBrush窗口;窗口;当当PaintBrushPaintBrush窗口接收到消息后,该窗口的窗口接收到消息后,该窗口的窗口过窗口过程函数程函数立即调用立即调用该消息对应的消息函数该消息对应的消息函数对该消息进对该消息进行处理:行处理:记录下鼠标在该点的位置坐标,并以此点记录下鼠标在该点的位置坐标,并以此点与鼠标左键按下的那一点分别作为左上角和右下角与鼠标左键按下的那一点分别作为左上角和右下角画一个矩形。画一个矩形。最终在最终在PaintBrushPaintBrush窗口中画出一个矩形。窗口中画出一个矩形。7.1.2 7.1.2 消息映象机制消息映象机制消息映像消息映像指在指在MFCMFC类中将类中将消息与消息与消息处理函数消息处理函数联系起来形成一联系起来形成一一对应的机制;一对应的机制;在在MFCMFC中,任何一个从类中,任何一个从类CCmdTargetCCmdTarget派生的类都能处理派生的类都能处理消息,都有相应的消息映像;消息,都有相应的消息映像;各种各种消息通过消息映象消息通过消息映象,找到,找到处理该消息的处理函数。处理该消息的处理函数。7.1.2 7.1.2 消息映象机制消息映象机制在在VCVC的的源文件中,源文件中,宏宏BEGIN_MESSAGE_MAPBEGIN_MESSAGE_MAP和和END_MESSAGE_MAPEND_MESSAGE_MAP之间的代码之间的代码为消息映像代码。为消息映像代码。如象下面程序片段:如象下面程序片段:BEGIN_MESSAGE_MAP BEGIN_MESSAGE_MAP(Cstep,CView)(Cstep,CView)/AFX_MSG_MAP(CCircleView)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONLOCK()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()/AFX_MSG_MAP END_MESSAGE_MAP()END_MESSAGE_MAP()在在MFCMFC中,利用中,利用ClassWizardClassWizard可以找到要处理的对可以找到要处理的对象及其要处理的对象的消息,并且可以直接激活象及其要处理的对象的消息,并且可以直接激活VCVC文本编辑器,向消息处理函数中加入代码。文本编辑器,向消息处理函数中加入代码。我们看看一个具体的示例程序7.2 Windows API编程编程7.2.1 API和SDK1 APIWindows API(Windows Application Programming Interface,Windows应用程序应用程序编程接口编程接口)是所有是所有Windows应用程序的基础;应用程序的基础;API是一系列例程,Windows应用程序通过应用程序通过调用调用API来来请求操作系统完成一些低级服务请求操作系统完成一些低级服务;在Windows图形用户界面中,应用程序的应用程序的窗窗口、图标、菜单和对话框口、图标、菜单和对话框等都是等都是由由API来进来进行管理和维护行管理和维护的;的;7.2.1 API和SDKWindows APIWindows API有两种基本类型:有两种基本类型:Win16 Win16 APIAPI和和Win32 APIWin32 API;两者在很多方面都非常相似,但两者在很多方面都非常相似,但Win32 Win32 APIAPI几乎包括了几乎包括了Win16 APIWin16 API中的所有内中的所有内容,还增加了很多其他内容。容,还增加了很多其他内容。7.2.1 API和SDK2 SDKWindowsSDKWindowsSDKWindows Software Windows Software Development KitDevelopment Kit,WindowsWindows软件开软件开发工具套件。发工具套件。SDKSDK和和APIAPI结合起来,形成一套帮助结合起来,形成一套帮助C+C+语言程序员创建语言程序员创建WindowsWindows应用程应用程序的工具包序的工具包7.2.1 API和SDKSDKSDK包括以下几个组成部分:包括以下几个组成部分:1)1)大量的在线帮助,帮助描述了大量的在线帮助,帮助描述了WindowsWindows编程用到的函数消息结构宏及其他资编程用到的函数消息结构宏及其他资源;源;2)2)各各种种编编程程工工具具,比比如如对对话话框框编编辑辑器器及及图标编辑器等;图标编辑器等;3)3)WindowsWindows库及头文件;库及头文件;4)4)使用使用C+C+语言编写的示例程序语言编写的示例程序。7.2.1 API和SDK MFC提供了对提供了对Win32 API的比较完整的封的比较完整的封装,对于编写装,对于编写Windows程序更加方便和高效。程序更加方便和高效。但在某些情况下直接调用但在某些情况下直接调用Win32 API可以获可以获得更高的执行效率,有更大的自由度,但对得更高的执行效率,有更大的自由度,但对程序员要求比较高。程序员要求比较高。使用使用MFC编写编写Windows应用程序与使用应用程序与使用SDK编写的同一程序相比,编写的同一程序相比,MFC隐藏了大隐藏了大量的复杂操作,降低了编程的难度。量的复杂操作,降低了编程的难度。但使用但使用SDK编写编写Windows应用程序,可以应用程序,可以很好的学习和掌握很好的学习和掌握Windows程序的运行处理程序的运行处理机制。机制。7.2.2 Windows API应用程序的组成应用程序的组成 Windows API Windows API应用程序主要由应用程序主要由入入口函数口函数WinMainWinMain和窗口函数和窗口函数构成,构成,其中还包括各种其中还包括各种数据类型、数数据类型、数据结构与函数据结构与函数;7.2.2 Windows API应用程序的组成应用程序的组成1 1 入口函数入口函数WinMain()WinMain():WinMain()WinMain()函数是所有函数是所有 Windows Windows 应用程序的应用程序的入口入口,与与C C 语言程序中的语言程序中的 main()main()函数类似函数类似,功能为完成功能为完成初始化操作初始化操作,并产生消息循环;并产生消息循环;WinMain()WinMain()函数有函数有3 3个基本组成部分:个基本组成部分:函数说明函数说明 初始化及消息循环初始化及消息循环-函数执行部分函数执行部分7.2.2 Windows API应用程序的组成应用程序的组成(1)(1)函数说明函数说明 WinMain()WinMain()函数的声明语句如下:函数的声明语句如下:int WINAPI WinMain(int WINAPI WinMain(HINSTANCE hInstance,/HINSTANCE hInstance,/程序实例句柄程序实例句柄 HINSTANCE hPrevInstance,/HINSTANCE hPrevInstance,/为保持与为保持与Win16Win16兼容的句柄兼容的句柄 LPSTR lpCmdLIne,/LPSTR lpCmdLIne,/命令行参数命令行参数 int nCmdShow /int nCmdShow /初始化窗口显示方式初始化窗口显示方式 )HINSTANCE:HINSTANCE:LPSTR:LPSTR:7.2.2 Windows API应用程序的组成应用程序的组成其中:其中:hInstancehInstance为标识当前进程的为标识当前进程的实例句柄实例句柄,在很多,在很多Windows APIWindows API中,都中,都要将作为一个参数进行传递,在应用程序中一般将它要将作为一个参数进行传递,在应用程序中一般将它保存在全局变量保存在全局变量中;中;hPrevInstancehPrevInstance是应用程序为是应用程序为1616为为WindowsWindows保持兼容的一个句柄,保持兼容的一个句柄,在在Win32Win32中,这个参数值为中,这个参数值为NULLNULL;lpCmdLInelpCmdLIne是命令行参数是命令行参数,其功能与,其功能与mainmain()函数中的()函数中的argvargv相似;相似;int main(int argc,char*argv)int main(int argc,char*argv)/*argc 是外部命令参数的个数是外部命令参数的个数;argvargv存放存放外部命令参数外部命令参数*/nCmdShownCmdShow 用于指定应用程序主窗口的显示方式,包括最用于指定应用程序主窗口的显示方式,包括最大化、最小化、一般化显示。大化、最小化、一般化显示。7.2.2 Windows API应用程序的组成应用程序的组成(2)(2)初始化初始化 通常是为窗口类的成员变量赋初值通常是为窗口类的成员变量赋初值,以便创建窗口。以便创建窗口。(3)(3)消息循环消息循环 采采用用消消息息循循环环接接收收消消息息,在在APIAPI编编程程中中消消息息循循环一般采用环一般采用whilewhile循环语句来实现。循环语句来实现。其一般格式为:其一般格式为:while(while(GetMessage(&msgTmp,NULL,0,0)GetMessage(&msgTmp,NULL,0,0)/)/消息循环消息循环 TranslateMessage(&msgTmp);TranslateMessage(&msgTmp);/翻译消息翻译消息 DispatchMessage(&msgTmp);DispatchMessage(&msgTmp);/将消息传递给处理函数将消息传递给处理函数 注:变量注:变量msgTmpmsgTmp是一个是一个MSGMSG类型的结构对象。类型的结构对象。7.2.2 Windows API应用程序的组成应用程序的组成GetMessage(&msgTmp,NULL,0,0)GetMessage(&msgTmp,NULL,0,0);第一个参数:是要接收消息的第一个参数:是要接收消息的MSGMSG结构的结构的地址;地址;第二个参数:表示第二个参数:表示窗口句柄,窗口句柄,NULLNULL表示要获取表示要获取该应用程序创建的该应用程序创建的所有窗口的消息;所有窗口的消息;第三个和第四个参数:指定消息范围。第三个和第四个参数:指定消息范围。后三个参数被设置为默认值表示接收发送到属于后三个参数被设置为默认值表示接收发送到属于这个应用程序的这个应用程序的任何一个窗口的所有消息;任何一个窗口的所有消息;在接收到除在接收到除WM_QUITWM_QUIT之外的任何一个消息后,之外的任何一个消息后,GetMessageGetMessage()()都返回都返回TRUETRUE;如果如果CetMessage()CetMessage()收到一个收到一个WM_QUITWM_QUIT消息,则返回消息,则返回FALSEFALSE,结束消息循环。结束消息循环。7.2.2 Windows API应用程序的组成应用程序的组成TranslateMessage(TranslateMessage(&msgTmp&msgTmp);TranslateMessage()TranslateMessage()函数对接收到的消息进行翻函数对接收到的消息进行翻译,主要是转换成一些键盘消息并为窗口产生相译,主要是转换成一些键盘消息并为窗口产生相应的应的ASCIIASCII字符消息;字符消息;DispatchMessage(DispatchMessage(&msgTmp&msgTmp);DispatchMessage()DispatchMessage()函数要求函数要求WindowsWindows将消息将消息传送给在传送给在MSGMSG结构中为窗口所指定的结构中为窗口所指定的窗口过窗口过程函数程函数;WindowsWindows将会调用窗口过程函数来处理接收将会调用窗口过程函数来处理接收到的消息;在处理完消息后,又循环到开始到的消息;在处理完消息后,又循环到开始处去接收另一个消息,处去接收另一个消息,7.2.2 Windows API应用程序的组成应用程序的组成2 2 窗口过程函数窗口过程函数 WndProc()WndProc()窗口过程函数用来处理消息。窗口过程函数用来处理消息。此函数的声明如下此函数的声明如下:LRESULT CALLBACK WndProc(LRESULT CALLBACK WndProc(HWND hWnd,/HWND hWnd,/窗口句柄窗口句柄 UINT nMessage,/UINT nMessage,/所发出的消息所发出的消息 ,消息,消息IDIDWPARAM wParam,/WPARAM wParam,/参数参数1 1 LPARAM lParam /LPARAM lParam /参数参数2 2)注:注:这个函数的参数与这个函数的参数与MSGMSG结构的前结构的前4 4个成员相同;个成员相同;如果消息处理成功如果消息处理成功,WndProcWndProc返回值为返回值为0 0;WndProc()函数中采用函数中采用switch实现消息的处理实现消息的处理 LRESULTLRESULTswitch(nMessage)/响应响应WM_LBUTTONDOWN消息(鼠标左键被按下的消息)消息(鼠标左键被按下的消息)case WM_LBUTTONDOWN:MessageBox(hWnd,收到收到WM_LBUTTONDOWN消息消息!,通知通知,MB_OK);break;/响应响应WM_CREATE消息(创建被调用的函数消息)消息(创建被调用的函数消息)case WM_CREATE:MessageBox(hWnd,收到收到WM_CREATE消息消息!,通知通知,MB_OK);break;/响应响应WM_DESTROY消息(清除调用的函数消息)消息(清除调用的函数消息)case WM_DESTROY:MessageBox(hWnd,收到收到WM_DESTROY消息消息!,通知通知,MB_OK);PostQuitMessage(0);break;/必须调用函数必须调用函数DefWindowProc(),这是,这是Windows系统所规定的系统所规定的default:return DefWindowProc(hWnd,nMessage,wParam,lParam);7.2.3 API程序实例程序实例 例例7.27.2用用APIAPI编程实现应用程序编程实现应用程序窗口要求在窗口中响应鼠标左窗口要求在窗口中响应鼠标左键,鼠标右键,窗口生成和窗键,鼠标右键,窗口生成和窗口关闭的四个消息;口关闭的四个消息;7.2.3 API程序实例程序实例用用VC+6.0VC+6.0开发开发APIAPI应用程序有两种方法:应用程序有两种方法:在在任任何何文文本本编编辑辑器器中中编编辑辑源源程程序序文文件件和和头头文文件件然然后后再再加加入入Visual Visual C+C+6.06.0的工程中;的工程中;VC+6.0VC+6.0的的工工程程中中添添加加源源程程序序文文件件和和头头文文件件,然然后后再再利利用用VC+6.0VC+6.0的的编编辑辑器器进进行编辑,最后再进行编译和运行;行编辑,最后再进行编译和运行;7.2.3 API程序实例程序实例第二种方法的具体操作步骤:第二种方法的具体操作步骤:1 1、创建、创建Win32 Application:Win32 Application:7.2.3 API程序实例程序实例2 2、在接下来的对话框中选择、在接下来的对话框中选择“An empty An empty projectproject”;单击;单击“完成完成”按钮,随即显示按钮,随即显示项目相关信息,在单击项目相关信息,在单击“确定确定”按钮。即建按钮。即建立一个空的项目。立一个空的项目。3 3、加入源文件;、加入源文件;4 4、在各源文件中输入相应的代码;、在各源文件中输入相应的代码;5 5、最后编译,执行程序。、最后编译,执行程序。7.3 MFC编程编程 MFC(MFC(Microsoft Foundation Microsoft Foundation Class LibraryClass Library)-微软基础类库微软基础类库7.3.1 MFCMFC简介简介q MFCMFC是是C+C+的类集的类集,MFCMFC提供面向对提供面向对象框架,程序员可使用这一框架容象框架,程序员可使用这一框架容易地创建易地创建WindowsWindows应用程序;应用程序;qMFCMFC按照面向对象的观点,以类的按照面向对象的观点,以类的层次形式进行组织,高层类提供一层次形式进行组织,高层类提供一般功能,低层类实现更具体的行为;般功能,低层类实现更具体的行为;q每一个低层类都是从高层类中派生每一个低层类都是从高层类中派生而来并且继承了高层类的行为;而来并且继承了高层类的行为;例如:例如:qCWndCWnd类是实现了类是实现了WindowsWindows窗口中的大多数常窗口中的大多数常用功能的高层类,具备的功能包括打印文本用功能的高层类,具备的功能包括打印文本、绘制图形以及跟踪鼠标指针的移动等;、绘制图形以及跟踪鼠标指针的移动等;qCSPlitterWnd类实现一种拆分器的特殊窗类实现一种拆分器的特殊窗口,拆分器窗口至少可以拆分成两个窗格,口,拆分器窗口至少可以拆分成两个窗格,用户可以移动这两个窗格之间的边框来调整用户可以移动这两个窗格之间的边框来调整窗口大小。窗口大小。CSPlitterWnd类是从高层类类是从高层类CWnd中派生而来的低层类。中派生而来的低层类。7.3.1 MFC简介简介7.3.1 MFC简介简介q MFCMFC能处理很多与能处理很多与WindowsWindows相关相关的常见任务,无需在所开发的的常见任务,无需在所开发的每一个每一个WindowsWindows应用程序中编写应用程序中编写相同的消息处理循环。相同的消息处理循环。qMFCMFC可以实现消息循环并提供易可以实现消息循环并提供易学易用的成员函数。学易用的成员函数。q如在如在OnLButtonDown()OnLButtonDown()中插入代中插入代码,可以处理窗口消息;码,可以处理窗口消息;7.3.1 MFC简介简介qMFCMFC还提供应用程序开发模型。还提供应用程序开发模型。q此模型称为文档此模型称为文档/视图模型视图模型q文档文档/视图模型是将应用程序数视图模型是将应用程序数据与用户界面元素分离的一种据与用户界面元素分离的一种应用程序方法;应用程序方法;q它允许这两部分程序独立存在。它允许这两部分程序独立存在。7.3.1 MFC简介简介q MFCMFC采用了采用了Windows APIWindows API中的一些功能,并为程序中的一些功能,并为程序员提供更友好的员提供更友好的C+C+类,使之更易于使用;类,使之更易于使用;qMFCMFC在后台执行一些复杂的操作,而向开发人员提在后台执行一些复杂的操作,而向开发人员提供简单的编程界面,掩盖了供简单的编程界面,掩盖了WindowsAPIWindowsAPI的一些缺的一些缺点。点。q MFCMFC由很多由很多C+C+类组成,其中有些类例如类组成,其中有些类例如CWndCWnd或或CWinThreadCWinThread是整个框架中大部分内容的基础,这是整个框架中大部分内容的基础,这些基类封装了基本功能,如大多数些基类封装了基本功能,如大多数WindowsWindows应用程应用程序都需要的打开窗口功能。序都需要的打开窗口功能。q还有其他更专用的类,例如还有其他更专用的类,例如 CSplitterWndCSplitterWnd是从这是从这些基类中派生而来的;些基类中派生而来的;q派生类继承了父类的所有特性,并增加一些自己派生类继承了父类的所有特性,并增加一些自己的功能。的功能。7.3.2 MFCMFC的主要类的主要类 1 MFC1 MFC类库中的主要类类库中的主要类(1)(1)根类根类 CObjectCObject类:类:CObjectCObject类是类是MFCMFC的的抽象基类抽象基类,是,是 MFCMFC中大多数类及用户自定子类的中大多数类及用户自定子类的根类根类,为程序员提供了许多公共操,为程序员提供了许多公共操作,这些操作包括:对象的建立和作,这些操作包括:对象的建立和删除,对象诊断,输出运行时信息删除,对象诊断,输出运行时信息等;等;7.3.2 MFCMFC的主要类的主要类(2)(2)应用程序体系结构类应用程序体系结构类 这这些些类类用用于于构构造造出出应应用用程程序序的的结结构构,提提供供多多数数应应用用程程序序共共用用的的功功能能,这这样样便便实实现现了了编编写写程程序序的的任任务务,就就是是填填充充框框架架,添添加加应应用用程程序序专专用用的的功功能能,简简化化了应用程序的开发;了应用程序的开发;应用程序体系结构类包含以下应用程序体系结构类包含以下3 3个基本类。个基本类。7.3.2 MFCMFC的主要类的主要类命令相关类命令相关类 CCmdTargetCCmdTarget CCmdTargetCCmdTarget是是CObjectCObject的的子子类类是是MFCMFC库库中中所所有具有消息映像属性的类的基类;有具有消息映像属性的类的基类;消消息息映映像像规规定定了了当当一一对对象象接接收收到到消消息息命命令令时应调用哪一个函数对该消息进行处理;时应调用哪一个函数对该消息进行处理;程序员不必从程序员不必从CCmdTargetCCmdTarget类直接派生新类。类直接派生新类。一一般般都都是是从从CCmdTargetCCmdTarget的的子子类类中中派派生生出出新新类类,如如窗窗口口类类(CWnd)CWnd)应应用用程程序序类类(CWinApp)CWinApp)文文档档 模模 板板 类类 (CDocTemplate)CDocTemplate)文文 档档 类类(Cdocument)Cdocument)及视图类及视图类(Cview)Cview)等;等;7.3.2 MFCMFC的主要类的主要类窗口应用程序类窗口应用程序类 CWinAppCWinApp每每个个应应用用程程序序有有且且只只有有一一个个应应用用程程序序对对象象,用用于于运运行程序时此对象与其他对象相互协调;行程序时此对象与其他对象相互协调;应用程序对象从应用程序对象从CWinAppCWinApp类中派生出来;类中派生出来;窗窗口口应应用用程程序序类类封封装装了了初初始始化化运运行行终终止止应应用用程程序序的代码;的代码;7.3.2 MFCMFC的主要类的主要类文档文档/视图类视图类文文档档对对象象是是由由文文档档模模板板对对象象所所创创建建的的用用于于管管理应用程序的数据;理应用程序的数据;视视图图对对象象表表示示一一个个窗窗口口的的用用户户区区显显示示文文档档数数据并允许用户与其交互;据并允许用户与其交互;文档文档/视图类包括以下视图类包括以下子类或模板子类或模板:1)1)CDocTemplateCDocTemplate 文文档档模模板板的的基基类类,文文档档模模板板用于协调文档、视图和框架窗口的创建;用于协调文档、视图和框架窗口的创建;2)2)CSingleDocTemplateCSingleDocTemplate 单单文文档档界界面面SDISDI的的文文档模板;档模板;3)3)CMultiDocTemplateCMultiDocTemplate多多文文档档界界面面MDIMDI的的文文档档模模板;板;4)4)CDocumentCDocument应用程序专用文档的基类;应用程序专用文档的基类;5)5)CViewCView用用于于显显示示文文档档数数据据的的应应用用程程序序专专有有视视图的基类;图的基类;7.3.2 MFCMFC的主要类的主要类2 2 可视对象类:可视对象类:(1 1)窗口类)窗口类 CWndCWnd CWndCWnd类提供了类提供了MFCMFC中所有窗口类的基本功能,中所有窗口类的基本功能,是是CCmdTargetCCmdTarget类的子类;类的子类;创建一个创建一个WindowsWindows窗口要分两步进行:窗口要分两步进行:1)1)构造一个构造一个CWndCWnd对象;对象;2)2)调调用用CreateCreate建建立立WindowsWindows窗窗口口并并将将它它连连到到CWndCWnd对对象上;象上;7.3.2 MFCMFC的主要类的主要类 MFCMFC中中还还包包括括从从CWndCWnd类类派派生生出出来来的的进进一一步步的的窗窗口口类类型型,以以完完成成更更具具体体的的窗窗口口创创建建工工作,这些派生类有:作,这些派生类有:CFrameWndCFrameWnd:框框架架窗窗口口类类是是SDISDI应应用用程程序主框架窗口的基类