简介:
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 但不能出客户区域 dc.MoveTo(m_ptOrigin); dc.LineTo(point); //CWindowDC 也是派生于CDC 构造、析构也是类似ClientDC 可以访问整个程序区域 包括客户区与非客户区 CWindowDC dc(this); //绘制当前窗口 CWindowDC dc(GetParent()); //绘制父窗体 文档结构中 可以绘制到框架类 乃至非客户区上 CWindowDC dc(GetDesktopWindow());//可以绘制到整个非客户区 桌面上 dc.MoveTo(m_ptOrigin); dc.LineTo(point); //透明画刷 CBrush brush(RGB(255,0,0)); CClientDC dc(this); dc.FillRect(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=dc.SelectObject(pBrush); dc.Rectangle(CRect(m_ptOrigin,point));//绘制矩形 dc.SelectObject(pOldBrush); |
CPaintDC 用于响应窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用 EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。
所以,CPaintDC和CClientDC、CWindowDC从应用角度来看两回事情,不能拿在一起比较!!