通常使用CreateCompatibleBitmap时候都会用到CreateCompatibleDC。而是用CreateCompatibleDC的目的不是为CreateCompatibleBitmap而产生,它更多为了建立内存设备环境起一个绘图操作与显示设备之间的缓冲作用,而CreateCompatibleBitmap 是为扩展内存设备环境的图像空间

CreateComptibleDC在mfc与sdk编程中参数不一样,前者是CDC*,后者是hdc(通常大多数绘图在sdk中是hdc,而mfc是cdc*),但作用都一样,都是为了创建一个与设备环境上下文兼容的内存设备环境(可以理解成一个与设备一样的环境),但值得注意的是这样创建出来的内存设备环境的图像空间尺寸是很小的,通常是1*1像素大小,而且还是单色的(没想通搞啥,可能为了兼容以前设备或者程序),因此需要调用SelectObject函数来加载位图bitmap,这样加载的位图尺寸大小就相当于了内存设备环境尺寸大小。接下来才可以进行一系列绘图操作。

对于CreateCompatibleBitmap函数,是为了创建与指定的设备环境相关的设备兼容的位图。有时候会觉得直接从资源里加载位图资源即可,何必直接创建呢?但有时是必要的,比如你想直接对屏幕操作,又想避免闪烁。这时候就可以Create一个内存DC,使用CreateCompatibleBitmap产生一个bitmap,然后内存DC使用SelectObject加载bitmap,这样内存中才有一个固定大小的图像空间,其次再使用bitblt把屏幕copy到内存DC中,这样子你可以在内存dc中进行各种绘图操作。当然你也可以用在内存缓冲中完成对一张图片的操作(如缩放、透明等),也有必要create一个bitmap

另外参考可以见:

http://blog.csdn.net/hhygcy/article/details/4073975   这个写得挺详细的~

http://fengqing888.blog.163.com/blog/static/3301141620091019104353119/   这个前半部分可以看看即可,后半部分确实没那么大吸引力~

PS:

1、对于CreateCompatibleBitmap 初始化颜色,我实践一下,屏幕显示的是黑色

2、(第二个链接中有这样一段原话,没有修改)由CreateCompatibleBitmap 函数创建的位图的颜色格式与由参数hdc标识的设备的颜色格式匹配。该位图可以选入任意一个与原设备兼容的内存设备环境中。由于内存设备环境允许彩色和单色两种位图。因此当指定的设备环境是内存设备环境时,由CreateCompatibleBitmap函数返回的位图格式不一定相同。然而为非内存设备环境创建的兼容位图通常拥有相同的颜色格式,并且使用与指定的设备环境一样的色彩调色板
其实说的不是太清楚,CreateCompatilbeBitmap 参数中可以选择的hdc可以是内存设备环境或者物理设备环境,而选择的hdc会决定你所创建bitmap的颜色格式,如果你选择内存环境,若是是单色的,所创建的bitmap也是单色的;如果是彩色的,也是彩色的。选择物理设备环境,则是彩色的。其实第一个链接就是对其中进行探讨,我觉得看到这边不明白可以直接看msdn:http://msdn.microsoft.com/en-us/library/windows/desktop/dd183488(v=vs.85).aspx   里面很详细。

具体例子如下:
我们可以使用

HDC hDC = GetDC( NULL ); 
HDC hDC2 = CreateCompatibleDC( hDC ); 
HBITMAP hBM = CreateCompatibleBitmap( hDC, 400, 400 ); 
SelectObject( hDC2, hBM ); 

也可以这样使用:

HDC hDC = GetDC( NULL ); 
HDC hDC2 = CreateCompatibleDC( hDC ); 
HBITMAP hBM = CreateCompatibleBitmap( hDC2, 400, 400 ); 
SelectObject( hDC2, hBM ); 

前者code的hdc2的颜色格式应该是彩色,而后者是单色的。

