《第4章 MFC面向对象设计(精品).ppt》由会员分享,可在线阅读,更多相关《第4章 MFC面向对象设计(精品).ppt(69页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、MFC面向对象设计面向对象设计计算机科学与技术学院计算机科学与技术学院 曲立平曲立平Email:Page 2 WIN32 API概述概述1 WIN32 API基本概念基本概念2 WIN32 API应应用用程程序序框框架架3 WIN32 API程序示例程序示例4 MFC应用程序框架应用程序框架5 MFC对对WIN32 API的封装的封装6 文档文档/视图视图7哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 5WIN32 API概述概述 应用程序应用程序 操作系统操作系统 输入输出设备输入输出设备 消息队列消息队列 系统调用系统调用Windows API哈尔滨工程大学
2、计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 6WIN32 API概述概述v在在Windows核心中有三个动态链接库构成了核心中有三个动态链接库构成了Win32 API的主体:的主体:USER32.DLL负责负责窗口窗口管理,包括消息、菜单、光标、通信、计管理,包括消息、菜单、光标、通信、计时器和其他控制显示窗口的函数。时器和其他控制显示窗口的函数。GDI32.DLL图形图形设置接口,负责管理用户界面的生成和图形绘设置接口,负责管理用户界面的生成和图形绘制,主要包括设置描述表、字体、位图等。制,主要包括设置描述表、字体、位图等。KERNEL32.DLLWindows的核心服务
3、,负责管理的核心服务,负责管理内存内存调度、调度、进度进度调度等底层功能。调度等底层功能。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 7 WIN32 API概述概述1 WIN32 API基本概念基本概念2 WIN32 API应应用用程程序序框框架架3 WIN32 API程序示例程序示例4 MFC应用程序框架应用程序框架5 MFC对对WIN32 API的封装的封装6 文档文档/视图视图7哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 8WIN32 API基本概念基本概念1.句柄(句柄(HANDLE)vWindows系统中系统中对象或
4、实例对象或实例的标识。的标识。v这些对象包括这些对象包括模块模块、应用程序实例应用程序实例、窗口窗口、控制控制、位位图图、GDI对象对象、资源资源、文件文件等。等。vWindows程序并不是用物理地址来标识一个文件或动程序并不是用物理地址来标识一个文件或动态装入模块的,而是为这些态装入模块的,而是为这些对象分配确定的句柄对象分配确定的句柄,并,并将句柄将句柄返回给应用程序返回给应用程序,然后通过句柄来对对象进行,然后通过句柄来对对象进行操作。操作。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 9WIN32 API基本概念基本概念句柄句柄类型类型含义含义句柄句柄类
5、型类型含义含义HANDLE对象句柄(通用)HPEN画笔句柄HWND窗口句柄HBRUSH画刷句柄HINSTANCE应用程序实例句柄HBITMAP位图句柄HDC设备环境句柄HICON图标句柄HCURSOR光标句柄HMENU菜单句柄HFONT字体句柄HFILE文件句柄哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 10WIN32 API基本概念基本概念2.常用数据类型常用数据类型数据类型数据类型含义含义数据类型数据类型含义含义BOOL布尔值,布尔值,TRUE或或FALSELPARAM32位整数位整数BYTE8位无符号整数位无符号整数LPCSTR32位指针,指向一个常数字
6、位指针,指向一个常数字符串符串COLORREF代表颜色的代表颜色的32位无符号整数位无符号整数LPSTR32位指针,指向一个字符串位指针,指向一个字符串DWORD32位无符号整位无符号整数数LPCTSTR32位指针,指向一个常数字位指针,指向一个常数字符串,可以移植到符串,可以移植到Unicode和和DBCS哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 11WIN32 API基本概念基本概念2.常用数据类型常用数据类型数据类型数据类型含义含义数据类型数据类型含义含义LONG32位整数位整数LPTSTR32位指针,指向一个字符串,位指针,指向一个字符串,可以移植到
7、可以移植到Unidcode和和DBCSLPVOID32位指针,指位指针,指向一个未指定类向一个未指定类型的数据型的数据WORD16位无符号整数位无符号整数UINT32位无符号整位无符号整数数WPARAM32位无符号整数位无符号整数WNDPROC32位指针,指位指针,指向一个窗口函数向一个窗口函数哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 12WIN32 API基本概念基本概念3.消息机制与事件驱动消息机制与事件驱动vWindows程序设计与程序设计与DOS最大的不同就在于最大的不同就在于事件驱动事件驱动。v应用程序的工作是应用程序的工作是产生消息产生消息、传递
8、消息传递消息和和处理消息处理消息。v程序的流程不是由事件的顺序来控制,而是由程序的流程不是由事件的顺序来控制,而是由事件的事件的触发触发来控制。来控制。v事件的发生是随机的、不确定的,并没有预定的顺序,事件的发生是随机的、不确定的,并没有预定的顺序,允许允许用户来安排用户来安排。vWindows是一种以是一种以消息为基础消息为基础的的事件驱动系统事件驱动系统,消息,消息是应用程序运行的动力源泉。是应用程序运行的动力源泉。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 13WIN32 API基本概念基本概念v一个一个消息消息是系统定义的一个是系统定义的一个32位的值
9、位的值,它唯一地定义,它唯一地定义了了一个事件一个事件,向,向Windows发出一个通知,告诉应用程发出一个通知,告诉应用程序某个事件发生了。序某个事件发生了。vWindows应用程序的应用程序的运行运行是依靠是依靠外部发生的事件来驱外部发生的事件来驱动动的。的。v在在Windows应用程序中,应用程序中,窗口是处理消息的主角窗口是处理消息的主角。一。一个个Windows应用程序一定会有窗口和消息循环。窗口应用程序一定会有窗口和消息循环。窗口一旦创建,系统就会给线程一旦创建,系统就会给线程分配消息队列分配消息队列,用于消息,用于消息的派送。的派送。v消息分为消息分为队列消息队列消息和和非队列消
10、息非队列消息。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 14WIN32 API基本概念基本概念v从消息的来源来看从消息的来源来看系统定义系统定义的消息的消息消息消息ID的范围:的范围:0-WM_USER-1(0X0400);用户定义用户定义的消息的消息消息消息ID的范围:的范围:WM_USER(0X0400)-0X7FFF;vWindows消息分为:消息分为:标准标准Windows消息消息命令命令消息消息控件控件通知消息通知消息操作系统是怎样操作系统是怎样将感知到的事件将感知到的事件传递给应用程序传递给应用程序的呢?的呢?哈尔滨工程大学计算机科学与技术学院哈
11、尔滨工程大学计算机科学与技术学院Page 15标准标准Windows消息消息v以以WM_为前缀(除为前缀(除WM_COMMAND外)。外)。宏名称宏名称对应消息对应消息消息处理函数消息处理函数ON_WM_CHARWM_CHAROnCharON_WM_CLOSEWM_CLOSEOnCloseON_WM_CREATEWM_CREATEOnCreateON_WM_DESTROYWM_DESTORYOnDestroyON_MOUSEMOVEWM_MOUSEMOVEOnMouseMoveON_WM_PAINTWM_PAINTOnPaint哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学
12、院Page 16命令消息和控件通知消息命令消息和控件通知消息v命令消息以命令消息以WM_COMMAND为消息名,在消息名中含为消息名,在消息名中含有有命令的标志符命令的标志符ID,以区分命令由何种对象产生。一般,以区分命令由何种对象产生。一般对应规则为对应规则为ON_COMMAND(,)ON_COMMAND(IDM_ABOUT,OnAbout)ON_COMMAND(IDM_FILENEW,OnFileNew)ON_COMMAND(IDM_FILEOPEN,OnFileOpen)ON_COMMAND(IDM_SAVE,OnSave)v控件通知消息是由控件通知消息是由编辑框编辑框、列表框列表框等子
13、窗口发送给父窗等子窗口发送给父窗口的通知消息。口的通知消息。以以WM_COMMAND形式出现。形式出现。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 17v操作系统将每个事件都包装成一个称为消息的结构体操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序,参看来传递给应用程序,参看MSDN。vMSG结构结构定义如下:定义如下:typedef struct tagMSG HWND hwnd;/接受该消息的接受该消息的窗口句柄窗口句柄 UINT message;/消息消息标识标识 WPARAM wParam;/32位消息的位消息的附加信息附加信息 L
14、PARAM lParam;/32位消息的位消息的附加信息附加信息 DWORD time;/消息消息创建创建时的时的时间时间 POINT pt;/消息创建时的消息创建时的鼠标鼠标/光标光标在屏幕中的在屏幕中的位置位置 MSG;v窗口负责接受并处理消息。窗口负责接受并处理消息。v每一个窗口都应该有相应的函数来处理消息,即所谓的窗每一个窗口都应该有相应的函数来处理消息,即所谓的窗口处理函数(口处理函数(Windows procedure),窗口函数根据消),窗口函数根据消息的类别决定其处理的方式。息的类别决定其处理的方式。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page
15、18哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 19 WIN32 API概述概述1 WIN32 API基本概念基本概念2 WIN32 API应应用用程程序序框框架架3 WIN32 API程序示例程序示例4 MFC应用程序框架应用程序框架5 MFC对对WIN32 API的封装的封装6 文档文档/视图视图7哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 20WIN32 API应用程序框架应用程序框架1.应用程序入口应用程序入口v每一个每一个Windows应用程序都必须有一个应用程序都必须有一个WinMain函函数数作为程序的入口。作为
16、程序的入口。vWinMain函数函数声明声明如下:如下:int WMain(HINSTANCE hInstance;/当前应用程序当前实例句柄当前应用程序当前实例句柄HINSTANCE hPrevInstance;/前一个应用程序实例句柄前一个应用程序实例句柄LPSTR lpCmdLine;/指向当前应用程序命令行的指针指向当前应用程序命令行的指针int nCmdShow)/应用程序窗口的显示方式应用程序窗口的显示方式哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 21WIN32 API应用程序框架应用程序框架2.消息循环消息循环v每一个每一个Windows应用程
17、序都应有一个处理消息的循环。应用程序都应有一个处理消息的循环。MSG msg;while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);/转换键盘消息转换键盘消息 DispatchMessage(&msg);/分派消息分派消息 哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 22WIN32 API应用程序框架应用程序框架WIN32 API应用程序的消息流动过程应用程序的消息流动过程哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 23WIN32 API应用程序框架应用程序框架3.窗口函数
18、窗口函数v作用:作用:处理消息处理消息。v利用利用switch/case判断消息的种类,以决定采用判断消息的种类,以决定采用自定自定义消息义消息的处理方式,或使用的处理方式,或使用DefWindowProc将消息将消息交给交给操作系统进行默认处理操作系统进行默认处理。v被定义为被定义为回调(回调(CALLBACK)函数)函数,当应用程序获得,当应用程序获得到消息后由操作系统所调用。到消息后由操作系统所调用。v窗口函数的窗口函数的名称可以是任意的名称可以是任意的,但其,但其函数形式必须一函数形式必须一致致。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 24WIN3
19、2 API应用程序框架应用程序框架v窗口函数的函数形式:窗口函数的函数形式:LRESULT CALLBACK WndProc(HWND hwnd,/派送消息的窗口句柄派送消息的窗口句柄 UINT message,/消息标识消息标识 WPARAM wParam,/32位消息的附加信息位消息的附加信息 LPARAM lParam)/32位消息的附加信息位消息的附加信息v开发人员可以在开发人员可以在窗口函数内部添加消息处理代码窗口函数内部添加消息处理代码,以,以使应用程序能够响应消息并在消息处理代码中完成所使应用程序能够响应消息并在消息处理代码中完成所要求的任务。要求的任务。哈尔滨工程大学计算机科学
20、与技术学院哈尔滨工程大学计算机科学与技术学院Page 25WIN32 API应用程序框架应用程序框架4.窗口类窗口类v在创建应用程序窗口之前,必须在创建应用程序窗口之前,必须先注册窗口类先注册窗口类。v注册窗口类的方法是先注册窗口类的方法是先设置设置WNDCLASS结构结构的信息,的信息,然后用指向然后用指向WNDCLASS结构的结构的指针作为参数指针作为参数调用调用RegisterClass函数。函数声明如下:函数。函数声明如下:BOOL RegisterClass(WNDCLASS*wc)哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 26WNDCLASS结构
21、类型声明结构类型声明typedef struct tagWNDCLASS UINT style;/窗口类的样式,一般设置为窗口类的样式,一般设置为0 WNDPROC lpfnWndProc;/指向窗口函数的指针指向窗口函数的指针 int cbClsExtra;/分配在窗口类结构后的字节数分配在窗口类结构后的字节数 int cbWndExtra;/分配在窗口实例后的字节数分配在窗口实例后的字节数 HINSTANCE hInstance;/定义窗口类的应用程序的实例句柄定义窗口类的应用程序的实例句柄 HICON hIcon;/窗口类的图标句柄窗口类的图标句柄 HCURSOR hCursor;/窗口
22、类的光标窗口类的光标 HBRUSH hbrBackground;/窗口类的背景刷窗口类的背景刷 LPCSTR lpszMenuName;/窗口类的菜单名窗口类的菜单名 LPCSTR lpszClassName;/窗口类名窗口类名WNDCLASS;哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 27WIN32 API应用程序框架应用程序框架5.窗口的创建与显示窗口的创建与显示v使用使用CreateWindow函数可以创建窗口。函数可以创建窗口。v成功创建窗口后,该函数返回窗口的句柄。成功创建窗口后,该函数返回窗口的句柄。v使用使用CreateWindow函数创建窗口
23、后,窗口的显示函数创建窗口后,窗口的显示由由ShowWindow和和UpdateWindow两个函数实现。两个函数实现。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 28CreateWindow函数函数HWND CreateWindowExW(LPCWSTR lpClassName,/窗口类名窗口类名LPCWSTR lpWindowName,/窗口实例的标题窗口实例的标题DWORD dwStyle,/窗口风格窗口风格int X,/窗口左上角坐标窗口左上角坐标xint Y,/窗口左上角坐标窗口左上角坐标yint nWidth,/窗口的宽度窗口的宽度int nHei
24、ght,/窗口的高度窗口的高度HWND hWndParent,/父窗口的句柄父窗口的句柄HMENU hMenu,/主菜单的句柄主菜单的句柄HINSTANCE hInstance,/应用程序实例句柄应用程序实例句柄LPVOID lpParam);/该值为该值为NULL哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 29vShowWindow函数声明:函数声明:BOOL ShowWindows(HWND hWnd,/窗口句柄窗口句柄int nCmdShow);/窗口显示方式窗口显示方式vUpdateWindow函数声明:函数声明:BOOL UpdateWindows(
25、HWND hWnd);/窗口句柄窗口句柄ShowWindow和和UpdateWindow哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 306.WIN32 API程序执行流程程序执行流程WIN32 API应用程序框架应用程序框架注册窗口类注册窗口类RegisterClass创建主窗口创建主窗口CreateWindow消息循环消息循环捕获消息捕获消息GetMessageTranslateMessageDispatchMessage处理消息处理消息窗口函数窗口函数程序出口点(程序出口点(WinMain返回)返回)程序入口点程序入口点Int WINAPI WinMain
26、(hInstance,hPrevInstance,szCmdLine,iCmdShow)显示主窗口显示主窗口ShowWindowUpdateWindow哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 31 WIN32 API概述概述1 WIN32 API基本概念基本概念2 WIN32 API应应用用程程序序框框架架3 WIN32 API程序示例程序示例4 MFC应用程序框架应用程序框架5 MFC对对WIN32 API的封装的封装6 文档文档/视图视图7哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 32v以传统的以传统的WIN32 A
27、PI编写编写Windows应用程序时应用程序时面对大量繁杂的面对大量繁杂的底层操作底层操作和和WIN32 API函数;函数;清晰清晰了解了解Windows应用程序应用程序运行运行和和消息传递流程消息传递流程。vMFC编写应用程序时编写应用程序时WinMain、消息循环、窗口函数等、消息循环、窗口函数等封装封装到应用程序到应用程序框架框架中;中;表面看很表面看很难分析难分析出其本质。出其本质。WIN32 API程序示例程序示例哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 33 WIN32 API概述概述1 WIN32 API基本概念基本概念2 WIN32 API应
28、应用用程程序序框框架架3 WIN32 API程序示例程序示例4 MFC应用程序框架应用程序框架5 MFC对对WIN32 API的封装的封装6 文档文档/视图视图7哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 34MFC应用程序框架应用程序框架1.MFC概述概述v类库类库是一个可以在应用程序中使用的相互关联的类的是一个可以在应用程序中使用的相互关联的类的集合。集合。v应用程序框架是类库的超集应用程序框架是类库的超集。是一组凝聚性极强、组。是一组凝聚性极强、组织性极强的类的集合。织性极强的类的集合。v应用程序框架提供一个应用程序框架提供一个可以重复使用的框架模式可以
29、重复使用的框架模式,其,其中定义了系统内部信息的交互、消息的传递、系统与中定义了系统内部信息的交互、消息的传递、系统与使用者之间的交互,以及应用程序的结构、流程和模使用者之间的交互,以及应用程序的结构、流程和模型。型。vMFC(Microsoft Foundation Class Libaray)是是Windows环境流行的应用程序框架之一。环境流行的应用程序框架之一。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 35MFC应用程序框架应用程序框架利用面向对象原理,对利用面向对象原理,对WIN32 API进行逻辑化组进行逻辑化组织织,使其具备抽象化、模块化、继承
30、性、多态性等,使其具备抽象化、模块化、继承性、多态性等特征。特征。对对95%以上以上WIN32 API进行面向对象封装。进行面向对象封装。应用面向对象特性和设计模式概念,为生成一般应应用面向对象特性和设计模式概念,为生成一般应用程序所必需的各种面向对象软件组件和程序框架用程序所必需的各种面向对象软件组件和程序框架结构进行结构进行高度抽象高度抽象。允许在应用程序中允许在应用程序中直接调用直接调用WIN32 API,为开发,为开发人员提供了灵活性。人员提供了灵活性。MFC的目的是使开发人员在此基础上快速、高效地的目的是使开发人员在此基础上快速、高效地建立建立Windows应用程序。应用程序。开发人
31、员要做的是:开发人员要做的是:通过预定义的接口把具通过预定义的接口把具体应用程序特有的东西填入体应用程序特有的东西填入这个轮廓中,实现应用程序这个轮廓中,实现应用程序特定的逻辑。特定的逻辑。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 36MFC应用程序框架应用程序框架2.MFC类库类库v封装封装了了WIN32应用程序编程接口,封装了应用程序框应用程序编程接口,封装了应用程序框架结构、架结构、OLE特性、特性、ODBC和和DAO数据访问概念等。数据访问概念等。WIN32 API编程接口:使用编程接口:使用C+类类进行了封装。进行了封装。应用程序框架结构:将应用程
32、序框架结构:将WIN32 API中中定义窗口过定义窗口过程程、注册窗口类注册窗口类、创建窗口创建窗口等处理过程进行封装。等处理过程进行封装。MFC提出了以提出了以文档文档视图视图为中心的编程模式。将数为中心的编程模式。将数据的管理和对数据的显示分离。据的管理和对数据的显示分离。vMFC还抽象出众多类的共同特性,设计出一些还抽象出众多类的共同特性,设计出一些基类基类作作为实现其他类的基础。为实现其他类的基础。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 37Cobject主要派生类的层次结构主要派生类的层次结构哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机
33、科学与技术学院Page 38只能有一个全局只能有一个全局CWinApp的对象。的对象。MFC应用程序运转的引擎。应用程序运转的引擎。InitApplication对应用程序初始化。对应用程序初始化。InitInstance对实例初始化。对实例初始化。调用调用CWinTread的的Run进行消息循环。进行消息循环。CObject及其派生类是及其派生类是使用使用MFC进行进行Windows程程序设计的主体。序设计的主体。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 39MFC中非中非Cobject派生类派生类Run-time Object Model Support
34、Typed Template CollectionsInternet Server APISimple Value TypesOLE Type WrappersStructuresSupport ClassesOLE Automation TypesSynchronization哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 40常见的全局函数常见的全局函数函数名称函数名称说明说明AfxWinInit由由WinMain调用的一个函数,用作调用的一个函数,用作MFC GUI程序初始化的一部分程序初始化的一部分AfxBeginThread开始一个新的线程开始一个新的线
35、程AfxEndThread结束一个线程结束一个线程AfxMessageBox显示一个消息提示窗口显示一个消息提示窗口AfxGetApp获得应用程序对象的指针获得应用程序对象的指针AfxGetMainWnd获得应用程序主窗口的指针获得应用程序主窗口的指针AfxGetInstance获得应用程序的实例句柄获得应用程序的实例句柄AfxRegisterClass以自定义的以自定义的WNDCLASS注册窗口类注册窗口类哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 41常见的宏常见的宏宏名称宏名称说明说明宏名称宏名称说明说明DECLARE_DYNAMIC运行时类信息运行时类
36、信息IMPLEMENT_OLECREATEOLE对象的动态创建对象的动态创建IMPLEMENT_DYNAMIC运行时类信息运行时类信息DECLARE_MESSAGE_MAP声明消息映射表的数声明消息映射表的数据结构据结构DECLARE_DYNCREATE动态创建动态创建BEGIN_MESSAGE_MAP开始建立消息映射表开始建立消息映射表IMPLEMENT_DYNCREATE动态创建动态创建ON_COMMAND增加消息映射表中的增加消息映射表中的项目项目DECLARE_SERIAL对象的读写对象的读写ON_MESSAGE增加消息映射表中的增加消息映射表中的项目项目IMPLEMENT_SERIA
37、L对象的读写对象的读写END_MESSAGE_MAP结束消息映射表的创结束消息映射表的创建建DECLARE_OLECAREATEOLE对象的动态创建对象的动态创建哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 42MFC应用程序框架应用程序框架3.MFC基础类基础类-Cobjectclass CObjectpublic:/与动态创建相关的函数与动态创建相关的函数virtual CRuntimeClass*GetRuntimeClass()const;/析构函数析构函数virtual CObject();/virtual destructors are necess
38、ary哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 43MFC应用程序框架应用程序框架/与构造函数相关的内存分配函数与构造函数相关的内存分配函数,可以用于可以用于DEBUG下输出诊断信息下输出诊断信息void*PASCAL operator new(size_t nSize);void*PASCAL operator new(size_t,void*p);void PASCAL operator delete(void*p);#if defined(_DEBUG)&!defined(_AFX_NO_DEBUG_CRT)void*PASCAL operator n
39、ew(size_t nSize,LPCSTR lpszFileName,int nLine);#endif哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 44MFC应用程序框架应用程序框架/缺省情况下,复制构造函数和赋值构造函数是不可用的。如果缺省情况下,复制构造函数和赋值构造函数是不可用的。如果/程序员通过传值或者赋值来传递对象,将得到一个编译错误程序员通过传值或者赋值来传递对象,将得到一个编译错误protected:/缺省构造函数缺省构造函数CObject();private:/拷贝构造函数拷贝构造函数CObject(const CObject&objectS
40、rc);/no implementation/赋值构造函数赋值构造函数void operator=(const CObject&objectSrc);/no implementation哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 45MFC应用程序框架应用程序框架/Attributespublic:/与运行时类信息、串行化相关的函数与运行时类信息、串行化相关的函数BOOL IsSerializable()const;BOOL IsKindOf(const CRuntimeClass*pClass)const;/序列化序列化virtual void Serial
41、ize(CArchive&ar);/诊断函数(仅在调试时有意义)诊断函数(仅在调试时有意义)virtual void AssertValid()const;virtual void Dump(CDumpContext&dc)const;哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 46MFC应用程序框架应用程序框架/Implementationpublic:/与动态创建对象相关的函数与动态创建对象相关的函数static const AFX_DATA CRuntimeClass classCObject;#ifdef _AFXDLLstatic CRuntimeC
42、lass*PASCAL _GetBaseClass();#endif;哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 47MFC应用程序框架应用程序框架vCObject对对诊断输出诊断输出的支持:的支持:vCObject对对运行时类信息运行时类信息的支持:的支持:用于在运行时确定一个用于在运行时确定一个对象是否属于对象是否属于一特定类(是一特定类(是该类的实例),或者从一个特定类该类的实例),或者从一个特定类派生派生来的。来的。CObject提供提供IsKindOf函数来实现这个功能。函数来实现这个功能。从从CObject派生的类要具有这样的特性,需要:派生的类要
43、具有这样的特性,需要:定义该类时,在定义该类时,在类说明类说明中使用中使用DECLARE_DYNAMIC(CLASSNMAE)宏;宏;在在类的实现文件中类的实现文件中使用使用IMPLEMENT_DYNAMIC(CLASSNAME,BASECLASS)宏。宏。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 48vCObject对对动态创建动态创建的支持:的支持:在运行时在运行时构造类的实例构造类的实例。从从CObject派生的类要具有动态创建的功能,需要:派生的类要具有动态创建的功能,需要:定义该类时,在定义该类时,在类说明类说明中使用中使用DECLARE_DYNC
44、REATE(CLASSNMAE)宏;宏;定义一个定义一个不带不带参数的构造函数参数的构造函数;在类的在类的实现文件实现文件中使用中使用IMPLEMENT_DYNCREATE(CLASSNAME,BASECLASS)宏;宏;使用时先通过使用时先通过宏宏RUNTIME_CLASS得到类的得到类的RunTime信息信息,然后使用,然后使用CRuntimeClass的成员函数的成员函数CreateObject创建一个该类的实创建一个该类的实例。例。MFC应用程序框架应用程序框架CRuntimeClass*pRuntimeClass=RUNTIME_CLASS(CNname)/CName必须有一个缺省构
45、造函数必须有一个缺省构造函数CObject*pObject=pRuntimeClass-CreateObject();/用用IsKindOf检测是否是检测是否是CName类的实例类的实例Assert(pObject-IsKindOf(RUNTIME_CLASS(CName);哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 49MFC应用程序框架应用程序框架vCObject对对序列化序列化的支持:的支持:把对象把对象保存保存到到文件文件或其他或其他存储设备存储设备,并能够从存储,并能够从存储设备中重建对象。设备中重建对象。从从CObject派生的类要具有序列化的功能
46、,需要:派生的类要具有序列化的功能,需要:定义该类时,在定义该类时,在类说明类说明中使用中使用DECLARE_SERIAL(CLASSNMAE)宏;宏;定义一个定义一个不带参数的不带参数的构造函数构造函数;在在类的实现类的实现文件中使用文件中使用IMPLEMENT_SERIAL(CLASSNAME,BASECLASS)宏;宏;覆盖覆盖Serialize成员函数。成员函数。如果直接调用如果直接调用Serialize函数进行序列化读写,可以函数进行序列化读写,可以省略前面三步。省略前面三步。哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 50MFC应用程序框架应用程序
47、框架CArchive对象基本类型对象C+对象读写CFile对象序列化的机制序列化的机制数据存取的共用接口存储过程的具体实现永久永久存储存储哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 51MFC应用程序框架应用程序框架CStdioFileCMemFileCSocketFileCOleStreamFileCFileCArchiveClientBridge模式模式哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 52MFC应用程序框架应用程序框架4.MFC程序示例程序示例HelloMFC.h:class CHelloWinApp:publ
48、ic CWinApp public:virtual BOOL InitInstance();class CHelloFrameWnd:public CFrameWnd public:CHelloFrameWnd();afx_msg void OnPaint();DECLARE_MESSAGE_MAP();HelloMFC.cpp:#include#include“Hello.h”CHelloWinApp theApp;BOOL CHelloWinApp:InitInstance()m_pMainWnd=new CHelloFrameWnd();m_pMainWnd-ShowWindow(m_n
49、CmdShow);m_pMainWnd-UpdateWindow();return TRUE;CHelloFrameWnd:CHelloFrameWnd()create(NULL,”,WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL)BEGIN_MESSAGE_MAP(CHelloFrameWnd,CFrameWnd)ON_WM_PAINT()END_MESSAGE_MAP()void CHelloFrameWnd:OnPaint()CPaintDC dc(this);CRect rect;GetClientRect(rect);dc.TextOut(100,
50、100,”Hello MFC”);应用程序类声明应用程序类声明主窗口类声明主窗口类声明每当应用程序首次执行每当应用程序首次执行时都要调用的初始化函时都要调用的初始化函数数WM_PAINT的消息处的消息处理函数理函数声明消息映射声明消息映射Afxwin.h中声明了中声明了MFC的核心组件的核心组件建立应用程序对象类的实例,全局建立应用程序对象类的实例,全局对象,对象,Windows系统加载程序时,系统加载程序时,全局对象最先被初始化并调用构造全局对象最先被初始化并调用构造函数函数消息映射消息映射哈尔滨工程大学计算机科学与技术学院哈尔滨工程大学计算机科学与技术学院Page 53 WIN32 API