函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。

  函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);

  参数:

  hdc:设备环境句柄。

  nWidth:指定位图的宽度,单位为像素。

  nHeight:指定位图的高度,单位为像素。

  返回值:如果函数执行成功,那么返回值是位图的句柄;如果函数执行失败,那么返回值为NULL。若想获取更多错误信息,请调用GetLastError。

  备注:由CreateCompatibleBitmap函数创建的位图的颜色格式与由参数hdc标识的设备的颜色格式匹配。该位图可以选入任意一个与原设备兼容的内存设备环境中。由于内存设备环境允许彩色和单色两种位图。因此当指定的设备环境是内存设备环境时,由CreateCompatibleBitmap函数返回的位图格式不一定相同。然而为非内存设备环境创建的兼容位图通常拥有相同的颜色格式,并且使用与指定的设备环境一样的色彩调色板。

  速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:wingdi.h;库文件:gdi32.lib。

  PS:需要与CreateCompatibleDC配合使用

物理HDC 设备底层会拥有显存等资源,但是兼容DC并没有给图像像素提供内存空间,因此兼容DC总是和BITMAP配合使用,这样一来,兼容DC就利用BITMAP的图像像素数据空间给自己提供类似于显存的内存空间.

这样有很多好处,以来我们可以在加载图片后,在图片上利用DC的各种绘图功能.请看如下示例:

兼容DC在建立之初,只有1*1像素的尺寸,SelectObject选择bitmap以后才可以进行绘图.

内存DC的可见区域是简单的区域,不像物理DC可见区域可能被其他窗口覆盖而产生复杂的可见区域.由于DC的任何绘图都需要考虑在可见区域内绘图,绝对不能超出可见区域的范围.因此每个GDI绘图输出最终都需要和构成复杂可见区域的每一个巨型区域进行剪裁输出,因此物理DC的绘图效果会比兼容DC速度慢一些.这也就是我们经常用兼容DC进行双缓存输出的一个原因

HDC hdc=GetDC(hwnd);
HDC memdc=CreateCompatibleDC(hdc);
RECT rc;
BITMAP bmp;
HBITMAP holdbmp,hbmp=LoadBitmap(hInstDVBRes,MAKEINTRESOURCE(IDB_CLOCK));//从资源加载位图
holdbmp=(HBITMAP)SelectObject(memdc,hbmp);//这里把hbmp的位图选择到兼容DC memdc,之后这个兼容DC就拥有和
//hbmp同样大小的绘图区域,注意超出位图返回的GDI输出都是无效的.
GetObject(hbmp,sizeof(BITMAP),&bmp);//这里获取位图的大小信息,事实上也是兼容DC绘图输出的范围
SetRect(&rc,0,0,bmp.bmWidth,bmp.bmHeight);
DrawText(memdc,"Center Line Text" -1,&rc,DT_VCENTER|DT_SINGLELINE|DT_CENTER);//在兼容DC中间位置输出字符串
//这样以来我们就相当于把hbmp这个位图加上了文字标注,我们可以把这个增加了文字标注的位图保存起来.一个简单的图像处理基本就OK了.
SelectObject(memdc,holdbmp);//复原兼容DC数据.
DeleteDC(memdc);

***********************************************************

首先现象是这样的:   
  我的程序突然有一天,一个Create出来的窗口画不出东西,开了天窗!跟进去一看,是调用CBitmap::CreateBitmap失败(返回值为FALSE)。用GetLastError查到的原因是“ERROR_NOT_ENOUGH_MEMORY”。   
  很奇怪,这个view的代码我并没有动啊!我试着改成CBitmap::CreateCompatibleBitmap,好了!算了,不管了,就这么着吧~   
  谁知,过了些时日,别的窗口又开天窗了!   
  这次我把CreateBitmap改成CreateCompatibleBitmap,也不是每次都成功,时不时的就会创建失败!   
    
  查msdn,关于CreateBitmap   API有如下这一段话:   
  The   CreateBitmap   function   can   be   used   to   create   color   bitmaps.     
  However,   for   performance   reasons   applications   should   use   CreateBitmap   to   create   monochrome   bitmaps   and   CreateCompatibleBitmap   to   create   color   bitmaps.     
  Whenever   a   color   bitmap   returned   from   CreateBitmap   is   selected   into   a   device   context,   the   system   checks   that   the   bitmap   matches   the   format   of   the   device   context   it   is   being   selected   into.     
  Because   CreateCompatibleBitmap   takes   a   device   context,   it   returns   a   bitmap   that   has   the   same   format   as   the   specified   device   context.     
  Thus,   subsequent   calls   to   SelectObject   are   faster   with   a   color   bitmap   from   CreateCompatibleBitmap   than   with   a   color   bitmap   returned   from   CreateBitmap.   
    
  这段话看着挺绕,说CreateCompatibleBitmap   API比CreateBitmap   API的效率更高一些。那么,我的问题之一是:   
  CBitmap的这两个属性,是否也如API一样,CreateCompatibleBitmap比CreateBitmap的效率高??   
    
  我的问题之二:搜了一下,我的程序里,有二十多处地方(17个窗口)调用CreateBitmap,10处地方调用CreateCompatibleBitmap,且这些占用bitmap的窗口只在最后退出的时候才销毁。有经验的同仁看看,调用的地方是不是太多了?如果都换成CreateCompatibleBitmap,资源占用情况是否会有所改观?

