CPaintDC 、CWindowDC、 CClientDC、 CDC

关系图:

一句话概括:

CPaintDC            无效区dc,      相当于BeginPaint,   EndPaint
CClientDC          客户区dc,      相当于GetDC,   ReleaseDC
CWindowDC      整窗口dc,      相当于GetWindowDC,   ReleaseDC
CDC                     任何dc,          相当于CreateDC,   DeleteDC

CPaintDC
是从CDC派生的
CPaintDC 用于响应窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用 EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。

如 CPaintDC dc(this);

直接使用,无需显性释放删除。

CClientDC       

是从CDC派生的  

CClientDC(客户区设备上下文)用于客户区的输出,它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数。一般在响应非窗口重画消息(如键盘输入时绘制文本、鼠标绘图)绘图时要用到它。用法是:

CClientDC dc(this);//this一般指向本窗口或当前活动视图 。直接使用,无需显性释放删除。

CWindowDC

CWindowDC类是从CDC派生的。它在构建时调用GetWindowDC窗口函数,在销毁时调用ReleaseDC窗口函数。这意味着CWindowDC对象访aCWnd的整个屏幕区域(客户端和非客户端区域)。

直接使用,无需显性释放删除。

CmemDC类 的使用方法

CMemDC其实就是对内存DC的创建与删除进行一个包装。
1、在CMemDC的构造函数中创建内存DC;
2、用户可以在CMemDC dc中进行图像的绘制;
3、在CMemDC的析构函数中进行内存DC到目标DC的拷贝,并做相应的GDI对象清理工作。

直接使用,无需显性释放删除。

  • 在你的项目中添加文件memdc.h。
  • 将#include“memdc.h”行添加到stdafx.h。
  • 添加一个Windows消息处理程序WM_ERASEBKGND
  • 更改消息处理程序中的代码如下:
    // Change this code
    BOOL CExampleView::OnEraseBkgnd(CDC* pDC)
    {// TODO: Add your message handler code here and/or call defaultreturn CView::OnEraseBkgnd(pDC);
    }// To this code
    BOOL CExampleView::OnEraseBkgnd(CDC* pDC)
    {return FALSE;
    }
  • 将您的OnDraw 代码更改为以下内容:

    void CExampleView::OnDraw(CDC* dc)
    {CMemDC pDC(dc);}

CDC

直接使用CDC的例子是内存设备上下文,例如:

CDC dcMem; //声明一个CDC对象

dcMem.CreateCompatibleDC(&dc); //创建设备描述表

pbmOld = dcMem.SelectObject(&m_bmBall);//更改设备描述表属性

…//作一些绘制操作

dcMem.SelectObject(pbmOld);//恢复设备描述表的属性

dcMem.DeleteDC(); //可以不调用,而让析构函数去删除设备描述表

如果通过局部变量的方式,定义cdc对象,可以不用调DeleteDC进行删除,如上面的代码。

CDC是CObject的直接派生类,CDC类自己也有若干派生类,其中包括窗口客户区DC所对应的CClientDC类、OnPaint和OnDraw消息响应函数的输入参数中使用的CPaintDC类、图元文件对应的CMetaFileDC类和整个窗口所对应的CWindowDC类。
CDC类中有许多成员函数,可以用来设置各种绘图环境、属性和参数,以及绘制各种图形和图像等,将在后面陆续加以介绍。
1)获得DC    GetDC    
可以从OnDraw函数的输入参数pDC或调用CWnd的成员函数GetDC:
CDC* GetDC( );
来获得DC的指针。
2)释放DC     ReleaseDC
因为Windows限制可用DC的数量,所以DC属于稀缺的公用资源。因此,对每次获得的DC,在使用完成后必须立即释放。
从OnDraw函数的输入参数pDC获得的DC,在该函数运行结束后,系统会自动释放。但由GetDC所获得的DC,必须自己来释放,这可以通过调用CWnd的成员函数ReleaseDC来完成:

