网络编程实用教程第4章-MFC编程.ppt

上传人:小飞机 文档编号:6016911 上传时间:2023-09-15 格式:PPT 页数:97 大小:674KB
返回 下载 相关 举报
网络编程实用教程第4章-MFC编程.ppt_第1页
第1页 / 共97页
网络编程实用教程第4章-MFC编程.ppt_第2页
第2页 / 共97页
网络编程实用教程第4章-MFC编程.ppt_第3页
第3页 / 共97页
网络编程实用教程第4章-MFC编程.ppt_第4页
第4页 / 共97页
网络编程实用教程第4章-MFC编程.ppt_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《网络编程实用教程第4章-MFC编程.ppt》由会员分享,可在线阅读,更多相关《网络编程实用教程第4章-MFC编程.ppt(97页珍藏版)》请在三一办公上搜索。

1、网络编程实用教程,第4章 MFC编程,补充知识,Windows操作系统的API接口SDK(软件开发包)微软提供的操作系统开发接口也叫API 由一些函数组成,补充知识,SDK与MFC的区别:利用API接口函数编程也叫WIN32接口编程利用VC+编程叫做MFC编程Win32 应用程序接口直接调用API函数,非面向对象;类似于C语言程序设计MFC是对API的封装,形成MFC的C+类,是面向对象的编程模式;类似于C+程序设计,4.1 MFC概述,4.1.1 MFC是一个编程框架,MFC应用程序框架,简称MFC框架,是由MFC(Microsoft Foundation Class Library)中的各

2、种类结合起来构成的。从总体上定义了应用程序的轮廓提供了用户接口的标准实现方法程序员只须通过预定义的接口把具体应用程序特有的东西填入这个轮廓,就能建立Windows下的应用程序,4.1.1 MFC是一个编程框架,VC+提供了相应的工具来完成这个工作:用应用程序向导可以生成应用程序的骨架;用资源编辑器可以直观地设计用户接口;用类向导可以将代码添加到骨架文件;,4.1.1 MFC是一个编程框架,1MFC类库封装的内容 对Win32应用程序编程接口的封装 MFC将每一个Windows对象封装成一个相应的C+对象。对应用程序概念的封装 使用SDK编写Windows应用程序时,总要定义窗口过程,注册Win

3、dows Class,创建窗口等等,要做许多处理工作。MFC 封装了这些处理,替程序员完成这些工作。,4.1.1 MFC是一个编程框架,对COM/OLE特性的封装 OLE(对象的链接与嵌入)建立在COM(组件对象模型)之上,由于支持OLE的应用程序必须实现一系列的接口,因而相当繁琐。MFC 的OLE类封装了OLE API 大量的复杂工作,提供了实现OLE的更高级接口。对ODBC功能的封装 MFC封装了ODBC API 的大量的复杂的工作,形成了与ODBC之间接口的高级C+类,提供了一种方便的访问数据库的编程模式。,4.1.1 MFC是一个编程框架,2MFC类的继承关系 MFC 将众多类的共同特

4、性抽象出来,设计出一些基类,作为实现其他类的基础。有两个类十分重要:CObject:是MFC的根类,绝大多数MFC 类是从它派生的。实现了一些重要的特性:动态类信息(运行时类信息)-运行时检索类或对象的信息动态创建对象序列化Serialize(CArchive&ar)对程序调试Dump、AssertValid 从CObject 派生的类都可以具备CObject所拥有的特性。,4.1.1 MFC是一个编程框架,序列化的概念-实现对象的持久性 为实现对象的持久性,通常多以字节流的形式将记录对象状态的数据存放到磁盘上,这种将状态数据保存到磁盘和从磁盘恢复到内存的过程称为序列化。,4.1.1 MFC是

