MFC简介及MFC Object与Windows Object之间的比较

Posted qidong-518

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC简介及MFC Object与Windows Object之间的比较相关的知识,希望对你有一定的参考价值。

MFC(微软基础类库)

  微软基础类库(Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

VC++简介:

vc++是微软公司开发的c/c++的集成开发环境,所谓集成开发环境,就是说利用它可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。vc也指它的内部编译器,集成开发环境必须有一个编译器内核,例如DevC++其中一个编译器内核就是gcc。 MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。但是MFC的封装很浅,所以效率上损失不大。

 

MFC中最重要的封装是对Win32 API的封装,理解MFC的关键是理解Windows Object和MFC Object (C++对象,一个C++类的实例)之间的关系;其中,Windows Object(Windows对象)是Win32下用句柄表示的Windows操作系统对象;而MFC Object (MFC对象)是C++对象,是一个C++类的实例,封装了Windows Object(windows对象)的C++ Object,并非指任意的C++ Object。

  

MFC Object 和Windows Object是不一样的,但两者紧密联系;

 

下面以C++的窗口对象和window的窗口为例,简单说说其中的联系:

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

 

下面将作出一些比较:

(1)数据结构不同:

  MFC Object是相应C++类的实例,这些类是MFC或者程序员定义的;Windows Object是Windows系统的内部结构,通过一个句柄来引用;

(2)层次上的不同:   

  MFC Object是高层的,Windows Object是低层的;MFC Object封装了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接应用Windows Object的HANDLE(句柄)使用Win32 API,代替它的是引用相应的MFC Object的成员函数。
 
(3)创建方式的不同:
  MFC Object通过构造函数由程序直接创建;Windows Object由相应的SDK函数创建。MFC中,使用这些MFC Object,一般分两步:首先,创建一个MFC Object,或者在栈中创建,或者在堆中创建,这时,MFC Object的句柄实例变量为空,或者说不是一个有效的句柄。然后,调用MFC Object的成员函数创建相应的Windows Object,MFC的句柄变量存储一个有效句柄。
 
(4)使用范围的不同:
  MFC Object对系统的其他进程来说是不可见、不可用的;而Windows Object一旦创建,其句柄是整个Windows系统全局的。一些句柄可以被其他进程使用。典型地,一个进程可以获得另一进程的窗口句柄,并给该窗口发送消息。对同一个进程的线程来说,只可以使用本线程创建的MFC Object,不能使用其他线程的MFC Object。
 
(5)销毁上的不同:
  MFC Object随着析构函数的调用而消失;但Windows Object必须由相应的Windows系统函数销毁。设备描述表CDC类的对象有所不同,它对应的HDC句柄对象可能不是被销毁,而是被释放。当然,可以在MFC Object的析构函数中完成Windows Object的销毁,MFC Object的GDI类等就是如此实现的,但是,应该看到:两者的销毁是不同的。
 
怎样转换在MFC Object和Windows对象之间进行转换呢?
  可以从一个MFC Object得到对应的Windows Object的句柄;一般使用MFC Object的成员函数GetSafeHandle得到对应的句柄。可以从一个已存在的Windows Object创建一个对应的MFC Object; 一般使用MFC Object的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。
 
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及其派生类
 

其中:GDI对象包括BITMAP,BRUSH,FONT,PALETTE,PEN,RGN;

 

以上是关于MFC简介及MFC Object与Windows Object之间的比较的主要内容,如果未能解决你的问题,请参考以下文章

基于SocketOpenCV和MFC实现的网络实时视频监控

编写第一个MFC应用程序

MFC模拟 Windows 文件可视化系统

课程设计|MFC人民币大小写转换(含课程报告+源码)

课程设计|MFC人民币大小写转换(含课程报告+源码)

VC++ 2010 MFC新特性学习 - 增强与Windows Shell的集成