博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows Gdi & CDC和HDC的区别与转换
阅读量:5815 次
发布时间:2019-06-18

本文共 1236 字,大约阅读时间需要 4 分钟。

一,GDI基础   

   GDI的绘图函数基本上都是有状态的,所有的函数都要求一个HDC类型的句柄。这个HDC的获得有几个途径BeginPaint,GetWindowDC, GetDC.他们的参数都只需要一个HWND就差不多了。记得调用了BeginPaint后要调用EndPaint进行清理,调用GetWindowDC和GetDC后要调ReleaseDC进行清理。

 

      而在MFC代码中,常常遇到的CDC CPaintDC CWindowDC CClientDC。在这里稍作解释。

  CDC :例如用GDI画矩形要Rectangle(hDC,...),而使用CDC则是dc.Rectangle(...),由此可见CDC主要是把原本需要HDC作为参数的GDI函数封装了一下,HDC成了它的一个成员变量。
  CPaintDC CWindowDC CClientDC:他们都是从CDC继承,分别是对上面所说的BeginPaint,GetWindowDC, GetDC调用对进行封装(CPaintDC构造时调用BeginPaint,析构时调用EndPaint,其余同理)。
  BeginPaint:一般用在对WM_PAINT的响应函数中使用
  GetWindowDC:可获得整个Window的HDC,而GetDC仅能获得客户区的HDC,区别就在于--
  前者有效地绘制区域是整个窗口(边框、标题栏、客户区的总和)。
  后者有效地绘制区域仅限于客户区。
  两者的坐标系都是相对坐标而非屏幕坐标,原点是(0,0)。即以自己可绘制区域的左上角作为原点。

 

二,CDC和HDC的区别与转换

 

一)区别与联系

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

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

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

也可以这样说,HDC定义的变量指向一块内存,这块 内存用来描述一个设备的相关的内容,所以也可以   认为HDC定义的是一个指针;而CDC类定义一个对象,   这个对象拥有HDC定义的一个设备描述表,同时也包   含与HDC相关的操作的函数。   

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

 

二)获得CDC *

CDC* pDC

pDC=GetDC(); 

 

三)获得hdc

HDC hDC;

1,hDC=GetDC(pCxp->hWnd);  // windows api

2,pDC->m_hDC;        // mfc CDC class member data

 

四)转换

CDC* pDC

HDC hDC;

pDC=Attach(hDC);

hDC=GetSafeHDC(pDC);

pDC->m_hDC==hDC

转载于:https://www.cnblogs.com/endenvor/p/9855503.html

你可能感兴趣的文章
JS找出一串字符中出现最多的字符
查看>>
C++ 0X 新特性实例(比较常用的) (转)
查看>>
node生成自定义命令(yargs/commander)
查看>>
各种非算法模板
查看>>
mahout learning 代码示例
查看>>
node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)
查看>>
PIE.NET-SDK插件式二次开发文档
查看>>
如何创建Servlet
查看>>
.NET 设计规范--.NET约定、惯用法与模式-2.框架设计基础
查看>>
Linux单用户CS模型TCP通讯完全注释手册
查看>>
win7 64位+Oracle 11g 64位下使用 PL/SQL Developer 的解决办法
查看>>
to Generate Armstrong Numbers
查看>>
配置管理
查看>>
BZOJ1997:[HNOI2010]PLANAR——题解
查看>>
BZOJ1014:[JSOI2008]火星人prefix——题解
查看>>
使用Unity3D引擎开发赛车游戏
查看>>
团队第一次冲刺
查看>>
gradle 添加依赖
查看>>
JAVA格式化时间日期
查看>>
linux 常见音乐、视频播放器简介
查看>>