首先,DC 是表示设备环境上下文的意思,Windows是不允许程序员直接访问硬件的,它对屏幕的操作是通过环境设备,也就是DC来完成的。屏幕上的没一个窗口都对应一个DC,可以把DC想象成一个视频缓冲区,对这这个缓冲区的操作,会表现在这个缓冲区对应的屏幕窗口上。
在窗口的DC之外,可以建立自己的DC,就是说它不对应窗口,这个方法就是CreateCompatibleDC,这个DC就是一个内存缓冲区,通过这个DC你可以把和它兼容的窗口DC保存到这个DC中,就是说你可以通过它在不同的DC之间拷贝数据。例如:你先在这个DC中建立好数据,然后在拷贝到窗口的DC就是完成了这个窗口的刷新。

CreatCompatibleDC()创建了一个和当前屏幕的DC兼容的内存DC(DC就是设备上下文的意思,设备上下文就是当前的这个窗体的一些属性,譬如说他使用的画刷,画笔等等),在绘制位图的时候,你必须要在内存中建立这样的一个和当前设备的环境兼容的DC,也就是用这个函数建立,这样你才能把位图加载到这块内存里,然后在利用BitBlt函数将位图从内存复制到屏幕DC上,位图才能显示出来。这里涉及到一个概念:设备相关位图(DDB),设备无关位图(DIB)。GetDC()获取设备指针,该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文的句柄.以后可以在GDI函数中用该句柄绘图. 也就是取得设备上下文,供绘图或者其他的行为使用。

注:一般对于实现位图的显示时,常会用到CreatCompatibleDC()函数。

程序的实现:

void OnDraw(CDC* pDC){CDC MemDC; // 定义一个显示设备对象CBitMap  MemBitMap;//定义一个位图对象MemDC.CreatCompatibleDC(NULL);//创建一个与屏幕显示兼容的内存DC//注:这时还不能进行画图,因为还没有地方用来画图//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上)MemBitMap.CreateCompatibleBitmap(pDC, nWinth, nHeight); //这里可以自己创建自定义的位图,也可以通过LoadBitMap函数从资源中加载现成的位图。CBitmap *pOldBit = MemDC.selectObject(&MemBitMap);// 将与屏幕兼容的位图加载到内存DC中,这样内存DC 中就有地方用来画图了。//先用背景色将位图清除干净,这里我用的是白色作为背景你也可以用自己应该用的颜色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//绘图
MemDC.MoveTo(……);
MemDC.LineTo(……);pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);//将位图从内存DC中拷贝到屏幕上//最后记得将创建的GDI对象删除MemBitMap.DeleteObject()MemDC.DeleteObject()}

在这种情况下,假如你要对屏幕进行比较多的gdi函数操作,如果每一步操作都直接对屏幕dc进行操作,那出现的大多数可能性都是屏幕的闪烁。一个很好的解决方法就是使用内存dc,将这些操作全部先在内存dc上操作,然后一次性在屏幕上进行操作。

例如:如果你单单使用bitblt在屏幕上拷贝一个图,那可以直接使用屏幕的dc。但是如果你要先设置背景(fillrect)然后再bitblt的话,这就涉及到两个屏幕dc的操作,这样的话屏幕很容易闪烁。

[1]: http://ww.cnblogs.com/yangxx-1990/p/4962230.html
[2]: http://blog.csdn.net/sunnyorange/article/details/6590793

CDC::CreateCompatibleDC 的整理(转)相关推荐

  1. 1.CDC绘图。包括加载图片,消去图片,设置图片一部分透明,不闪烁方式。

    CDC类简介:(摘抄自鸡啄米博客) CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户区关联的显示上下文的成员函数.使用CDC的成员函数可以进 ...

  2. VC++笔记(未整理版本)

    匈牙利表示法 关于构造函数 显式调用基类的有参数的构造函数: 类继承当中的三种属性: 引用和指针 重复命名错误及解决 ... Windows程序运行原理PPT 窗口的创建步骤 1.     设计一个窗 ...

  3. 孙鑫VC++课程中用到的函数一览

    在许多VC教科书中这些函数/方法.结构.宏等比较常见,觉得比较重要,虽然不用记住,但应该知道,所以列举出来,没写出参数和返回值情况,编写程序时还需仔细查看MSDN文档.本人英语水平较差再加上自己的一些 ...

  4. Visual C++中最常用的类与API函数

    这篇文章能让初学者快速了解visual C++ MFC中常见的核心的类与函数,虽然全部看下来有点枯燥,但对初学者快速了解MFC的框架结构很有好处. 常用类 CArchive类:用于二进制保存档案  C ...

  5. MFC截图工具(不断更新)

    基于MFC 开发的截图工具 文件名:Draw 创建单个文档,MFC标准 一.将视图显示1.MainFrm.cpp 中int CMainFrame::OnCreate(LPCREATESTRUCT lp ...

  6. GDI+ Graphics类

    1 GDI+的核心:Graphics类 (1)The Graphics class provides methods for drawing lines, curves, figures, image ...

  7. 基于opencv实现桌面图标识别

    一.必要的库 numy和opencv.直接使用pip安装即可: 二.在指定区域截图 直接贴代码: from ctypes import windll, byref, c_ubyte from ctyp ...

  8. MFC GDI 图形设备接口函数

    图形设备接口 图形设备接口(Graphics Device Interface) MFC的四种DC 常用函数 库存的GDI对象: RGB和YUV颜色空间 CColorDialog 颜色选择通用对话框 ...

  9. DDB和DIB概念区别 及 程序示例。

    1. 基本概念 先来用通俗的语句讲解位图和调色板的概念. 我们知道,自然界中的所有颜色都可以由红.绿.蓝(R,G,B)三基色组合而成.针对含有红.绿.蓝色成分的多少,可以对其分别分成0-255个等级, ...

最新文章

  1. resultType 和resultMap 的区别?
  2. mysql查询各类课程的总学分_基于jsp+mysql的JSP学生选课信息管理系统
  3. 计算机应用基础教程2015答案,《计算机应用基础教程(2015版)》_课后题答案.doc
  4. java getrequest_Java Target.getRequest方法代码示例
  5. 晚上睡觉的时候应该把wifi关掉吗?
  6. python中的return函数-python中return的返回和执行
  7. Cisco-NetDevOps-CI/CD-Experiment Workflow
  8. sqldf包的使用使用-R
  9. 用 python 画散点图与气泡图
  10. 如何使用U盘替换光驱引导部署WES7系统
  11. python matplotlib cannot import name ‘artist‘ from ‘matplotlib‘
  12. 高通骁龙450智能模块msm8953 android 4G
  13. deep learning in NLP
  14. Windows资源管理器
  15. ElasticSearch7学习笔记之Mapping
  16. 逆序输出数组,将给定数组逆序输出
  17. vscode使用注意事项
  18. html+css主页页眉实现
  19. linux系统数据库服务器配置,Linux安装配置MariaDB数据库全程详解
  20. Modbus学习总结

热门文章

  1. Anaconda安装Unpacking payload step frozen
  2. HACKTHEBOX——Nibbles
  3. nvm安装使用及卸载
  4. nodejs+express搭建小程序后台服务器
  5. 计算机专业用什么轴的键盘,机械键盘什么轴好
  6. R packages:fNonlinear———bdsTest——BDS检验
  7. 全局钩子(hook鼠标键盘消息)
  8. 【小程序开发之准备工作】如何开通云开发和CMS内容管理平台
  9. ETL工具KETTLE常用设计之——作业设计思路模板
  10. NoteExpress引用文献出现ADDIN NE.Ref.