网络编程实用教程第4章_MFC编程ppt课件_第1页
网络编程实用教程第4章_MFC编程ppt课件_第2页
网络编程实用教程第4章_MFC编程ppt课件_第3页
网络编程实用教程第4章_MFC编程ppt课件_第4页
网络编程实用教程第4章_MFC编程ppt课件_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、网络编程适用教程第第4章章 MFC编程编程补充知识Windows操作系统的操作系统的API接口接口SDK软件开发包软件开发包微软提供的操作系统开发接口微软提供的操作系统开发接口也叫也叫API 由一些函数组成由一些函数组成补充知识SDK与与MFC的区别的区别:利用利用API接口函数编程也叫接口函数编程也叫WIN32接口编程接口编程利用利用VC+编程叫做编程叫做MFC编程编程Win32 运用程序接口直接调用运用程序接口直接调用API函数,非面函数,非面向对象;向对象; 类似于类似于C言语程序设计言语程序设计MFC是对是对API的封装,构成的封装,构成MFC的的C+类,是类,是面向对象的编程方式;面

2、向对象的编程方式;类似于类似于C+程序设计程序设计4.1 MFC概述概述4.1.1 MFC是一个编程框架 MFC MFC运用程序框架,简称运用程序框架,简称MFCMFC框架,是由框架,是由MFC MFC Microsoft Foundation Class LibraryMicrosoft Foundation Class Library中中的各种类结合起来构成的。的各种类结合起来构成的。从总体上定义了运用程序的轮廓从总体上定义了运用程序的轮廓提供了用户接口的规范实现方法提供了用户接口的规范实现方法程序员只须经过预定义的接口把详细运用程序程序员只须经过预定义的接口把详细运用程序特有的东西填入这

3、个轮廓,就能建立特有的东西填入这个轮廓,就能建立WindowsWindows下下的运用程序的运用程序4.1.1 MFC是一个编程框架VC+VC+提供了相应的工具来完成这个任务:提供了相应的工具来完成这个任务:用运用程序导游可以生成运用程序的骨架;用运用程序导游可以生成运用程序的骨架;用资源编辑器可以直观地设计用户接口;用资源编辑器可以直观地设计用户接口;用类导游可以将代码添加到骨架文件用类导游可以将代码添加到骨架文件 ;4.1.1 MFC是一个编程框架1 1MFCMFC类库封装的内容类库封装的内容 对对Win32Win32运用程序编程接口的封装运用程序编程接口的封装 MFCMFC将每一个将每一

4、个WindowsWindows对象封装成一个相应对象封装成一个相应的的C+ C+ 对象。对象。对运用程序概念的封装对运用程序概念的封装 运用运用SDKSDK编写编写WindowsWindows运用程序时,总要定运用程序时,总要定义窗口过程,注册义窗口过程,注册Windows Class Windows Class ,创建窗口,创建窗口等等,要做许多处置任务。等等,要做许多处置任务。MFC MFC 封装了这些处封装了这些处置,替程序员完成这些任务。置,替程序员完成这些任务。4.1.1 MFC是一个编程框架n对对COM/OLECOM/OLE特性的封装特性的封装 n OLE OLE 对象的链接与嵌入

5、建立在对象的链接与嵌入建立在COM(COM(组件对组件对象模型象模型) )之上,由于支持之上,由于支持OLEOLE的运用程序必需实现一系的运用程序必需实现一系列的接口列的接口, ,因此相当繁琐。因此相当繁琐。MFC MFC 的的OLEOLE类封装了类封装了OLE OLE API API 大量的复杂任务,提供了实现大量的复杂任务,提供了实现OLEOLE的更高级接口。的更高级接口。n对对ODBCODBC功能的封装功能的封装 n MFCMFC封装了封装了ODBC API ODBC API 的大量的复杂的任务,构的大量的复杂的任务,构成了与成了与ODBCODBC之间接口的高级之间接口的高级C+ C+

6、类,提供了一种方便类,提供了一种方便的访问数据库的编程方式。的访问数据库的编程方式。 4.1.1 MFC是一个编程框架2 2MFCMFC类的承继关系类的承继关系 MFC MFC 将众多类的共同特性笼统出来,设计出一些将众多类的共同特性笼统出来,设计出一些基类,作为实现其他类的根底。有两个类非常重要:基类,作为实现其他类的根底。有两个类非常重要:CObjectCObject:是:是MFCMFC的根类,绝大多数的根类,绝大多数MFC MFC 类是从它派生类是从它派生的。实现了一些重要的特性:的。实现了一些重要的特性:动态类信息运转时类信息动态类信息运转时类信息-运转时检索类或对象运转时检索类或对象

7、的信息的信息动态创建动态创建对象序列化对象序列化Serialize(CArchive &ar)Serialize(CArchive &ar)对程序调试对程序调试DumpDump、AssertValidAssertValid 从从CObject CObject 派生的类都可以具备派生的类都可以具备CObjectCObject所拥有所拥有的特性。的特性。4.1.1 MFC是一个编程框架序列化的概念序列化的概念-实现对象的耐久性实现对象的耐久性 为实现对象的耐久性,通常多以字节流的方式将为实现对象的耐久性,通常多以字节流的方式将记录对象形状的数据存放到磁盘上,这种将形状数据记录对象形

