CPaintDC 、CWindowDC、 CClientDC、cMemDC、 CDC
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相关推荐
- CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及区别-Windows绘图基础知识
From: http://blog.csdn.net/zhangxinrun/article/details/5829084 一.设备环境(DC)的概念 (1)在Windows中,显示工作是基于设备环 ...
- CPaintDC 、CWindowDC、 CClientDC、 CDC的区别与联系
CPaintDC .CWindowDC. CClientDC. CDC 关系图: 一句话概括: CPaintDC 无效区dc, 相当于BeginPaint, End ...
- HDC、CDC、CCLientDC的关系、MFC类库
DC概念: 当使用GDI函数比如MoveToEx.LineTo.TextOut时,只是告诉系统要画线或者写字了,但是用什么样的笔(HPEN),字是什么颜色(setTextColor),画在哪张'纸'( ...
- WTL中CMemDC与CDC、CDCHandle的联系
1.CDC.CDCHandle只是CDCT<typename T>模板类的实例化,区别只是在析构时,一个会释放资源,一个不会. typedef CDCT<false> CD ...
- matplotlib绘制图表,设置刻度标签、最大最小刻度、字体大小,label位置、刻度轴箭头等
matplotlib绘制图表,设置刻度标签.最大最小刻度.字体大小,label位置.刻度轴箭头等 1. 效果图 2. 源码 2.1 仅使用普通轴ax + fontdict 源码 2.2 使用mpl设置 ...
- 使用Python、OpenCV翻转图像(水平、垂直、水平垂直翻转)
使用Python.OpenCV翻转图像(水平.垂直.水平垂直翻转) 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用Python.OpenCV翻转图像,类似于cv2.rotate(). 沿y轴水 ...
- 0.基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速
基于C++的图像处理算法实现.INTEL CPU上SSE加速.ARM CPU上NEON加速 基于C++的图像处理算法在INTEL CPU上SSE加速实现 基于C++的图像处理算法在ARM CPU上NE ...
- eclipse保存自动组织导入、删除不必要的导入、格式化代码
eclipse保存自动组织导入.删除不必要的导入.格式化代码: 窗口→首选项→Java→编辑器→保存操作→勾选"对保存执行所选操作"."格式化源码"." ...
- 【网络】通讯名词解释:带宽、速率、波特率、奈奎斯特定律、香农定理
1.带宽 1.1 解释一 带宽,又叫频宽,是数据的传输能力,指单位时间内能够传输的比特数.高带宽意味着高能力. 数字设备中带宽用bps(b/s)表示,即每秒最高可以传输的位数. 模拟设备中带宽用Hz表 ...
- linux哪个版本支持多线程,关于Linux操作系统的叙述错误的是()A、Linux是多用户、多任务、支持多线程的操作系统B、Linux的源...
[多选题]以下哪些是藏族崇尚白色的体现. [判断题]等到口语出现后,非语言表达便消失了. 冷变形金属在加热时,随加热温度的升高,发生[填空(1)][填空(2)][填空(3)] 莫菲(Murphy)氏征 ...
最新文章
- 第二十二课.XGBoost
- C#[Serializable]在C#中的作用-NET 中的对象序列化
- [PKUSC2018]真实排名——线段树+组合数
- 像淘宝一样“网购装修”,“当家”助推家装互联网走向“广域网”
- linux如何退出python编辑器_centos linux 终端已经调成python3,怎么安装python3的IDLE编译器,...
- Collection集合 创建/添加/迭代
- Understanding ES6 -- 深入理解ES6书籍
- 国产平台不能打印,对LINUX打印的一点疑问
- Android游戏开发源码案例25个汇总
- 高等数学(第七版)同济大学 习题7-8 个人解答
- ImageJ批量操作时常见报错及其原因
- c8网络语言意思,谁能帮我解释一下这个纯网络术语Yi段子啥意思
- 尚硅谷【韩顺平】 | Java数据结构和算法【详细笔记】(持续更新)
- css入门之CSS1、CSS2、CSS3、CSS4发展历程
- 离线数仓搭建_15_ADS层数据构建
- 如何区分np.random.normal()、np.random.randn()、np.random.randint()、np.random.random()、np.random.choice()
- nodejs 获取系统环境变量_Node.js中环境变量process.env的一些事详解
- C语言学习笔记——调用函数时提示警告
- GameObject在SetActive(false)隐藏后,其下脚本仍会运行
- OJ-3084 返回指针的函数