5、一个编程框架,CCmdTarget类:从CObject派生。通过进一步封装一些属性和方法,提供了消息处理的架构。在MFC 中,任何可以处理消息的类都是从此类派生的。CWndCButtonCComboBoxCEditCDialog,4.1.1 MFC是一个编程框架,针对每种不同的对象,MFC 都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象:基类是CWnd;应用程序对象:基类是CwinThread;文档对象:基类是Cdocument。可以结合自己的实际,从适当的MFC 类中派生出自己的类,实现特定的功能,达到自己的编程目的。,4.

6、1.1 MFC是一个编程框架,3虚拟函数和动态约束(多态性)MFC 建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。程序员在继承基类的同时,可把自己实现的虚拟函数和消息处理函数嵌入 MFC的编程框架。MFC 框架将在适当的时候、适当的地方来调用程序的代码。多态性根据不同的情况执行不同的操作。,4.1.1 MFC是一个编程框架,4MFC的开发模板 MFC 实现了对应用程序概念的封装,实现了类、类的继承、动态约束、类的关系和相互作用的封装。这样封装的结果是为程序员提供了一套开发模板,罗列在应用程序向导中。针对不同的应用和目的,程序员可以采用不同的模板。这些模板都采

7、用以文档-视图为中心的思想,每个模板都包含一组特定的类。,4.1.2 典型的MDI应用程序的构成,用AppWizard产生一个没有 OLE等支持的 MDI 工程T,AppWizard 会自动创建一系列文件,构成一个应用程序骨架。这些文件分为四类:头文件(.h)实现文件(.cpp)资源文件(.rc)模块定义文件(.def),这里显示的是文档,1、构成应用程序的对象,图4.1 一个MDI应用程序的构成,1、构成应用程序的对象,(1)应用程序类CTApp(2)主边框窗口类CMainFrame(3)文档边框窗口类CChildFrame(4)文档CTDoc(5)视图CTView(6)文档模板,2构成应用

8、程序的对象之间的关系,图4.2 各对象之间的派生关系,3构成应用程序的文件,4.1 AppWizard所生成的头文件,3构成应用程序的文件,表4.2 实现文件与头文件的包含关系,4.2 MFC和Win32,4.2.1 MFC对象和Windows对象的关系,MFC 中最重要的封装是对Win32 API 的封装,因此,理解Windows 对象和MFC 对象之间的关系是理解MFC的一个关键:Windows对象是Win32下用句柄表示的Windows操作系统对象;MFC对象是C+对象,是一个C+类的实例。两者有很大的区别,但联系紧密,4.2.1 MFC对象和Windows对象的关系,以窗口对象为例:M

9、FC窗口对象是CWnd类的实例,程序直接利用构造函数创建;Windows窗口则是操作系统的一个内部数据结构的实例,有一个“窗口句柄”标识,操作系统创建它并给它分配系统资源;MFC窗口对象的“窗口句柄”保存在对象的m_hWnd成员变量中;Windows窗口可以被一个程序销毁,也可以被用户的动作销毁;MFC窗口由析构函数销毁。,4.2.1 MFC对象和Windows对象的关系,以窗口对象为例:,图4.3 MFC的CWnd类窗口对象和Windows的窗口对象的关系,4.2.1 MFC对象和Windows对象的关系,其他的Windows 对象和对应的MFC 对象也有类似的关系。,多方面对MFC对象和W

10、indows对象比较,1、对应的数据结构不同 MFC对象是相应C+类的实例,这些类是MFC或者程序员定义的;Windows 对象是Windows系统的内部结构,通过一个句柄来引用;MFC的类定义了一个成员变量m_hWnd来保存MFC对象对应的Windows对象的句柄。,补充,什么叫句柄(Handle)?-游戏手柄 32位的整数,是 WINDOWS 在内存中维护的一个对象内存物理地址列表的整数索引。WINDOWS 的内存管理经常会将当前空闲对象的内存释放掉,当需要时访问再重新提交到物理内存。所以对象的物理地址是变化的,不允许程序直接通过物理地址来访问对象。程序将想访问的对象的句柄传递给系统,系统