——————————————————————————

在Create之前,都有类似如下的代码:   
  if(NULL   !=   m_pMemBitmap)   
  {   
              m_pMemBitmap->DeleteObject();   
              delete   m_pMemBitmap;   
  }   
  m_pMemBitmap   =   new   CBitmap;   
  BOOL   b   =   m_pMemBitmap->CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height());   
  感觉没有什么可泄漏的。   
    
  ==================>   
    
  晕,真是这样写的话就泄露了,而且露的很厉害   
  if(NULL   !=   m_pMemBitmap)   
  {   
              m_pMemBitmap->DeleteObject();   
              delete   m_pMemBitmap;   
              m_pMemBitmap   =   NULL;//光delete,   m_pMemBitmap   是不会为NULL的   
  }

此文摘自:http://fengqing888.blog.163.com/blog/static/3301141620091019104353119/,因为讲的实在太好了,所以就忍不住粘贴过来了。感谢这哥们

CreateCompatibleBitmap 的使用的更多相关文章

  1. CreateCompatibleDC 与 CreateCompatibleBitmap 小小结

    通常使用CreateCompatibleBitmap时候都会用到CreateCompatibleDC.而是用CreateCompatibleDC的目的不是为CreateCompatibleBitmap ...

  2. CreateCompatibleDC与CreateCompatibleBitmap

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

  3. 依赖于设备的位图(DDB) ,CreateCompatibleBitmap用法

    DDB(Device-dependent bitmap)依赖于具体设备,这主要体现在以下两个方面: DDB的颜色模式必需与输出设备相一致.例如,如果当前的显示设备是256色模式,那么DDB必然也是25 ...

  4. CreateCompatibleBitmap 需要注意的问题

    不要使用CreateCompatibleDC得到的内存DC作为其参数,应使用真实DC,否则图片不能显示

  5. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  6. MFC双缓存技术代码

    屏蔽背景刷新,在View中添加对WM_ERASEBKGND的响应,直接返回TRUE: BOOL CTEMV1View::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息 ...

  7. C#调用Win32API

    Win32API.cs   using System;using System.Drawing;using System.Runtime.InteropServices;using Lordal.Wi ...

  8. 【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片

    本文主要介绍如何截取电脑桌面并将其保存为bmp图片. 1. Bmp图像文件组成 Bmp是Windows操作系统中的标准图像文件格式. Bmp图像文件由四部分组成: (1)位图头文件数据结构,包含Bmp ...

  9. C++ 在Windows下截取整个屏幕 和 指定句柄窗口的屏幕

    #include <windows.h> #include <stdint.h> #include <stdio.h> void ShootScreen(const ...

随机推荐

  1. 关于 python 一切皆对象的实际理解

    1 关于type type 函数可以查看一个对象的类 type 类是一切类型的模版 In [2]: type(1) Out[2]: int In [3]: type(int) Out[3]: type ...

  2. NoSQL数据库技术实战-第1章 NoSQL与大数据简介 NoSQL产生的原因

    NoSQL产生的原因: 关系型数据库不擅长的操作,是NoSQL应运而生的原因: 大量的数据写入操作书上写的是“大量数据的写入操作“,我理解的应该是“大量的数据写入操作”,因为大量的数据写入操作才会引起 ...

  3. CA认证和证书

    一些概念: PKI:Public Key Infrastructure 签证机构:CA(Certificate Authority) 注册机构:RA(Register Authority) 证书吊销列 ...

  4. TCP协议(包括TCP的连接过程,数据分段,TCP有关服务器优化)

    Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议 TCP/IP是一个Protocol Stack(协议栈),包括TCP.IP ...

  5. 个人的web商城网站

    项目介绍 1.作为前端的菜鸟,每每看到Github上有很多大神分享着自己的项目时,内心都是蠢蠢欲动,这次终于下定决心要给自己一段时间来完成属于自己的一份作品.2.于是在查找了大量资料,思考着技术选型, ...

  6. 用脚本来运行scrapy crawl ...

    启动爬虫的命令为: scrapy crawl spidername(爬虫名) 方案(一)name.py #!/usr/bin/env python # -*- coding:utf-8 -*- fro ...

  7. Elasticsearch:运用shard filtering来控制索引分配给哪个节点

    在我们的实际部署中,我们的各个node(节点)的能力是不一样的.比如有的节点的计算能力比较强,而且配有高性能的存储,速度也比较快,同时我们可能有一些node的能力稍微差一点,比如计算能力及存储器的速度 ...

  8. Malloc Maleficarum复盘

    1.hos复盘 hos即伪造堆块,free栈上地址,然后下一个malloc去分配一个fastbin(栈上),包含返回地址. 代码来源 他这个我直接复现有问题,咨询了joker师傅,应该是gcc版本问题 ...

  9. ueditor编辑器+粘贴word

    最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...

  10. JavaWeb_(Struts2框架)参数传递之接收参数与传递参数

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...