MFC Object和Windows Object的关系
2012-07-11 11:40
211 查看
2.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 Object和Windows Object是不一样的,但两者紧密联系。以窗口对象为例:
Object和对应的MFC Object也有类似的关系。
下面,对MFC Object和Windows Object作一个比较。有些论断对设备描述表(MFC类是CDC,句柄是HDC)可能不适用,但具体涉及到时会指出。
(1) 从数据结构上比较
MFC Object是相应C++类的实例,这些类是MFC或者程序员定义的;
Windows Object是Windows系统的内部结构,通过一个句柄来引用;
MFC给这些类定义了一个成员变量来保存MFC Object对应的Windows Object的句柄。对于设备描述表CDC类,将保存两个HDC句柄。
(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,或者在STACK中创建,或者在HEAP中创建,这时,MFC Object的句柄实例变量为空,或者说不是一个有效的句柄。
然后,调用MFC Object的成员函数创建相应的Windows Object,MFC的句柄变量存储一个有效句柄。
CDC(设备描述表类)的创建有所不同,在后面的2.3节会具体说明CDC及其派生类的创建和使用。
当然,可以在MFC Object的构造函数中创建相应的Windows对象,MFC的GDI类就是如此实现的,但从实质上讲,MFC Object的创建和Windows Object的创建是两回事。
(4) 从转换上比较
可以从一个MFC Object得到对应的Windows Object的句柄;一般使用MFC Object的成员函数GetSafeHandle得到对应的句柄。
可以从一个已存在的Windows Object创建一个对应的MFC Object; 一般使用MFC Object的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。
(5) 从使用范围上比较
MFC Object对系统的其他进程来说是不可见、不可用的;而Windows Object一旦创建,其句柄是整个Windows系统全局的。一些句柄可以被其他进程使用。典型地,一个进程可以获得另一进程的窗口句柄,并给该窗口发送消息。
对同一个进程的线程来说,只可以使用本线程创建的MFC Object,不能使用其他线程的MFC Object。
(6) 从销毁上比较
MFC Object随着析构函数的调用而消失;但Windows Object必须由相应的Windows系统函数销毁。
设备描述表CDC类的对象有所不同,它对应的HDC句柄对象可能不是被销毁,而是被释放。
当然,可以在MFC Object的析构函数中完成Windows Object的销毁,MFC Object的GDI类等就是如此实现的,但是,应该看到:两者的销毁是不同的。
每类Windows Object都有对应的MFC Object,下面用表格的形式列出它们之间的对应关系,如表2-1所示:
表2-1 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及其派生类 |
Windows对象,
设备上下文对象,
GDI对象(BITMAP,BRUSH,FONT,PALETTE,PEN,RGN),
菜单,
图像列表,
网络套接字接口。
从广义上来看,文档对象和文件可以看作一对MFC Object和Windows Object,分别用CDocument类和文件句柄描述。
后续几节分别对前四类作一个简明扼要的论述。
相关文章推荐
- MFC和Win32之一___MFC Object和Windows Object的关系
- MFC Object和Windows Object的关系
- MFC和Win32之一___MFC Object和Windows Object的关系
- MFC Object和Windows Object的关系
- MFC Object和Windows Object的关系
- MFC中 windows object 和 C++ object
- MFC Object和Windows Object的关系
- MFC中的类和Windows中的3种消息类型的关系
- JAVA_对象一对一关系 ObjectOneToOneRelationship.java
- windows编程,vc,mfc消息处理
- C++下Windows Forms + MFC + WTL + wxWidgets + Qt + GTK+ 非官方综合比较
- VS2013/MFC编程入门之三十七(文档、视图和框架:各对象之间的关系)
- C++,Windows/MFC_中L、_T、TEXT、_TEXT区别
- A Simple Way to Enable a Windows XP Look and Feel for VC++ 6.0 MFC Applications
- 学习一下如何自定义Windows MFC消息
- MFC对话框风格和工程字符集的关系
- Windows 下利用MFC实现的中国象棋棋盘绘制程序
- windows中的WaitForSingleObject和WaitForMultipleObjects
- MFC调用windows的时间和日期属性对话框
- MFC(一)——WINDOWS消息机制