11、根据句柄检索自己维护的对象列表就能知道程序想访问的对象及其物理地址了。,2、所处的层次不同MFC对象是高层的,Windows对象是低层的;MFC对象封装了Windows对象的大部分或全部功能,同时封装了Windows对象的句柄;3、创建的机制 MFC对象通过构造函数由程序直接创建;Windows对象由相应的SDK函数创建。,多方面对MFC对象和Windows对象比较,多方面对MFC对象和Windows对象比较,4、转换的方式不同 可以从一个MFC对象得到对应的Windows对象的句柄;使用MFC对象的GetSafeHandle成员函数得到对应的句柄。可以从一个已存在的Windows对象创建一个

12、对应的MFC对象;一般使用MFC对象的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。(m_hWnd),多方面对MFC对象和Windows对象比较,5、使用范围不同 MFC对象服务于创建它的进程;Windows对象创建后,其句柄是整个Windows系统全局的。一些句柄可以被其他进程使用。对同一个进程的线程来说,只可以使用本线程创建的MFC对象,不能使用其他线程的MFC对象。,多方面对MFC对象和Windows对象比较,6、销毁方法不同 MFC对象随着析构函数的调用而消失;但Windows对象必须由相应的Windows系统函数销毁。特例:

13、设备描述表CDC类的对象有所不同,它对应的HDC句柄对象可能不是被销毁,而是被释放。,Windows对象对应的MFC对象,4.2.2 几个主要的类,1、Win32 API的窗口对象用Win32 API编写的应用程序的基本结构:编写WinMain函数(程序的入口)编写消息和事件的处理过程WndProc()在WinMain中注册窗口创建窗口,然后开始应用程序的消息循环,注册窗口 API通过调用RegisterClass注册窗口类型;“窗口”是Windows系统的数据结构。其定义如下:,typedef struct _WNDCLASSEX UINT cbSize;/该结构的字节数 UINT styl

14、e;/窗口类的风格 WNDPROC lpfnWndProc;/窗口过程 int cbClsExtra;/额外数据 int cbWndExtra;/额外数据 HANDLE hInstance;/窗口类的窗口过程所属的应用实例 HICON hIcon;/该窗口类所用的像标 HCURSOR hCursor;/该窗口类所用的光标 HBRUSH hbrBackground;/该窗口类所用的背景刷 LPCTSTR lpszMenuName;/该窗口类所用的菜单资源 LPCTSTR lpszClassName;/该窗口类的名称 HICON hIconSm;/该窗口类所用的小像标 WNDCLASSEX;,补充

15、-Win 32程序的基本结构,WinMain函数的原型声明:int WINAPI WinMain(HINSTANCE hInstance,/当前实例句柄 HINSTANCE hPrevInstance,/前一个实例句柄 LPSTR lpCmdLine,/命令行 int nCmdShow/显示状态);,补充-Win 32程序的基本结构,调用RegisterClass注册 RegisterClass是全局函数,函数原型:RegisterClass(WNDCLASS*lpWndClass);,补充-Win 32程序的基本结构,int WINAPI WinMain(HINSTANCE hInstanc

16、e,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)/设计窗口结构 WNDCLASS wndcls;wndcls.style=CS_DBLCLKS|CS_VREDRAW|CS_HREDRAW;wndcls.lpszMenuName=NULL;wndcls.lpszClassName=CustomWnd;wndcls.lpfnWndProc=WndProc;wndcls.hInstance=GetModuleHandle(NULL);wndcls.hIcon=NULL;wndcls.hCursor=NULL;wndcls.hbrBackg

