天天看点

HDC、CDC、CWindowDC、CClientDC……

DC(DeviceContex)叫做设备环境或设备描述表、设备上下文,是MFC绘图的基础。

经常用到的有CDC、CWindowDC、CClientDC、CPaintDC、CMetaFileDC还有HDC。

一、HDC与CDC的区别和联系

首先要明确HDC是资源句柄,其他都是MFC的类。HDC和CDC的关系与HWnd和CWnd的关系类似,CWnd中有一个HWnd类型的成员变量m_hWnd,同样CDC中有一个HDC类型的成员变量m_hDC。

二、CDC、CWindowDC、CClientDC、CPaintDC、CMetaFileDC的关系

查阅MFC Hierarchy Chart可以看到CWindowDC、CClientDC、CPaintDC和CMetaDC都是由CDC派生得到的。

CDC: Object provides member functions for working with a device context, such as a display or printer, as well as members for working with a display context associated with the client area of a window.

CClientDC:Device context associated with a CClientDC object is the client area of a window.

CWindowDC:CWindowDC object accesses the entire screen area of a CWnd (both client and nonclient areas).

CPaintDC:A CPaintDC object can only be used when responding to a WM_PAINT message, usually in your OnPaint message-handler member function.

CMetaFileDC : Implements a Windows metafile, which contains a sequence of graphics device interface (GDI) commands that you can replay to create a desired image or text.

CPaintDC只能在WM_PAINT消息响应中使用,CMetaFileDC包含了一序列图形设备接口(GDI)命令,可以用来创建需要的图像或文本。

CDC、CClientDC和CWindowDC最容易混淆,下面具体区分一下这三者之间的异同。

三、CDC、CClientDC和CWindowDC的使用——客户区与非客户区

以vs2010编辑器为例,图中蓝色部分为窗体框架的客户区,蓝色的部分外侧为窗体框架的非客户区(包括程序图标,标题栏,菜单,最大最小,关闭按纽和状态栏);图中绿色部分为文档视图的客户区,绿色部分外侧为文档视图的 非客户区(包括文件图标,标题栏和两个滚动条)。

HDC、CDC、CWindowDC、CClientDC……

弄清楚了窗体的客户区和非客户区,CDC、CClientDC和CWindowDC三者的使用就很简单了,CDC适用于显示设备或窗体客户区;CClientDC只能用于窗体客户区;CWindowDC适用于CWnd整个窗口。