CreateCompatibleDC 与 CreateCompatibleBitmap 小小结的更多相关文章

  1. CreateCompatibleDC与CreateCompatibleBitmap

    函数功能:该函数创建一个与指定设备兼容的内存设备上下文环境(DC). 函数原型:HDC CreateCompatibleDC(HDC hdc): 参数: hdc:现有设备上下文环境的句柄,如果该句柄为 ...

  2. JVM内存模型 小小结

    可以看一下我的另一篇总结 JVM运行时数据区与JVM堆内存模型小结 推荐一篇文章,尚学堂的 Java内存模型深度解读 . 不方便全文转载,就摘录下吧. 以往的认知都是以基本类型.引用类型.常量.方法等 ...

  3. java基础知识小小结

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  4. DP小小结

    入门题 : [Luogu1441]砝码称重 , [NOIP2015]子串 [AHOI2009]中国象棋 , 详见代码 [HNOI2007]梦幻岛宝珠 , 详见代码 [NOIP2012]开车旅行 , 没 ...

  5. 数位DP之小小结

    资料链接:http://wenku.baidu.com/view/9de41d51168884868662d623.html http://wenku.baidu.com/view/d2414ffe0 ...

  6. LCT小小结

    模板题P3690 基础题P3203[HNOI2010]弹飞绵羊 \(access\)是搞出一条端点为\(x,y\)的路径 , 且维护的是实子树的信息 . 由于题目比较简单 , \(access\)时还 ...

  7. 扩展 jquery miniui 组件实现自动查询数据

    主题 之前写过一篇文章分享了公司basecode查找数据后台是怎么实现的(http://www.cnblogs.com/abcwt112/p/6085335.html).今天想分享一下公司前台是怎么扩 ...

  8. 【工作代码】复杂 JSON 值替换处理

    总结下最近的工作遇到的点:入参复杂 JSON 层层嵌套,Java 怎么优雅的处理. 一.关于 JSON JSON 是类似 XML 用于存储和交互文本信息.但优于 XML ,其更小,更快,更易懂和解析. ...

  9. JRE和JDK

    转自:http://www.cnblogs.com/myitm/archive/2011/05/03/2035942.html   很多程序员已经干了一段时间java了依然不明白jdk与jre的区别. ...

随机推荐

  1. Chain Of Responsibility(职责连)-对象行为型模式

    1.意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2.动机 给多个对象处理一个请求的机会,从而 ...

  2. Android之ProgressBar

    今天复习一下以前的知识,补充一下ProgressBar控件 progressBar是进度条组件,通常用于用户展示某个耗时操作完成的进度,而不让用户感觉是程序失去了响应,从而更好地提升用户界面的友好性. ...

  3. DOCTYPE的重要性

    <!DOCTYPE>是文档类型声明: 声明必须是 HTML 文档的第一行,位于 <html> 标签之前.明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTM ...

  4. 【循序渐进MVC】第一回——一物多用Project.json依赖关系之dependencies节点

    Project.json统一了ASP.NET vNext之前版本的packages.config.NuGet 配置(nuspec)以及项目文件(csprojs):并集成在Project.json中. ...

  5. CodeSmith Merge策略--小白教程

        为了让 自动产生的代码 和 程序员手写的代码 互不干涉, 提出了Merge策略, 包括以下三种 InsertRegion: 只插入(覆盖)到指定 #region区域 InsertClass: ...

  6. 等宽字体延伸到的 ch 长度单位和动画 animation-timing-function

    新知识点get! 等宽字体(monospaced font)是指字符宽度相同的电脑字体.与此相对,字符宽度不尽相同的电脑字体称为比例字体(proportional font). 东亚字体基本都是等宽字 ...

  7. MySQL 5.6 & 5.7最优配置模板

    摘自:http://mp.weixin.qq.com/s?__biz=MjM5MjIxNDA4NA==&mid=207854835&idx=1&sn=c998031ae6816 ...

  8. 通过viewmodel找到view

    如何通过viewmodel找到view? 之前的做法是,在view加载时(Loaded),将view保存到viewmodel中,后来想想Caliburn-Micro,自带方法可以通过viewmodel ...

  9. c# - catch(Exception ex) 会丢掉StackTrace 是怎么回事?

    原本这篇文章就想写写StackTrace怎么会丢的问题, 但现在的内容变成了讨论怎么处理Exception的问题. 该不该用try catch, 什么时候用?也困扰了我很久, 好像随便写写就可以, 但 ...

  10. java中获取路径的几种方式

    总是忘记, 备份一下,方便下次用. 第一种: File directory = new File("");//参数为空 String courseFile = directory. ...