8、状的数据存放到磁盘上,这种将形状数据保管到磁盘和从磁盘恢复到内存的过程称为序列化。保管到磁盘和从磁盘恢复到内存的过程称为序列化。 4.1.1 MFC是一个编程框架uCCmdTargetCCmdTarget类:从类:从CObjectCObject派生。经过进一步封派生。经过进一步封装一些属性和方法,提供了音讯处置的架构。装一些属性和方法,提供了音讯处置的架构。在在MFC MFC 中,任何可以处置音讯的类都是从此类中,任何可以处置音讯的类都是从此类派生的。派生的。uCWndCWnduCButtonCButtonuCComboBoxCComboBoxuCEditCEdituCDialogCDialo

9、gu 4.1.1 MFC是一个编程框架 针对每种不同的对象,针对每种不同的对象,MFC MFC 都设计了一组类对这都设计了一组类对这些对象进展封装,每一组类都有一个基类,从基类派些对象进展封装,每一组类都有一个基类,从基类派生出众多更详细的类。这些对象包括以下种类:生出众多更详细的类。这些对象包括以下种类:窗口对象:基类是窗口对象:基类是CWndCWnd;运用程序对象:基类是运用程序对象:基类是CwinThreadCwinThread;文档对象:基类是文档对象:基类是CdocumentCdocument。 可以结合本人的实践,从适当的可以结合本人的实践,从适当的MFC MFC 类中派生出类中派

