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,其余同理)。
发布评论