CPaintDC 、CWindowDC、 CClientDC、cMemDC、 CDC相关推荐

  1. CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别-Windows绘图基础知识

    From: http://blog.csdn.net/zhangxinrun/article/details/5829084 一.设备环境(DC)的概念 (1)在Windows中,显示工作是基于设备环 ...

  2. CPaintDC 、CWindowDC、 CClientDC、 CDC的区别与联系

    CPaintDC .CWindowDC. CClientDC. CDC 关系图: 一句话概括: CPaintDC            无效区dc,      相当于BeginPaint,   End ...

  3. HDC、CDC、CCLientDC的关系、MFC类库

    DC概念: 当使用GDI函数比如MoveToEx.LineTo.TextOut时,只是告诉系统要画线或者写字了,但是用什么样的笔(HPEN),字是什么颜色(setTextColor),画在哪张'纸'( ...

  4. WTL中CMemDC与CDC、CDCHandle的联系

    1.CDC.CDCHandle只是CDCT<typename T>模板类的实例化,区别只是在析构时,一个会释放资源,一个不会. typedef CDCT<false>   CD ...

  5. matplotlib绘制图表,设置刻度标签、最大最小刻度、字体大小,label位置、刻度轴箭头等

    matplotlib绘制图表,设置刻度标签.最大最小刻度.字体大小,label位置.刻度轴箭头等 1. 效果图 2. 源码 2.1 仅使用普通轴ax + fontdict 源码 2.2 使用mpl设置 ...

  6. 使用Python、OpenCV翻转图像(水平、垂直、水平垂直翻转)

    使用Python.OpenCV翻转图像(水平.垂直.水平垂直翻转) 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用Python.OpenCV翻转图像,类似于cv2.rotate(). 沿y轴水 ...

  7. 0.基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速

    基于C++的图像处理算法实现.INTEL CPU上SSE加速.ARM CPU上NEON加速 基于C++的图像处理算法在INTEL CPU上SSE加速实现 基于C++的图像处理算法在ARM CPU上NE ...

  8. eclipse保存自动组织导入、删除不必要的导入、格式化代码

    eclipse保存自动组织导入.删除不必要的导入.格式化代码: 窗口→首选项→Java→编辑器→保存操作→勾选"对保存执行所选操作"."格式化源码"." ...

  9. 【网络】通讯名词解释:带宽、速率、波特率、奈奎斯特定律、香农定理

    1.带宽 1.1 解释一 带宽,又叫频宽,是数据的传输能力,指单位时间内能够传输的比特数.高带宽意味着高能力. 数字设备中带宽用bps(b/s)表示,即每秒最高可以传输的位数. 模拟设备中带宽用Hz表 ...

  10. linux哪个版本支持多线程,关于Linux操作系统的叙述错误的是()A、Linux是多用户、多任务、支持多线程的操作系统B、Linux的源...

    [多选题]以下哪些是藏族崇尚白色的体现. [判断题]等到口语出现后,非语言表达便消失了. 冷变形金属在加热时,随加热温度的升高,发生[填空(1)][填空(2)][填空(3)] 莫菲(Murphy)氏征 ...

最新文章

  1. 第二十二课.XGBoost
  2. C#[Serializable]在C#中的作用-NET 中的对象序列化
  3. [PKUSC2018]真实排名——线段树+组合数
  4. 像淘宝一样“网购装修”,“当家”助推家装互联网走向“广域网”
  5. linux如何退出python编辑器_centos linux 终端已经调成python3,怎么安装python3的IDLE编译器,...
  6. Collection集合 创建/添加/迭代
  7. Understanding ES6 -- 深入理解ES6书籍
  8. 国产平台不能打印,对LINUX打印的一点疑问
  9. Android游戏开发源码案例25个汇总
  10. 高等数学(第七版)同济大学 习题7-8 个人解答
  11. ImageJ批量操作时常见报错及其原因
  12. c8网络语言意思,谁能帮我解释一下这个纯网络术语Yi段子啥意思
  13. 尚硅谷【韩顺平】 | Java数据结构和算法【详细笔记】(持续更新)
  14. css入门之CSS1、CSS2、CSS3、CSS4发展历程
  15. 离线数仓搭建_15_ADS层数据构建
  16. 如何区分np.random.normal()、np.random.randn()、np.random.randint()、np.random.random()、np.random.choice()
  17. nodejs 获取系统环境变量_Node.js中环境变量process.env的一些事详解
  18. C语言学习笔记——调用函数时提示警告
  19. GameObject在SetActive(false)隐藏后,其下脚本仍会运行
  20. OJ-3084 返回指针的函数

热门文章

  1. DBD::Oracle的库文件报失问题
  2. Linux安装及升级jdk1.8
  3. 实验四 用信号量解决进程互斥与同步问题 生产者与消费者问题模拟
  4. 有没有这样一种程序员写代码的利器
  5. 教你编写高性能的mysql语法
  6. Windows 7(server 2008) 下直接硬盘安装 Ubuntu 10.04成为双系统的方法
  7. 说说封杀BT的几个理由
  8. vue中接收到后台数据再回显到输入框时无法修改
  9. Python基础--03
  10. java安装path_JDK安装时设置PATH和CLASSPATH环境变量有何作用?