10、生出本人的类,实现特定的功能,到达本人的编程目的。本人的类,实现特定的功能,到达本人的编程目的。 4.1.1 MFC是一个编程框架3 3虚拟函数和动态约束虚拟函数和动态约束( (多态性多态性 MFC MFC 建立了音讯映射机制,以一种富有效建立了音讯映射机制,以一种富有效率、便于运用的手段处理音讯处置函数的动态率、便于运用的手段处理音讯处置函数的动态约束问题。约束问题。 程序员在承继基类的同时,可把本人实现程序员在承继基类的同时,可把本人实现的虚拟函数和音讯处置函数嵌入的虚拟函数和音讯处置函数嵌入 MFC MFC的编程框的编程框架。架。MFC MFC 框架将在适当的时候、适当的地方来框架将在适

11、当的时候、适当的地方来调用程序的代码。调用程序的代码。多态性多态性根据不同的情况执行不同的操作。根据不同的情况执行不同的操作。4.1.1 MFC是一个编程框架4MFC的开发模板的开发模板 MFC 实现了对运用程序概念的封装,实现实现了对运用程序概念的封装,实现了类、类的承继、动态约束、类的关系和相互了类、类的承继、动态约束、类的关系和相互作用的封装。这样封装的结果是为程序员提供作用的封装。这样封装的结果是为程序员提供了一套开发模板,罗列在运用程序导游中。针了一套开发模板,罗列在运用程序导游中。针对不同的运用和目的,程序员可以采用不同的对不同的运用和目的,程序员可以采用不同的模板。模板。 这些模

12、板都采用以文档这些模板都采用以文档-视图为中心的思想,视图为中心的思想,每个模板都包含一组特定的类。每个模板都包含一组特定的类。 4.1.2 典型的MDI运用程序的构成 用用AppWizardAppWizard产生一个没有产生一个没有 OLEOLE等支持的等支持的 MDI MDI 工程工程T T,AppWizard AppWizard 会自动创建一系列文件,构成一会自动创建一系列文件,构成一个运用程序骨架。这些文件分为四类:个运用程序骨架。这些文件分为四类:头文件头文件.h.h实现文件实现文件(.cpp)(.cpp)资源文件资源文件(.rc)(.rc)模块定义文件模块定义文件(.def)(.d

13、ef)这里显示的是文档这里显示的是文档1、构成运用程序的对象图图4.1 4.1 一个一个MDIMDI运用程序的构成运用程序的构成 1、构成运用程序的对象1运用程序类运用程序类CTApp2主边框窗口类主边框窗口类CMainFrame3文档边框窗口类文档边框窗口类CChildFrame 4文档文档CTDoc5视图视图CTView6文档模板文档模板2构成运用程序的对象之间的关系图图4.2 4.2 各对象之间的派生关系各对象之间的派生关系 3构成运用程序的文件头文件头文件用途用途stdafx.h标准标准AFX头文件头文件 resource.h定义了各种资源定义了各种资源ID t.h#include r

14、esource.h定义了从定义了从CWinApp派生的应用程序对象派生的应用程序对象CTAppchildfrm.h定义了从定义了从CMDIChildWnd派生的文档框架窗口对象派生的文档框架窗口对象CTChildFrame mainfrm.h定义了从定义了从CMDIFrameWnd派生的框架窗口对象派生的框架窗口对象CMainFrame tdoc.h定义了从定义了从CDocument派生的文档对象派生的文档对象CTDoc tview.h定义了从定义了从CView派生的视图对象派生的视图对象CTView 4.1 AppWizard4.1 AppWizard所生成的头文件所生成的头文件3构成运用程

15、序的文件实现文件实现文件 所包含的头文件所包含的头文件 实现的内容和功能实现的内容和功能 stdafx.cpp stdafx.h全局函数、结构和宏的标识符全局函数、结构和宏的标识符t.cpp stdafx.h MainFrm.h childfrm.h tdoc.h tview.h t.h定义定义CTApp的实现,并定义的实现,并定义CTApp类型的全局变量类型的全局变量theAppchildfrm.cpp stdafx.h t.h childfrm.h 实现了类实现了类CChildFrame childfrm.cpp stdafx.h t.h childfrm.h 实现了类实现了类CMainF

16、rame tdoc.cpp stdafx.h t.h tdoc.h实现了类实现了类CTDoc tview.cppstdafx.h t.htdoc.h tview.h实现了类实现了类CTview表表4.2 4.2 实现文件与头文件的包含关系实现文件与头文件的包含关系4.2 MFC和Win324.2.1 MFC对象和Windows对象的关系 MFC MFC 中最重要的封装是对中最重要的封装是对Win32 API Win32 API 的封装,因的封装,因此,了解此,了解Windows Windows 对象和对象和MFC MFC 对象之间的关系是了解对象之间的关系是了解MFCMFC的一个关键:的一个关

17、键:WindowsWindows对象是对象是Win32Win32下用句柄表示的下用句柄表示的WindowsWindows操作系操作系统对象;统对象;MFCMFC对象是对象是C+C+对象,是一个对象,是一个C+C+类的实例。类的实例。两者有很大的区别,但联络严密两者有很大的区别,但联络严密 4.2.1 MFC对象和Windows对象的关系以窗口对象为例:以窗口对象为例:MFC窗口对象是窗口对象是CWnd类的实例,程序直接利类的实例,程序直接利用构造函数创建;用构造函数创建;Windows窗口那么是操作系统的一个内部数窗口那么是操作系统的一个内部数据构造的实例,有一个据构造的实例,有一个“窗口句柄

18、标识,窗口句柄标识,操作系统创建它并给它分配系统资源;操作系统创建它并给它分配系统资源;MFC窗口对象的窗口对象的“窗口句柄保管在对象的窗口句柄保管在对象的m_hWnd成员变量中;成员变量中;Windows窗口可以被一个程序销毁,也可以窗口可以被一个程序销毁,也可以被用户的动作销毁;被用户的动作销毁; MFC窗口由析构函数窗口由析构函数销毁。销毁。4.2.1 MFC对象和Windows对象的关系以窗口对象为例:以窗口对象为例: 图图4.3 MFC4.3 MFC的的CWndCWnd类窗口对象和类窗口对象和WindowsWindows的窗口对象的关系的窗口对象的关系 4.2.1 MFC对象和Win

19、dows对象的关系 其他的其他的Windows Windows 对象和对应的对象和对应的MFC MFC 对象也有类似对象也有类似的关系。的关系。 多方面对MFC对象和Windows对象比较1、对应的数据构造不同、对应的数据构造不同 MFC对象是相应对象是相应C+类的实例,这些类是类的实例,这些类是MFC或者程序员定义的;或者程序员定义的;Windows 对象是对象是Windows系统的内部构造,系统的内部构造,经过一个句柄来援用;经过一个句柄来援用;MFC的类定义了一个成员变量的类定义了一个成员变量m_hWnd来保来保管管MFC对象对应的对象对应的Windows对象的句柄。对象的句柄。补充什么

20、叫句柄什么叫句柄(Handle)?-游戏手柄游戏手柄 32位的整数,是位的整数,是 WINDOWS 在内存中维护的一个在内存中维护的一个对象内存物理地址列表的整数索引。对象内存物理地址列表的整数索引。 WINDOWS 的内存管理经常会将当前空闲对象的的内存管理经常会将当前空闲对象的内存释放掉,当需求时访问再重新提交到物理内存。内存释放掉,当需求时访问再重新提交到物理内存。所以对象的物理地址是变化的,不允许程序直接经过所以对象的物理地址是变化的,不允许程序直接经过物理地址来访问对象。程序将想访问的对象的句柄传物理地址来访问对象。程序将想访问的对象的句柄传送给系统,系统根据句柄检索本人维护的对象列

21、表就送给系统,系统根据句柄检索本人维护的对象列表就能知道程序想访问的对象及其物理地址了。能知道程序想访问的对象及其物理地址了。 2、所处的层次不同、所处的层次不同MFC对象是高层的,对象是高层的,Windows对象是低层的;对象是低层的;MFC对象封装了对象封装了Windows对象的大部分或全对象的大部分或全部功能,同时封装了部功能,同时封装了Windows对象的句柄;对象的句柄;3、创建的机制、创建的机制 MFC对象经过构造函数由程序直接创建;对象经过构造函数由程序直接创建;Windows对象由相应的对象由相应的SDK函数创建。函数创建。多方面对MFC对象和Windows对象比较多方面对MF

22、C对象和Windows对象比较4、转换的方式不同、转换的方式不同 可以从一个可以从一个MFC对象得到对应的对象得到对应的Windows对对象的句柄;运用象的句柄;运用MFC对象的对象的GetSafeHandle成员函数得到对应的句柄。成员函数得到对应的句柄。可以从一个已存在的可以从一个已存在的Windows对象创建一个对象创建一个对应的对应的MFC对象;普通运用对象;普通运用MFC对象的成员对象的成员函数函数Attach或者或者FromHandle来创建,前者来创建,前者得到一个永久性对象,后者得到的能够是一得到一个永久性对象,后者得到的能够是一个暂时对象。个暂时对象。 m_hWnd多方面对M

23、FC对象和Windows对象比较5、运用范围不同、运用范围不同 MFC对象效力于创建它的进程;对象效力于创建它的进程;Windows对象创建后,其句柄是整个对象创建后,其句柄是整个Windows系统全局的。一些句柄可以被其他系统全局的。一些句柄可以被其他进程运用。进程运用。对同一个进程的线程来说,只可以运用本线程对同一个进程的线程来说,只可以运用本线程创建的创建的MFC对象,不能运用其他线程的对象,不能运用其他线程的MFC对象。对象。多方面对MFC对象和Windows对象比较6、销毁方法不同、销毁方法不同 MFC对象随着析构函数的调用而消逝;但对象随着析构函数的调用而消逝;但Windows对象

24、必需由相应的对象必需由相应的Windows系统函系统函数销毁。数销毁。特例:设备描画表特例:设备描画表CDC类的对象有所不同,它类的对象有所不同,它对应的对应的HDC句柄对象能够不是被销毁,而是被句柄对象能够不是被销毁,而是被释放。释放。WindowsWindows对象对应的对象对应的MFCMFC对象对象描述描述Windows句柄句柄MFC对象对象窗口窗口HWNDCWnd及其派生类及其派生类设备上下文设备上下文HDCCDC及其派生类及其派生类菜单菜单HMENUCMenu笔笔HPENCGdiObject,CPen及其派生类及其派生类刷子刷子HBRUSHCGdiObject,CBrush及其派生类

25、及其派生类字体字体HFONTCGdiObject,CFont及其派生类及其派生类位图位图HBITMAPCGdiObject,CBitmap及其派生类及其派生类调色板调色板HPALETTECGdiObject,CPalette及其派生类及其派生类区域区域HRGNCGdiObject,CRgn及其派生类及其派生类图像列表图像列表HimageLISTCImageList及其派生类及其派生类套接字套接字SOCHETCSocket,CAsynSocket及其派生类及其派生类4.2.2 几个主要的类1、Win32 API的窗口对象的窗口对象用用Win32 API编写的运用程序的根本构造:编写的运用程序的根

26、本构造:编写编写WinMain函数程序的入口函数程序的入口编写音讯和事件的处置过程编写音讯和事件的处置过程WndProc在在WinMain中注册窗口中注册窗口创建窗口,然后开场运用程序的音讯循环创建窗口,然后开场运用程序的音讯循环n注册窗口注册窗口n API经过调用经过调用RegisterClass注册窗口类型;注册窗口类型;n “窗口是窗口是Windows系统的数据构造。其系统的数据构造。其定义如下:定义如下:typedef struct _WNDCLASSEX UINT cbSize; /该构造的字节数该构造的字节数 UINT style; /窗口类的风格窗口类的风格 WNDPROC lp

27、fnWndProc; /窗口过程窗口过程 int cbClsExtra; /额外数据额外数据 int cbWndExtra; /额外数据额外数据 HANDLE hInstance;/窗口类的窗口过程所属的运用实例窗口类的窗口过程所属的运用实例 HICON hIcon; /该窗口类所用的像标该窗口类所用的像标 HCURSOR hCursor; /该窗口类所用的光标该窗口类所用的光标 HBRUSH hbrBackground; /该窗口类所用的背景刷该窗口类所用的背景刷 LPCTSTR lpszMenuName; /该窗口类所用的菜单资源该窗口类所用的菜单资源 LPCTSTR lpszClassN

28、ame; /该窗口类的称号该窗口类的称号 HICON hIconSm; /该窗口类所用的小像标该窗口类所用的小像标 WNDCLASSEX; 补充-Win 32程序的根本构造nWinMain函数的原型声明:函数的原型声明:nint WINAPI WinMain(n HINSTANCE hInstance , / 当前实当前实例句柄例句柄n HINSTANCE hPrevInstance , / 前一个前一个实例句柄实例句柄n LPSTR lpCmdLine , / 命令行命令行n int nCmdShow / 显示形显示形状状n); 补充-Win 32程序的根本构造n 调用调用RegisterC

29、lass注册注册 n RegisterClass是全局函数,函数原型:是全局函数,函数原型:RegisterClass( nWNDCLASS *lpWndClass);补充-Win 32程序的根本构造int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) /设计窗口构造设计窗口构造 WNDCLASS wndcls; wndcls.style = CS_DBLCLKS|CS_VREDRAW|CS_HREDRAW; wndcls.lpszMenuName = NU

30、LL; wndcls.lpszClassName = CustomWnd; wndcls.lpfnWndProc = WndProc ; wndcls.hInstance = GetModuleHandle(NULL); wndcls.hIcon = NULL; wndcls.hCursor = NULL; wndcls.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0;补充-Win 32程序的根本构造 /注册窗口构造注册窗口构造 RegisterCl

31、ass(&wndcls); /创建窗口创建窗口 HWND hwnd; hwnd = CreateWindow(CustomWnd,Win32App, WS_CAPTION|WS_OVERLAPPEDWINDOW| WS_SYSMENU,50,50,500,500, NULL,NULL,wndcls.hInstance,NULL); /显示窗口显示窗口 ShowWindow(hwnd,SW_SHOW); UpdateWindow(hwnd);补充-Win 32程序的根本构造 /进入音讯循环进入音讯循环 MSG msg; while (GetMessage(&msg,NULL,0,

32、0) TranslateMessage(&msg); DispatchMessage(&msg); return msg.wParam;补充-Win 32程序的根本构造/窗口音讯处置函数窗口音讯处置函数LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) switch(message) case WM_CREATE: break; case WM_DESTROY: PostQuitMessage(0); default: return DefWindowProc(hwnd

33、,message,wParam,lParam); return(0); 4.2.2 几个主要的类2、MFC的窗口类的窗口类CWnd CWnd 类封装了窗口的一切属性和窗口处类封装了窗口的一切属性和窗口处置的事件。同时还可以经过音讯映射机制实现置的事件。同时还可以经过音讯映射机制实现窗口的某些操作。主要函数有:窗口的某些操作。主要函数有:窗口创建函数窗口创建函数Create 封装了封装了CreateWindowEX,创建时发送,创建时发送WM_Create音讯音讯窗口销毁函数窗口销毁函数DestroyWindowPostNcDestroy4.2.2 几个主要的类n 设定、获取和改动窗口属性的函数

34、设定、获取和改动窗口属性的函数n SetWindowText:设置窗口的标题文字:设置窗口的标题文字n GetWindowText:获取窗口标题:获取窗口标题n SetIcon:设置窗口的图标:设置窗口的图标n GetIcon:获取窗口图标:获取窗口图标n GetDlgItem:得到窗口类指定:得到窗口类指定ID的控制子窗口的控制子窗口n GetDC:得到窗口的设备上下文:得到窗口的设备上下文n SetMenu:设置窗口的菜单:设置窗口的菜单n GetMenu:得到窗口的菜单:得到窗口的菜单补充:什么是设备上下文?设备上下文设备上下文(Device Context ,DC) 是一个表现一组图形

35、对象和属性的构造运用是一个表现一组图形对象和属性的构造运用设备上下文允许他直接支配图形,不用思索低设备上下文允许他直接支配图形,不用思索低级细节。级细节。 Windows GDI是一个图形翻译系统,是介是一个图形翻译系统,是介于运用程序和图形硬件之间的一层。于运用程序和图形硬件之间的一层。GDI 可以可以输出到恣意的兼容设备,不过最常运用的设备输出到恣意的兼容设备,不过最常运用的设备是视频监视器、打印机或绘图仪,或者是内存是视频监视器、打印机或绘图仪,或者是内存中的图元文本。中的图元文本。GDI 函数可以绘制各种图形和函数可以绘制各种图形和文本。一切访问文本。一切访问GDI的的Windows函

36、数都需求一函数都需求一个设备上下文句柄作为参数。个设备上下文句柄作为参数。4.2.2 几个主要的类n 用于完成窗口动作的函数用于完成窗口动作的函数n 发送音讯发送音讯n SendMessage:发送窗口音讯,立刻调用:发送窗口音讯,立刻调用n PostMessage:发送窗口音讯,放进音讯队列:发送窗口音讯,放进音讯队列n 改动窗口形状改动窗口形状n MoveWindow:挪动窗口:挪动窗口n ShowWindow:控制窗口的显示:控制窗口的显示n 实现音讯处置机制的函数实现音讯处置机制的函数n WindowProc:虚函数:虚函数n OnCommand:处置命令音讯:处置命令音讯n 音讯处置

37、函数:音讯处置函数:n OnCreate和和OnClose4.2.2 几个主要的类3、在、在MFC下创建一个窗口对象下创建一个窗口对象分两步:分两步:创建创建MFC窗口对象定义窗口对象定义创建对应的创建对应的Windows窗口对象窗口对象窗口创建过程中将发送两个音讯:窗口创建过程中将发送两个音讯:WM_NCCREATE:创建非客户区后发送该音:创建非客户区后发送该音讯讯WM_CREATE:创建客户区后发送该音讯:创建客户区后发送该音讯4.2.2 几个主要的类4、MFC窗口的运用窗口的运用MFC窗口类包括:窗口类包括:框架类框架类CframeWnd和和CMidFrameWnd文档框架文档框架CM

38、idChildWnd视图视图Cview,承继有,承继有ClistView、CEditView、CTreeView、CRichEditView对话框对话框CDialog工具条工具条CToolBar形状条形状条CStatusBar控制窗口控制窗口CList、CEdit、CComboBox、CButton等等4.2.2 几个主要的类5、MFC下窗口的销毁下窗口的销毁Hwnd窗口的销毁和窗口的销毁和MFC窗口对象的销毁窗口对象的销毁普通的窗口类:点击封锁按钮时将调用普通的窗口类:点击封锁按钮时将调用DestroyWindow完成销毁过程完成销毁过程控制窗口:利用控制窗口:利用DestroyWindow

39、完成销毁过完成销毁过程程4.3 CObject类 CObject CObject是大多数是大多数 MFCMFC类的根类或基类。类的根类或基类。CObjectCObject类有很多有用的特性:类有很多有用的特性:对运转时类信息的支持对运转时类信息的支持对动态创建的支持对动态创建的支持对串行化的支持对串行化的支持对象诊断输出对象诊断输出 MFCMFC从从CObjectCObject派生出许多类,具备其中的一个或派生出许多类,具备其中的一个或者多个特性。程序员也可以从者多个特性。程序员也可以从CObject CObject 类派生出本人类派生出本人的类,利用的类,利用CObjectCObject类的

40、这些特性。类的这些特性。4.3.1 CObject的定义CObject提供了:提供了:一个静态函数:一个静态函数:_GetBaseClass;五个虚拟函数:析构函数、五个虚拟函数:析构函数、GetRuntimeClass、Serialize、AssertValid、Dump 这些虚拟函数,在这些虚拟函数,在CObject 的派生类中应该有更的派生类中应该有更详细的实现。必要的话,派生类实现它们时能够要求详细的实现。必要的话,派生类实现它们时能够要求先调用基类的实现,例如先调用基类的实现,例如Serialize 和和Dump就要求就要求这样。这样。 4.3.2 CObject的特性1、对运转时类

41、信息的支持、对运转时类信息的支持 即用于在运转时,断定一个对象能否属于一即用于在运转时,断定一个对象能否属于一个特定的类,或者从一个特定类派生的,经过个特定的类,或者从一个特定类派生的,经过IsKindOf函数实现此功能。函数实现此功能。派生时,需求按如下操作:派生时,需求按如下操作:类阐明文件中运用类阐明文件中运用DECLARE_ DYNAMIC 宏宏类实现文件中运用类实现文件中运用IMPLEMENT_DYNAMIC宏宏class CPerson : public CObject public: DECLARE_ DYNAMIC ( CPerson )CPerson(); / 缺省构造函数缺

42、省构造函数CString m_name;WORD m_number;void Serialize( CArchive& archive );IMPLEMENT_ DYNAMIC (CPerson , CObject) 4.3.2 CObject的特性2、对动态创建的支持、对动态创建的支持 及运转时创建该类的实例,要使得派生的类及运转时创建该类的实例,要使得派生的类具有动态创建的功能,必需在定义该类时:具有动态创建的功能,必需在定义该类时:类阐明文件中运用类阐明文件中运用DECLARE_ DYNCRETE 宏宏定义一个不带参数的构造函数定义一个不带参数的构造函数类实现文件中运用类实现文件

43、中运用IMPLEMENT_DYNCRETE宏宏class CPerson : public CObject public: DECLARE_DYNCREATE ( CPerson )CPerson(); / 缺省构造函数缺省构造函数CString m_name;WORD m_number;void Serialize( CArchive& archive ); IMPLEMENT_DYNCREATE (CPerson , CObject) 4.3.2 CObject的特性u 运用时先经过宏运用时先经过宏RUNTIME_CLASS得到得到RunTime信息,信息,然后用然后用CRunti

44、meClass的成员函数的成员函数CreateObject创建创建该类的实例该类的实例u 例如:例如:u CRuntimeClass* pRuntimeClass = RUNTIME_CLASS(CNname)u /CName必需有一个缺省构造函数必需有一个缺省构造函数u CObject* pObject = pRuntimeClass-CreateObject();u /用用IsKindOf检测能否是检测能否是CName类的实例类的实例u Assert( pObject-IsKindOf(RUNTIME_CLASS(CName);4.3.2 CObject的特性3 3、对序列化的支持、对序列

45、化的支持 序列化指的是把对象内容存入一个文件或序列化指的是把对象内容存入一个文件或从一个文件中读取对象内容的过程。从一个文件中读取对象内容的过程。类阐明文件中运用类阐明文件中运用DECLARE_ SERIAL DECLARE_ SERIAL 宏宏定义一个不带参数的构造函数定义一个不带参数的构造函数类实现文件中运用类实现文件中运用IMPLEMENT_ SERIALIMPLEMENT_ SERIAL宏宏覆盖覆盖SerializeSerialize成员函数成员函数4.3.2 CObject的特性 一个类要支持实现序列化,使得它的对象一个类要支持实现序列化,使得它的对象可以保管到文档中或者可以从文档中

46、读入到内可以保管到文档中或者可以从文档中读入到内存中并生成对象。需求覆盖基类的存中并生成对象。需求覆盖基类的Serialize Serialize 虚拟函数来完成其对象的序列化。虚拟函数来完成其对象的序列化。 仅仅有类的支持是不够的,仅仅有类的支持是不够的,MFC MFC 还提供了还提供了一个归档类一个归档类CArchiveCArchive来支持简单类型的数据和来支持简单类型的数据和复杂对象的读写。复杂对象的读写。4.3.2 CObject的特性 一个一个CArchiveCArchive对象在要序列化的对象和存储媒体对象在要序列化的对象和存储媒体之间起中介作用。它提供了系列方法来完成序列化,之

47、间起中介作用。它提供了系列方法来完成序列化,可以序列化的数据包括:可以序列化的数据包括:简单类型数据:如简单类型数据:如intint、floatfloat复杂的数据:如复杂的数据:如stringstring等进展序列化等进展序列化复杂的对象:包括复合对象复杂的对象:包括复合对象完成序列化的这些方法:完成序列化的这些方法:重载的操作符重载的操作符和和。 创建创建CArchiveCArchive对象时,必需有一个对象时,必需有一个CFileCFile对象,对象,它代表了存储媒介。它代表了存储媒介。 class CPerson : public CObject public:DECLARE_SERI

48、AL( CPerson )CPerson(); / 缺省构造函数缺省构造函数CString m_name;WORD m_number;void Serialize( CArchive& archive );IMPLEMENT_SERIAL ( CPerson , CObject , wSchema) 该宏的第三个参数是架构编号,即类对象的版本号。是大该宏的第三个参数是架构编号,即类对象的版本号。是大于或等于零的整数。于或等于零的整数。4.3.2 CObject的特性4、综合实例定义一个支持串行化的类、综合实例定义一个支持串行化的类Cpersonclass CPerson : publi

49、c CObject public:DECLARE_SERIAL( CPerson )CPerson(); / 缺省构造函数缺省构造函数CString m_name;WORD m_number;void Serialize( CArchive& archive );4.3.2 CObject的特性实现该类的成员函数实现该类的成员函数Serialize,覆盖,覆盖CObject的该函数:的该函数:void CPerson:Serialize( CArchive& archive )/ 先调用基类函数的实现先调用基类函数的实现CObject:Serialize( archive );

50、 if( archive.IsStoring() )archive m_name m_name m_number;4.3.2 CObject的特性CPerson a; CPerson a; /运用运转时类信息,运用运转时类信息,ASSERTASSERT为宏断言为宏断言ASSERT( a.IsKindOf( RUNTIME_CLASS( CPerson );ASSERT( a.IsKindOf( RUNTIME_CLASS( CPerson );ASSERT( a.IsKindOf( RUNTIME_CLASS( CObject );ASSERT( a.IsKindOf( RUNTIME_CLA

51、SS( CObject );/动态创建:动态创建:CRuntimeClassCRuntimeClass* * pRuntimeClass = RUNTIME_CLASS(CPerson) pRuntimeClass = RUNTIME_CLASS(CPerson)/Cperson/Cperson有一个缺省构造函数有一个缺省构造函数 CObjectCObject* * pObject = pRuntimeClass-CreateObject(); pObject = pRuntimeClass-CreateObject();Assert( pObject-IsKindOf(RUNTIME_CLA

52、SS(CPerson); Assert( pObject-IsKindOf(RUNTIME_CLASS(CPerson); 4.4 音讯映射的实现4.4.1 音讯的分类1、队列音讯和非队列音讯发送方式、队列音讯和非队列音讯发送方式队列音讯:送到系统音讯队列,然后送到线程音讯队队列音讯:送到系统音讯队列,然后送到线程音讯队列列非队列音讯:后者直接送给目的窗口过程非队列音讯:后者直接送给目的窗口过程 队列音讯包括:鼠标及键盘事件,队列音讯包括:鼠标及键盘事件,WM_PAINT、WM_TIMER、 WM_QUIT2、系统音讯队列和线程音讯队列、系统音讯队列和线程音讯队列系统音讯队列:系统音讯队列:W

53、indows操作系统维护的音讯队列操作系统维护的音讯队列线程音讯队列:每个线程还有一个音讯队列线程音讯队列:每个线程还有一个音讯队列4.4.1 音讯的分类3、系统音讯和运用程序音讯运用范围、系统音讯和运用程序音讯运用范围 系统音讯的系统音讯的ID范围为范围为0-WM_USER-1,运,运用程序音讯用程序音讯ID范围为范围为WM_USER到到0X7FFF。 音讯的音讯的ID是独一的。设计程序时,必需保证是独一的。设计程序时,必需保证音讯的独一性。音讯的独一性。4.4.2 MSG音讯构造和音讯处置1、MSG音讯构造音讯构造 操作系统将每个事件都包装成一个称为音讯操作系统将每个事件都包装成一个称为音

54、讯的构造体的构造体MSG来传送给运用程序。来传送给运用程序。MSG构造构造定义如下定义如下:typedef struct tagMSG HWND hwnd; /窗口句柄窗口句柄(索引内存当中的索引内存当中的资源资源) UINT message; /音讯标识音讯标识ID WPARAM wParam; /音讯的附加参数音讯的附加参数,如按如按下是哪个按键下是哪个按键 LPARAM LParam; /关于音讯的附加参数关于音讯的附加参数 DWORD time;/音讯被传送时候的时间音讯被传送时候的时间 POINT pt; /音讯产生时鼠标的的位置音讯产生时鼠标的的位置 MSG;4.4.2 MSG音讯

55、构造和音讯处置音讯的处置:音讯的处置:非队列音讯由非队列音讯由Windows直接送给目的窗口的直接送给目的窗口的窗口过程窗口过程队列音讯由队列音讯由:DispatchMessage等派发给目的等派发给目的窗口的窗口过程。窗口过程被调用时,接受窗口的窗口过程。窗口过程被调用时,接受四个参数:四个参数:窗口句柄窗口句柄Hwnd音讯标识音讯标识ID两个两个32位的音讯参数位的音讯参数wParam ,lParam ;4.4.2 MSG音讯构造和音讯处置2、运用程序经过窗口过程来处置音讯、运用程序经过窗口过程来处置音讯每个窗口类都有一个窗口过程每个窗口类都有一个窗口过程LRESULT CALLBACK

56、WndProc(HWND hWnd ,UINT Message ,WPARAM wParam ,LPARAM lParam) switch (Message) case WM_CREATE:; case WM_DESTROY: PostQuitMessage(0); break; default: ; return 0; 4.4.2 MSG音讯构造和音讯处置几个常见的音讯处置函数:几个常见的音讯处置函数:GetMessage/从音讯队列得到音讯从音讯队列得到音讯 TranslateMessage(&msg); /将虚拟键音讯转将虚拟键音讯转换为字符音讯。换为字符音讯。 Dispatch

57、Message(&msg); /发送音讯发送音讯 GetMessageTime/获取音讯产生的时获取音讯产生的时GetMessagePos/获取音讯产生时鼠标光标获取音讯产生时鼠标光标所在的位置。所在的位置。 4.4.2 MSG音讯构造和音讯处置3、运用程序经过音讯循环获得对音讯的处置、运用程序经过音讯循环获得对音讯的处置Win32GUI程序的根本音讯处置方式:程序的根本音讯处置方式:音讯循环构造如下:音讯循环构造如下:MSG msg; while (GetMessage(&msg, NULL, 0, 0) TranslateMessage(&msg);Dispatch

58、Message(&msg); 4.4.3 MFC音讯处置 MFC MFC的音讯发送和处置本质上和上面引见的音讯发送和处置本质上和上面引见的的Win32 APIWin32 API处置方式一样,但处置方式一样,但MFCMFC是经过提供是经过提供音讯映射机制来处置音讯的;音讯映射机制来处置音讯的;音讯映射:让编程者指定用来处置某个音讯的音讯映射:让编程者指定用来处置某个音讯的某个某个MFC MFC 类。在类中实现处置音讯的函数和音类。在类中实现处置音讯的函数和音讯之间的关联。讯之间的关联。4.4.4 MFC音讯映射的定义和实现1、MFC处置的三类音讯处置的三类音讯Windows音讯:音讯:“

59、WM_开头的音开头的音讯讯,WM_COMMAND除外除外控制通知音讯:控制子窗口送给父窗口的通知控制通知音讯:控制子窗口送给父窗口的通知音讯音讯命令音讯:菜单、工具栏等对象的通知音讯命令音讯:菜单、工具栏等对象的通知音讯 能处置音讯映射的类必需从能处置音讯映射的类必需从CCmdTarget派派生;生;4.4.4 MFC音讯映射的定义和实现2、MFC音讯映射的实现方法音讯映射的实现方法 经过类导游实现音讯映射,在头文件中运用经过类导游实现音讯映射,在头文件中运用映射宏声明音讯处置函数;映射宏声明音讯处置函数;/AFX_MSG(CTttApp)afx_msg void OnAppAbout();/

60、AFX_MSGDECLARE_MESSAGE_MAP()4.4.4 MFC音讯映射的定义和实现 在对应的实现文件中运用映射宏实现音讯在对应的实现文件中运用映射宏实现音讯和处置函数的关联。和处置函数的关联。BEGIN_MESSAGE_MAP(CTApp, CWinApp)BEGIN_MESSAGE_MAP(CTApp, CWinApp)/AFX_MSG_MAP(CTttApp)/AFX_MSG_MAP(CTttApp)ON_COMMAND ( ID_APP_ABOUT , ON_COMMAND ( ID_APP_ABOUT , OnAppAbout )OnAppAbout )/AFX_MSG_MAP/AFX_MSG_MAPEND_MESSAGE_MAP()END_MESSAGE_MAP()音讯映射宏的种类1、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论