首先看一下下面的表格,左边的是MFC提供的类,右边则是句柄,注意,这些句柄是一些结构体,跟类和对象并不相干
MFC对象
WINDOWS 句柄
CBitmap
HBITMAP
CPen
HPEN
CBrush
HBRUSH
CFont
HFONT
CPalette
HPALETTE
CRgn
HRGN
CDC
HDC
右边的为WINDOWS 句柄,换句话说,就是用SDK编程时使用的底层数据结构,而左边的系列则是根据右边的句柄为基础,综合了相关的操作方法,最终生成的的C++类,换句话说就是MFC对原有的类型进行了封装,但这并不意味着MFC中只用到了类似CBitmap这类的对象,某些函数,某些结构需要WINDOWS句柄,这时需要进行转换,转换的方法是如下:
(1) 用一个HANDLE来构建一个MFC对象的方法:利用已经有的WINDOWS句柄可以生成一个MFC对象,方法是调用FormHandle函数,下面的语句
CBitmap mybmp;
mybmp.FormHandle( hBitmap);
就可以创建一个基于hBitmap句柄的CBitmap对象了
(2) 从一个CBitmap对象中取出对应的句柄,有两种方法,但是都需要强制类型的转换,或者说是必须要显式的转换
CBitmap mybmp;
HBITMAP hBitmap;
hBitmap = (HBITMAP)mybmp.m_hObject;
hBitmap = (HBITMAP)mybmp;
任何一个对象都是从CObject类继承的,那么都存在一个成员变量,m_hObject,当然直接转换是最简单的
但是注意,这里存在一个特殊的类型,就是CDC和HDC这两个类型的转换,原本的这两个类型不与前面的类型归为一类,由于常常使用,这里就先将其归类为这里,这两者的转换方式有区别:
从CDC对象生成HDC句柄的方法是:
CDC * pDC;
HDC h_DC;
h_DC = pDC-> m_hDC
从HDC句柄生成CDC对象的方法是:
pDC.FromHandle( h_DC);
从操作哦上来看其实差不多,因此归为一类,在遇到类似问题时,可以自己做一下尝试,然后参考下MSDN,这方面的类容会在后面的工作中进行添加