您的位置:首页 > 编程语言 > C语言/C++

【Visual C++】CDC与HDC的区别以及相互转换

2012-12-11 00:07 232 查看
CDC是MFC的DC的一个类

HDC是DC的句柄,API中的一个类似指针的数据类型.

MFC类的前缀都是C开头的

H开头的大多数是句柄

这是为了助记,是编程读\写代码的好的习惯.

CDC中所有MFC的DC的基类.常用的CClientDC dc(this);就是CDC的子类(或称派生类).

CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄.

记住下面的一句话,会有助于你的理解.

MFC的类,是在用window API语句开发出来的有一定功能的小程序.(也可称为类).使用它的默认方法,就是,记住它的名字与参数(可以用笔记,代替脑记).

如果将window api比做汇编语言

那么MFC就相当于Basic语言.
cdc是设备描述表的基类,clientDC指代客户区的设备描述表,PaintDC只用于OnPaint()函数中

CDC是MFC的DC的一个类

HDC是DC的句柄,API中的一个类似指针的数据类型.

MFC类的前缀都是C开头的

H开头的大多数是句柄

这是为了助记,是编程读\写代码的好的习惯.

CDC中所有MFC的DC的基类.常用的CClientDC dc(this);就是CDC的子类(或称派生类).

CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄.

记住下面的一句话,会有助于你的理解.

MFC的类,是在用window API语句开发出来的有一定功能的小程序.(也可称为类).使用它的默认方法,就是,记住它的名字与参数(可以用笔记,代替脑记).

如果将window api比做汇编语言

那么MFC就相当于Basic语言.

HDC是WINDOWS的一种数据类型,是设备描述句柄。

而CDC是MFC里的一个类,它封装了几乎所有的关于

HDC的操作。

也可以这样说,HDC定义的变量指向一块内存,这块

内存用来描述一个设备的相关的内容,所以也可以

认为HDC定义的是一个指针;而CDC类定义一个对象,

这个对象拥有HDC定义的一个设备描述表,同时也包

含与HDC相关的操作的函数。

这与HPEN和CPen,POINT与CPoint之间的差别是一样

的。

CDC 到HDC 的转化:

方法一: 此方法在设备结束时不会销毁原来的资源(即:hDC,hBitmap)
CDC *pDC = CDC::FromHandle(hDC);
CBitmap *pBitmap = CBitmap::FromHandle(hBitmap);

方法二: 此方法在设备结束时会销毁原来的资源(即:hDC,hBitmap)
CDC dc;
dc.Attach(hDC);
CBitmap bit;
bit.Attach(hBitmap);

在结束的时候加dc.detach()也不会销毁原来资源

HDC hdc;

CDC
cdc;
cdc到hdc

hdc
= cdc.GetSafeHdc();
hdc到cdc

cdc.Attach(hdc);

tip1:
HDC hdc;

CDC
cdc;
cdc到hdc

hdc
= cdc.GetSafeHdc();
hdc到cdc

cdc.Attach(hdc)

tip2:

CDC 是MFC中的类

而HDC是Handle

使用

HDC
GetDC()

tip3:

CDC cdc;

HDC
hDC = cdc.m_hDC

tip4:

CDC dc;

HDC
hDC = dc.m_hDC
dc.FromHandle(hDC);

tip5:

CDC to
hdc
用成员变量m_hDC

hdc
to CDC
用FromHandle

tip6:

dc.FromHandle(hDC)产生一个dc,但是是临时的,mfc不保证系统在什么时候删除dc.

dc.Attach(hDC)是永久的,直到这个dc的生命正常结束。

tip7:
查找替换。将所有的(hdc,替换为pdc->(当然。前面声明个

pdc就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: