2024年4月5日发(作者:)

DC: device context 设备上下文 主要就是指绘图设备

HDC:设备上下文句柄 属于windows平台SDK 即API中 用于绘图数据类型

CDC:class of device-context objects 设备上下文类 属于MFC封装Windows API生成的(其实就是封装

了HDC) 给用户在MFC下绘图类

从MSDN Hierarchy Chart可以看到 MFC 下CWnd 与 CDC (这里顺便说下CWnd) MFC 把

窗口相关的封装到CWnd中 CWnd它派生于CCmdTarget类是最基本的GUI(图形用户接口)对象

作图相关的封装到CDC中 CDC它直接派生于CObject

CDC 下又派生出ClientDC CMetaFileDC CPaintDC CWindowDC

以下举例:

HDC hdc; //HDC 设备上下文句柄

hdc=::GetDC(m_hWnd); //::GetDC() windows平台SDK api 函数 参数handle to a

window

MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);

LineTo(hdc,point.x,point.y);

::ReleaseDC(m_hWnd,hdc);

CDC *pDC=GetDC(); //CWnd类中的成员函数 GetDC() 返回值CDC*

pDC->MoveTo(m_ptOrigin);

pDC->LineTo(point);

ReleaseDC(pDC);

//CClientDC:public CDC 特点:构造函数时候GetDC() 析构函数时候调用

ReleaseDC

CClientDC dc(this); //指针构造DC

CClientDC dc(GetParent());//GetParent view的父窗口 也就是frame 但不能出客户

区域

(m_ptOrigin);

(point);

//CWindowDC 也是派生于CDC 构造、析构也是类似ClientDC 可以访问整个程序区

域 包括客户区与非客户区

CWindowDC dc(this); //绘制当前窗口

CWindowDC dc(GetParent()); //绘制父窗体 文档结构中 可以绘制到框架类 乃至非

客户区上

CWindowDC dc(GetDesktopWindow());//可以绘制到整个非客户区 桌面上

(m_ptOrigin);

(point);

//透明画刷

CBrush brush(RGB(255,0,0));

CClientDC dc(this);

ct(CRect(m_ptOrigin,point),&brush);

//由于MFC的CBrush画刷类中没有透明画刷 但平台SDK HBRUSH中有 所以这

里需要转换一下

CBrush

*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

//CBrush::FromHandle 说明FromHandle是静态函数 参数返回值 如上所示

//透明画刷 GetStockObject(NULL_BRUSH)获取透明画刷句柄

//此时需将句柄转化为C++对象 或 对象的指针

//FromHandle() 句柄画刷转换为对象的指针

CBrush *pOldBrush=Object(pBrush);

gle(CRect(m_ptOrigin,point));//绘制矩形

Object(pOldBrush);

CPaintDC 用于响应窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint()

取得设备上下文,在析构函数中调用 EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还

负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT

消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。

所以,CPaintDC和CClientDC、CWindowDC从应用角度来看两回事情,不能拿在一起比较!!

CDC类及其子类---CClientDC、CWindowDC和CPaintDC

/ccfboy/archive/2009/05/02/

CDC类

Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 。MFC基础类库

定义了设备环境对象类----CDC类。

父类:从 CObject 直接继承而来。继承了CObject类的各种特性,如动态创建等等。

例如用GDI画矩形要Rectangle(hDC,...),而使用CDC则是gle(...),由此可见CDC

主要是把原本需要HDC作为参数的GDI函数封装了一下,HDC成了它的一个成员变量。

CPaintDC CWindowDC CClientDC:他们都是从CDC继承,分别是对上面所说的

BeginPaint,GetWindowDC, GetDC调用对进行封装(CPaintDC构造时调用BeginPaint,析构时

调用EndPaint,其余同理)。