17、round=(HBRUSH)GetStockObject(GRAY_BRUSH);wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;,补充-Win 32程序的基本结构,/注册窗口结构 RegisterClass(,补充-Win 32程序的基本结构,/进入消息循环 MSG msg;while(GetMessage(,补充-Win 32程序的基本结构,/窗口消息处理函数LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)switch(message)case WM_CR

18、EATE:break;case WM_DESTROY:PostQuitMessage(0);default:return DefWindowProc(hwnd,message,wParam,lParam);return(0);,4.2.2 几个主要的类,2、MFC的窗口类CWnd CWnd 类封装了窗口的所有属性和窗口处理的事件。同时还可以通过消息映射机制实现窗口的某些操作。主要函数有:窗口创建函数Create 封装了CreateWindowEX,创建时发送WM_Create消息窗口销毁函数DestroyWindowPostNcDestroy,4.2.2 几个主要的类,设定、获取和改变窗口属性

19、的函数SetWindowText:设置窗口的标题文字GetWindowText:获取窗口标题SetIcon:设置窗口的图标GetIcon:获取窗口图标GetDlgItem:得到窗口类指定ID的控制子窗口GetDC:得到窗口的设备上下文SetMenu:设置窗口的菜单GetMenu:得到窗口的菜单,补充:什么是设备上下文?,设备上下文(Device Context,DC)是一个表现一组图形对象和属性的结构使用设备上下文允许你直接操纵图形,不用考虑低级细节。Windows GDI是一个图形翻译系统,是介于应用程序和图形硬件之间的一层。GDI 可以输出到任意的兼容设备,不过最常使用的设备是视频监视器、

20、打印机或绘图仪,或者是内存中的图元文本。GDI 函数能够绘制各种图形和文本。所有访问GDI的Windows函数都需要一个设备上下文句柄作为参数。,4.2.2 几个主要的类,用于完成窗口动作的函数发送消息SendMessage:发送窗口消息,立即调用PostMessage:发送窗口消息,放进消息队列改变窗口状态MoveWindow:移动窗口ShowWindow:控制窗口的显示实现消息处理机制的函数WindowProc:虚函数OnCommand:处理命令消息消息处理函数:OnCreate和OnClose,4.2.2 几个主要的类,3、在MFC下创建一个窗口对象分两步:创建MFC窗口对象(定义)创建

21、对应的Windows窗口对象窗口创建过程中将发送两个消息:WM_NCCREATE:创建非客户区后发送该消息WM_CREATE:创建客户区后发送该消息,4.2.2 几个主要的类,4、MFC窗口的使用MFC窗口类包括:框架类CframeWnd和CMidFrameWnd文档框架CMidChildWnd视图Cview,继承有ClistView、CEditView、CTreeView、CRichEditView对话框CDialog工具条CToolBar状态条CStatusBar控制窗口CList、CEdit、CComboBox、CButton等,4.2.2 几个主要的类,5、MFC下窗口的销毁Hwnd窗

22、口的销毁和MFC窗口对象的销毁一般的窗口类:点击关闭按钮时将调用DestroyWindow完成销毁过程控制窗口:利用DestroyWindow完成销毁过程,4.3 CObject类,CObject是大多数 MFC类的根类或基类。CObject类有很多有用的特性:对运行时类信息的支持对动态创建的支持对串行化的支持对象诊断输出 MFC从CObject派生出许多类,具备其中的一个或者多个特性。程序员也可以从CObject 类派生出自己的类,利用CObject类的这些特性。,4.3.1 CObject的定义,CObject提供了:一个静态函数:_GetBaseClass;五个虚拟函数:析构函数、Get

23、RuntimeClass、Serialize、AssertValid、Dump 这些虚拟函数,在CObject 的派生类中应该有更具体的实现。必要的话,派生类实现它们时可能要求先调用基类的实现,例如Serialize 和Dump就要求这样。,4.3.2 CObject的特性,1、对运行时类信息的支持 即用于在运行时,判定一个对象是否属于一个特定的类,或者从一个特定类派生的,通过IsKindOf函数实现此功能。派生时,需要按如下操作:类说明文件中使用DECLARE_ DYNAMIC 宏类实现文件中使用IMPLEMENT_DYNAMIC宏,class CPerson:public CObject

24、public:DECLARE_ DYNAMIC(CPerson)CPerson();/缺省构造函数CString m_name;WORD m_number;void Serialize(CArchiveIMPLEMENT_ DYNAMIC(CPerson,CObject),4.3.2 CObject的特性,2、对动态创建的支持 及运行时创建该类的实例,要使得派生的类具有动态创建的功能,必须在定义该类时:类说明文件中使用DECLARE_ DYNCRETE 宏定义一个不带参数的构造函数类实现文件中使用IMPLEMENT_DYNCRETE宏,class CPerson:public CObject

25、public:DECLARE_DYNCREATE(CPerson)CPerson();/缺省构造函数CString m_name;WORD m_number;void Serialize(CArchive IMPLEMENT_DYNCREATE(CPerson,CObject),4.3.2 CObject的特性,使用时先通过宏RUNTIME_CLASS得到RunTime信息,然后用CRuntimeClass的成员函数CreateObject创建该类的实例例如:CRuntimeClass*pRuntimeClass=RUNTIME_CLASS(CNname)/CName必须有一个缺省构造函数CO

26、bject*pObject=pRuntimeClass-CreateObject();/用IsKindOf检测是否是CName类的实例Assert(pObject-IsKindOf(RUNTIME_CLASS(CName);,4.3.2 CObject的特性,3、对序列化的支持 序列化指的是把对象内容存入一个文件或从一个文件中读取对象内容的过程。类说明文件中使用DECLARE_ SERIAL 宏定义一个不带参数的构造函数类实现文件中使用IMPLEMENT_ SERIAL宏覆盖Serialize成员函数,4.3.2 CObject的特性,一个类要支持实现序列化,使得它的对象可以保存到文档中或者可

27、以从文档中读入到内存中并生成对象。需要覆盖基类的Serialize 虚拟函数来完成其对象的序列化。仅仅有类的支持是不够的,MFC 还提供了一个归档类CArchive来支持简单类型的数据和复杂对象的读写。,4.3.2 CObject的特性,一个CArchive对象在要序列化的对象和存储媒体之间起中介作用。它提供了系列方法来完成序列化,可以序列化的数据包括:简单类型数据:如int、float复杂的数据:如string等进行序列化复杂的对象:包括复合对象完成序列化的这些方法:重载的操作符和。创建CArchive对象时,必须有一个CFile对象,它代表了存储媒介。,class CPerson:publ

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

29、省构造函数CString m_name;WORD m_number;void Serialize(CArchive,4.3.2 CObject的特性,实现该类的成员函数Serialize,覆盖CObject的该函数:void CPerson:Serialize(CArchive,4.3.2 CObject的特性,CPerson a;/使用运行时类信息,ASSERT为宏(断言)ASSERT(a.IsKindOf(RUNTIME_CLASS(CPerson);ASSERT(a.IsKindOf(RUNTIME_CLASS(CObject);/动态创建:CRuntimeClass*pRuntimeC

30、lass=RUNTIME_CLASS(CPerson)/Cperson有一个缺省构造函数 CObject*pObject=pRuntimeClass-CreateObject();Assert(pObject-IsKindOf(RUNTIME_CLASS(CPerson);,4.4 消息映射的实现,4.4.1 消息的分类,1、队列消息和非队列消息(发送方式)队列消息:送到系统消息队列,然后送到线程消息队列非队列消息:后者直接送给目的窗口过程 队列消息包括:鼠标及键盘事件,WM_PAINT、WM_TIMER、WM_QUIT2、系统消息队列和线程消息队列系统消息队列:Windows操作系统维护的消

31、息队列线程消息队列:每个线程还有一个消息队列,4.4.1 消息的分类,3、系统消息和应用程序消息(应用范围)系统消息的ID范围为0-WM_USER-1,应用程序消息ID范围为WM_USER到0X7FFF。消息的ID是唯一的。设计程序时,必须保证消息的唯一性。,4.4.2 MSG消息结构和消息处理,1、MSG消息结构 操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。MSG结构定义如下:typedef struct tagMSGHWND hwnd;/窗口句柄(索引内存当中的资源)UINT message;/消息标识(ID)WPARAM wParam;/消息的附加参数,如按下是

32、哪个按键LPARAM LParam;/关于消息的附加参数 DWORD time;/消息被传递时候的时间POINT pt;/消息产生时鼠标的的位置 MSG;,4.4.2 MSG消息结构和消息处理,消息的处理:非队列消息由Windows直接送给目的窗口的窗口过程队列消息由:DispatchMessage等派发给目的窗口的窗口过程。窗口过程被调用时,接受四个参数:窗口句柄Hwnd消息标识ID两个32位的消息参数wParam,lParam;,4.4.2 MSG消息结构和消息处理,2、应用程序通过窗口过程来处理消息每个窗口类都有一个窗口过程LRESULT CALLBACK WndProc(HWND hW

33、nd,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(/发送消息 GetMessageTime/获取消息产生的时GetMessagePos/获取消息产生时鼠标光标所在的位置。,4.4.2 MSG消息结构和消息处理,3、应用程序通过消息循环获得对消

34、息的处理Win32GUI程序的基本消息处理方式:消息循环结构如下:MSG msg;while(GetMessage(,4.4.3 MFC消息处理,MFC的消息发送和处理本质上和上面介绍的Win32 API处理方式一样,但MFC是通过提供消息映射机制来处理消息的;消息映射:让编程者指定用来处理某个消息的某个MFC 类。在类中实现处理消息的函数和消息之间的关联。,4.4.4 MFC消息映射的定义和实现,1、MFC处理的三类消息Windows消息:“WM_”开头的消息,WM_COMMAND除外控制通知消息:控制子窗口送给父窗口的通知消息命令消息:菜单、工具栏等对象的通知消息 能处理消息映射的类必须从

35、CCmdTarget派生;,4.4.4 MFC消息映射的定义和实现,2、MFC消息映射的实现方法 通过类向导实现消息映射,在头文件中使用映射宏声明消息处理函数;/AFX_MSG(CTttApp)afx_msg void OnAppAbout();/AFX_MSGDECLARE_MESSAGE_MAP(),4.4.4 MFC消息映射的定义和实现,在对应的实现文件中使用映射宏实现消息和处理函数的关联。BEGIN_MESSAGE_MAP(CTApp,CWinApp)/AFX_MSG_MAP(CTttApp)ON_COMMAND(ID_APP_ABOUT,OnAppAbout)/AFX_MSG_MAP

36、END_MESSAGE_MAP(),消息映射宏的种类,1、映射Windows消息的宏,前缀为ON_WM_特点:不带参数,因为它对应的消息和消息处理函数的函数名称、函数原型是确定的。例如:宏ON_WM_CREATE()把消息WM_CREATE映射到OnCreate函数。,消息映射宏的种类,2、映射命令消息的宏ON_COMMAND特点:带有参数,需要通过参数指定命令ID和消息处理函数,映射单条命令消息。ON_COMMAND(ID_APP_ABOUT,OnAppAbout)ON_COMMAND_RANGE:特点:把一定范围的命令消息映射到一个消息处理函数的映射宏。带有3 个参数,需要指定命令ID的范

37、围和消息处理函数。ON_COMMAND_RANGE(1000,1003,OnAppAbout),消息映射宏的种类,3、用于控制窗口通知消息的宏特点:(1)可能带有三个参数,如ON_CONTROL,就需要指定通知码、控制窗口ID和消息处理函数;ON_CONTROL(CBN_SELCHANGE,ID_CB,OnSelChangeCB)(2)也可能带有两个参数,需要指定控制窗口ID和消息处理函数。ON_EN_CHANGE(IDC_NAME,OnChangeE_Name),消息映射宏的种类,3、用于控制窗口通知消息的宏(3)ON_CONTROL_RANGE(包含四个参数)参数1:nCode是特定的通知

38、码参数2、3:nID和nLastID指定控制窗口ID的范围参数4:响应的函数例如:10编辑框,任意一个编辑框的值改变时,全局变量i都改变ON_CONTROL_RANGE(wNotifyCode,id1,id10,memberFxn),消息映射宏的种类,4、用户界面状态更新的宏ON_UPDATE_COMMAND_UI 这类宏被映射到消息WM_COMMND上,带有两个参数,需要指定用户接口对象ID和消息处理函数。例如按钮变灰:ON_UPDATE_COMMAND_UI(IDC_BTN1,OnUpdateBtn1)有更新一定ID范围的用户接口对象的宏:ON_UPDATE_COMMAND_UI_RANG

39、E例如更新菜单ON_UPDATE_COMMAND_UI_RANGE(id1,id2,OnUpdateMenu),消息映射宏的种类,5、其它消息的宏ON_MESSAGE6、扩展消息映射宏,上节课重点,1、Win API与MFC的区别联系2、WIN32 API编程的基本框架3、VC的消息处理机制通过映射的方式实现消息的处理。消息映射时要在头文件中申明映射函数,实现文件中申明映射方式。,4.5 MFC对象的创建,MFC是基于“文档视图”为核心的编程模式。因此必须弄清楚如下MFC对象之间的关系:应用程序对象(主)边框窗口对象文档边框窗口对象文档对象视图对象文档模板对象重点弄清楚:这些对象之间的创建关系

40、和调用关系,4.5.1 MFC对象的关系,这里显示的是文档,4.5.1 MFC对象的关系,1、创建关系,补充:theApp的作用,应用程序全局对象:theApp是个全局变量,几乎可以在程序的任何地方引用,theApp是应用程序类的一个实例,在这个类中添加的public变量可以通过theApp引用。当然,由于WinApp是它的基类,theApp保存有许多有关程序运行期间的很多信息,如应用程序名、路径、命令行参数等。,4.5.1 MFC对象的关系,2、交互作用关系,这里显示的是文档,4.5.1 MFC对象的关系,3、从一个对象得到另一个对象的方法,4.5.1 MFC对象的关系,4、从一个对象通知另

41、一个对象的方法 通过前面的方法得到一个对象后,结合如下的函数可以更新对应的对象。,CDddDoc*pDoc=GetDocument();pDoc-UpdateAllView(),4.5.2 MFC 提供的接口,MFC编程就是把一些应用程序特有的东西填入到MFC框架中,填入的方法有两种:消息映射使用虚拟函数,4.5.2 MFC 提供的接口,1、虚拟函数接口 几乎每个MFC类都定义和使用了虚拟函数,编程时可以在派生类中覆盖他们。通常MFC提供了这些函数的缺省实现,因此覆盖函数应该调用基类的实现。覆盖基类的虚拟函数可以通过类向导进行。,4.5.2 MFC 提供的接口,2、消息映射方法和标准命令消息

42、不同类型的MFC 窗口实现的消息处理函数也不相同,编程时从一定的MFC 窗口派生自己的窗口类,对感兴趣的消息,覆盖基类的消息处理函数,以实现自己的消息处理函数。从CCmdTarger类继承的类都可以响应命令消息对话框的控制子窗口可以响应各类通知消息遵循原则:消息由哪个类产生,则由相应类进行处理,4.5.3 MFC对象的创建过程,MFC程序执行的三个阶段:应用程序启动和初始化阶段与用户交互阶段程序退出和清理阶段,4.5.3 MFC对象的创建过程,一些虚拟函数被调用的时间InitInstance:应用程序初始化时调用:ExitInstance:程序退出时调用Run:程序初始化之后调用,进入消息循环ProcessMessageFilter、OnIndle、PreTranslateMessage:在消息循环时被调用,4.6 应用程序的退出,1、首先处理WM_ClLOSE消息 关闭窗口,处理文档的存储,发送WM_QUIT;SDI:关闭应用程序的文档对象再关闭主窗口MDI:关闭所有文档对象销毁文档边框窗口和视图窗口关闭主窗口2、处理WM_QUIT消息 退出消息循环,退出程序。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号