通常使用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, 400400 ); 
SelectObject( hDC2, hBM ); 

                  也可以这样使用:

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

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