通常使用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. mac上运行appium提示错误Encountered internal error running command 解决办法

    [debug] [iOS] App is not installed. Will try to install. [MJSONWP] Encountered internal error runnin ...

  2. 40多个纯CSS绘制的图形

    本文由码农网 – 陈少华原创,转载请看清文末的转载要求. 今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和 ...

  3. 第二章 jQuery数组和字符串

    章节内容: 1.利用数组在列表中显示名字 (1)利用数组显示名字列表--join()方法 (2)从数组中获取名字并追加到有序列表--each()方法 (3)利用HTML元素创建数组和计算数组长度--g ...

  4. Sanarus Medical --国外一家研究乳腺癌治疗的科技公司

    Sanarus Medical --国外一家研究乳腺癌治疗的科技公司 http://www.sanarus.com/

  5. 用jquery编写的分页插件

    用jquery编写的分页插件 源码 function _pager_go(total_page) { var page_str = $("#_pager_textbox").val ...

  6. Golang 文件服务器小结

    花了一个星期学习文件服务器,老是在一些地方搞混,整理一下所学的,清晰了不少. 学Go半个月,还有很多不懂的地方,有理解错误的,还望高手指出. 注:以下代码中,w为http.ResponseWriter ...

  7. hibernate常用关联

    <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns=" ...

  8. 一 java线程的等待/通知模型

    java 中线程之间的通信问题,有这么一个模型:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程.前者是生产者,后者就是消费者 ...

  9. Windows下的UDP爆了10054--远程主机强迫关闭了一个现有的连接

    原文地址:http://www.cnblogs.com/pasoraku/p/5612105.html 故事是这样的. 前几天在网上逛,看到了一个漂亮的坦克模型. 我觉得这个坦克可以做一个游戏,那需要 ...

  10. 初识C语言

    C语言是开发iOS软件的基础. 一.C语言简介 1.      简史 1)          C语言于1972年发明,首次使用是用于重写UINX操作系统(UNIX以前主要是用汇编语言写的,它奠定了操作 ...