MFC教程(2)-- MFC和Win32

MFC Object和Windows Object的关系

MFC中最重要的封装是对Win32 API的封装,因此,理解Windows Object和MFC Object (C++对象,一个C++类的实例)之间的关系是理解MFC的关键之一。所谓Windows Object(Windows对象)是Win32下用句柄表示的Windows操作系统对象;所谓MFC Object (MFC对象)是C++对象,是一个C++类的实例,这里(本书范围内)MFC Object是有特定含义的,指封装Windows Object的C++ Object,并非指任意的C++ Object。

MFC Object 和Windows Object是不一样的,但两者紧密联系。以窗口对象为例:


一个MFC窗口对象是一个C++ CWnd类(或派生类)的实例,是程序直接创建的。在程序执行中它随着窗口类构造函数的调用而生成,随着析构函数的调用而消失。而Windows窗口则是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。Windows窗口在MFC窗口对象创建之后,由CWnd类的Create成员函数创建,“窗口句柄”保存在窗口对象的m_hWnd成员变量中。Windows窗口可以被一个程序销毁,也可以被用户的动作销毁。MFC窗口对象和Windows窗口对象的关系如图2-1所示。其他的Windows Object和对应的MFC Object也有类似的关系。

下面,对MFC Object和Windows Object作一个比较。有些论断对设备描述表(MFC类是CDC,句柄是HDC)可能不适用,但具体涉及到时会指出。

从数据结构上比较

MFC Object是相应C++类的实例,这些类是MFC或者程序员定义的;

Windows Object是Windows系统的内部结构,通过一个句柄来引用;

MFC给这些类定义了一个成员变量来保存MFC Object对应的Windows Object的句柄。对于设备描述表CDC类,将保存两个HDC句柄。

从层次上讲比较

MFC Object是高层的,Windows Object是低层的;

MFC Object封装了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接应用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相应的MFC Object的成员函数。

从创建上比较

MFC Object通过构造函数由程序直接创建;Windows Object由相应的SDK函数创建。

MFC中,使用这些MFC Object,一般分两步:

首先,创建一个MFC Object,或者在STACK中创建,或者在HEAP中创建,这时,MFC Object的句柄实例变量为空,或者说不是一个有效的句柄。

然后,调用MFC Object的成员函数创建相应的Windows Object,MFC的句柄变量存储一个有效句柄。

CDC(设备描述表类)的创建有所不同,在后面的2.3节会具体说明CDC及其派生类的创建和使用。

当然,可以在MFC Object的构造函数中创建相应的Windows对象,MFC的GDI类就是如此实现的,但从实质上讲,MFC Object的创建和Windows Object的创建是两回事。

从转换上比较

可以从一个MFC Object得到对应的Windows Object的句柄;一般使用MFC Object的成员函数GetSafeHandle得到对应的句柄。

可以从一个已存在的Windows Object创建一个对应的MFC Object; 一般使用MFC Object的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。

时间: 2024-11-05 06:02:20

MFC教程(2)-- MFC和Win32的相关文章

MFC教程(1)--MFC概述

MFC是一个编程框架 MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法.因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓.Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步

VC精华教程:MFC入门

·VC精华教程:MFC入门系列(一) ·VC精华教程:MFC入门系列(二) ·VC精华教程:MFC入门系列(三) ·VC精华教程:MFC入门系列(四) ·VC精华教程:MFC入门系列(五) ·VC精华教程:MFC入门系列(六)

MFC教程(11)-- MFC下的文件类

文件操作的方法 使用Visual C++编程,有如下方法进行文件操作: (1)使用标准C运行库函数,包括fopen.fclose.fseek等. (2)使用Win16下的文件和目录操作函数,如lopen.lclose.lseek等.不过,在Win32下,这些函数主要是为了和Win16向后兼容. (3)使用Win32下的文件和目录操作函数,如CreateFile,CopyFile,DeleteFile,FindNextFile,等等. Win32下,打开和创建文件都由CreateFile完成,成功

MFC教程(8)-- MFC的进程和线程

Win32的进程和线程概念 进程是一个可执行的程序,由私有虚拟地址空间.代码.数据和其他操作系统资源(如进程创建的文件.管道.同步对象等)组成.一个应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程. 线程是操作系统分时调度分配CPU时间的基本实体.一个线程可以执行程序的任意部分的代码,即使这部分代码被另一个线程并发地执行:一个进程的所有线程共享它的虚拟地址空间.全局变量和操作系统资源. 之所以有线程这个概念,是因为以线程而不是进程为调度对象效率更高: 由于创建新进程必

MFC教程(4)-- 消息映射的实现(2)

但是在当前例子中,当前对象的类CTview没有覆盖该函数,所以CWnd的WindowProc被调用. 这个函数把下一步的工作交给OnWndMsg函数来处理.如果OnWndMsg没有处理,则交给DefWindowProc来处理. OnWndMsg和DefWindowProc都是CWnd类的虚拟函数. OnWndMsg的原型如下: BOOL CWnd::OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam,RESULT*pResult ); 该函数

MFC教程(13)-MFC工具条和状态栏(1)

Windows控制窗口 Windows (Windows95或者以上版本) 提供了系列通用控制窗口,其中包括工具条(ToolBar).状态栏(StatusBar).工具条提示窗口(ToolTip). Windows在一个DLL加载时注册个控制窗口的"窗口类".例如,工具条的"窗口类"是"ToolbarWindow32",状态栏的"窗口类"是"msctls_statusbar32",工具条提示窗口的"

MFC教程(5)-- MFC对象的创建(1)

MFC对象的创建 前面几章介绍了MFC的核心概念和思想,即介绍了MFC对Windows对象的封装方法和特点:MFC对象的动态创建.序列化:MFC消息映射机制. 现在,考查MFC的应用程序结构体系,即以文档-视为核心的编程模式.学习本章,应该弄清楚以下问题: MFC中诸多MFC对象的关系:应用程序对象,文档对象,边框窗口对象,文档边框窗口对象,视对象,文档模板对象等. MFC对象的创建和销毁:由什么对象创建或销毁什么对象,何时创建,何时销毁? MFC提供了那些接口来支持其编程模式? MFC对象的关

MFC教程(12)-- 对话框和对话框类CDialog(2)

RunModalLoop是一个实现自己的消息循环的示例,消息循环的条件是模式化状态没有结束.实现线程自己的消息循环见8.5.6节.当用户按下按钮"取消"."确定"时,将导致RunModalLoop退出消息循环,结束对话框模式状态,并调用::EndDialog关闭窗口.有关关闭对话框的处理如下:void CDialog::EndDialog(int nResult) { ASSERT(::IsWindow(m_hWnd)); if (m_nFlags & (W

MFC教程(9)-- MFC的进程和线程(2)

下面以一个动态链接到MFC DLL的单模块应用程序为例,说明这些对象的创建过程. 当第一次访问状态信息时,比如使用 AfxGetModuleState得到模块状态,导致系列创建过程的开始,如图9-7所示. 首先分析语句pState=_afxThreadState.如果_afxThreadData.线程状态和模块状态还没有创建,该语句可以导致这些数据的创建. pState声明为CNoTrackObject对象的指针,_afxThreadState声明为一个模板CThreadLocal的实例,pSt