关于HDC CDC 兼容DC

HDC是句柄,CDC是MFC封装的windows设备相关的一个 类,clientDC是CDC的一个衍生类,产生于对应windows客户区的对象。


pDC是类指针,HDC是windows句柄,通过pDC获得 hDC  hDC=pDC->getsafeDC(),通过hdc获得pDC,CDC *pDC=new CDC();
pDC->attch(hdc); HDC是WINDOWS的一种数据类型,是设备描述句柄。 
而CDC是MFC里的一个类,它封装了几乎所有的关于 
HDC的操作。 
也可 以这样说,HDC定义的变量指向一块内存,这块 
内存用来描述一个设备的相关的内 容,所以也可以 
认为HDC定义的是一个指针;而CDC类定义一个对象, 
这个对象拥有HDC定义的一个设备描述表,同时也包 
含与HDC相关的操作的函数。 
这与HPEN和CPen,POINT与CPoint之间的差别是一样 
的。


CreateCompatibleDC   假如你要对屏幕进行比较多的gdi函数操作,如果每一步操作 都直接对屏幕dc进行操作,那出现的大多数可能性都是屏幕的闪烁。一个很好的解决方法就是使用内存dc,将这些操作全部先在内存dc上操作,然后依次性在 屏幕上进行操作。 


  例如:如果你单单使用bitblt在屏幕上拷贝一个图,那可以直接使用屏幕的dc。但是如果你要先设置背景(fillrect)然后再bitblt的话, 这就涉及到两个屏幕dc的操作,这样的话屏幕很容易闪烁。






保 存客户区的数据为bmp图片


1 先获取客户区hdc,hScrDC=getdc()函数。


然 后为屏幕设备表创建一个兼容的内存设备描述表


hMemDC = CreateCompatibleDC(hScrDC); 


注意: CreateCompatibleDC 创建的内存DC不能立刻使用,你必须用CreateCompatibleBitmap   


  创建一个内存Bitmap,然后把他SelectObject到内存DC中去






物理HDC 设备底层会拥有显存等资源,但是兼容DC并没有给图像像素提供内存空间,因此兼容DC总是和BITMAP配合使用,这样一来,兼容 DC就利用BITMAP的图像像素数据空间给自己提供类似于显存的内存空间.


这样有很多好处,以来我们可以在加载图片后,在图片上利用DC的各种绘图功能.请看如下示例:


兼容DC在建立之初,只有1*1像素的尺寸,SelectObject选择bitmap以后才可以进行绘图.


内存DC的可见区域是简单的区域,不像物理DC可见区域可能被其他窗口覆盖而产生复杂的可见区域.由于DC的任何绘图都需要考虑在可见区域内绘 图,绝对不能超出可见区域的范围.因此每个GDI绘图输出最终都需要和构成复杂可见区域的每一个巨型区域进行剪裁输出,因此物理DC的绘图效果会比兼容 DC速度慢一些.这也就是我们经常用兼容DC进行双缓存输出的一个原因


HDC hdc = GetDC(hwnd);
  HDC memdc = CreateCompatibleDC(hdc);
  RECT rc;
  BITMAP bmp; 
 HBITMAP holdbmp,hbmp = LoadBitmap(hInstDVBRes,MAKEINTRESOURCE(IDB_CLOCK)); // 从资源加载位图 
 holdbmp = (HBITMAP)SelectObject(memdc,hbmp); // 这里把hbmp的位图选择到兼容DC memdc,之后这个兼容DC就拥有和
 // hbmp同样大小的绘图区域,注意超出位图返回的GDI输出都是无效的. 
 GetObject(hbmp, sizeof (BITMAP), & bmp); // 这里获取位图的大小信息,事实上也 是兼容DC绘图输出的范围 
 SetRect( & rc, 0 , 0 ,bmp.bmWidth,bmp.bmHeight);
 DrawText(memdc, " Center Line Text "   - 1 , & rc,DT_VCENTER | DT_SINGLELINE | DT_CENTER); // 在兼容DC中间位置输出字符串
 // 这样以来我们就相当于把hbmp这个位图加上了文字标注,我们可以把这个增加了文字标 注的位图保存起来.一个简单的图像处理基本就OK了. 
 SelectObject(memdc,holdbmp); // 复原兼容DC数据. 
 DeleteDC(memdc);
 // ..........
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值