HDC CDC CPaintDC CClientDC CWindowDC 等绘图整理 透明画刷

简介:

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从应用角度来看两回事情,不能拿在一起比较!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值