MFC介绍

MFC:Microsoft Foundation Classes.微软公司提供的一组类库,以C++类的形式封装了Windows API,并包含一个应用程序框架。

一、Win32和MFC

1.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类是CDC,句柄是HDC)
  (1).MFC Object 和Windows Object是不一样的,但两者紧密联系。以窗口对象为例:
  一个MFC窗口对象是一个C++ CWnd类(或派生类)的实例,是程序直接创建的。在程序执行中它随着窗口类构造函数的调用而生成,随着析构函数的调用而消失。而Windows窗口则是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。Windows窗口在MFC窗口对象创建之后,由CWnd类的Create成员函数创建,“窗口句柄”保存在窗口对象的m_hWnd成员变量中。Windows窗口可以被一个程序销毁,也可以被用户的动作销毁。
   MFC Object和Windows Object的对应关系
描述
Windows句柄
MFC Object
窗口
HWND
CWnd and CWnd-derived classes
设备上下文
HDC
CDC and CDC-derived classes
菜单
HMENU
CMenu
HPEN
CGdiObject类,CPen和CPen-derived classes
刷子
HBRUSH
CGdiObject类,CBrush和CBrush-derived classes
字体
HFONT
CGdiObject类,CFont和CFont-derived classes
位图
HBITMAP
CGdiObject类,CBitmap和CBitmap-derived classes
调色板
HPALETTE
CGdiObject类,CPalette和CPalette-derived classes
区域
HRGN
CGdiObject类,CRgn和CRgn-derived classes
图像列表
HimageLIST
CimageList和CimageList-derived classes
套接字
SOCKET
CSocket,CAsynSocket及其派生类
 
  (2)数据结构上
  MFC Object是相应C++类的实例,这些类是MFC或者程序员定义的;
  Windows Object是Windows系统的内部结构,通过一个句柄来引用;
  MFC给这些类定义了一个成员变量来保存MFC Object对应的Windows Object的句柄。对于设备描述表CDC类,将保存两个HDC句柄。
  (3)层次上
  MFC Object是高层的,Windows Object是低层的;
  MFC Object封装了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接应用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相应的MFC Object的成员函数。
  (4)创建上
  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的创建是两回事。
  (5)转换上
  可以从一个MFC Object得到对应的Windows Object的句柄;一般使用MFC Object的成员函数GetSafeHandle得到对应的句柄。
  可以从一个已存在的Windows Object创建一个对应的MFC Object; 一般使用MFC Object的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。
  (6)使用范围上
  MFC Object对系统的其他进程来说是不可见、不可用的;而Windows Object一旦创建,其句柄是整个Windows系统全局的。一些句柄可以被其他进程使用。典型地,一个进程可以获得另一进程的窗口句柄,并给该窗口发送消息。
  对同一个进程的线程来说,只可以使用本线程创建的MFC Object,不能使用其他线程的MFC Object。
  (7)销毁上
  MFC Object随着析构函数的调用而消失;但Windows Object必须由相应的Windows系统函数销毁。
  设备描述表CDC类的对象有所不同,它对应的HDC句柄对象可能不是被销毁,而是被释放。
  当然,可以在MFC Object的析构函数中完成Windows Object的销毁,MFC Object的GDI类等就是如此实现的,但是,应该看到:两者的销毁是不同的。
  
  MFC Object分为以下几类:
  Windows对象,
  设备上下文对象,
  GDI对象(BITMAP,BRUSH,FONT,PALETTE,PEN,RGN),
  菜单,
  图像列表,
  网络套接字接口。
  从广义上来看,文档对象和文件可以看作一对MFC Object和Windows Object,分别用CDocument类和文件句柄描述。
 
2.Windows Object
  用SDK的Win32 API编写各种Windows应用程序,有其共同的规律:首先是编写WinMain函数,编写处理消息和事件的窗口过程WndProc,在WinMain里头注册窗口(Register Window),创建窗口,然后开始应用程序的消息循环。
  MFC应用程序也不例外,因为MFC是一个建立在SDK API基础上的编程框架。对程序员来说所不同的是:一般情况下,MFC框架自动完成了Windows登记、创建等工作。
  
 
 
                             
posted @ 2016-05-25 17:16  LT.DMR  阅读(165)  评论(0)    收藏  举报