CBitmap、CreateCompatibleBitmap、CreateBitmap

一、CBitmap类主要是加载位图资源,或者建立一个空白位图用于存储画面

BOOL LoadBitmap(UINT nIDResource) 从工程资源中加载一张位图
BOOL LoadOEMBitmap(UINT nIDBitmap) 从系统资源中加载一张位图
BOOL CreateBitmap(int nWidth, int nHeigjt, UINT nPlane, UINT nBitCnt, const void* lpBits) 根据指定的值创建一张位图
BOOL CreateCompatibleBitmap(CDC* pDC, int nWidth, int nHeight) 根据高宽创建一张兼容位图
BOOL CreateBitmapIndirect(LPBITMAP lpBitmap) 根据BITMAP结构体创建一张空白位图
int GetBitamp(BITMAP* pBitmap) 根据BITMAP结构体获取位图属性信息
static CBitmap* FromHandle(HBITMAP hBitmap) 将HBITMAP句柄转换为CBitamp对象
operator HBITMAP() const 从CBitmap对象中获取HBITMAP句柄

BITMAP结构体:

/* Bitmap Header Definition */
typedef struct tagBITMAP
  {
    LONG        bmType;
    LONG        bmWidth;
    LONG        bmHeight;
    LONG        bmWidthBytes;
    WORD        bmPlanes;
    WORD        bmBitsPixel;
    LPVOID      bmBits;
  } BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;

二、兼容位图CreateCompatibleBitmap和非兼容位图CreateBitmap的区别

兼容位图即DDB,由CreateCompatibleBitmap创建;

非兼容位图即DIB,是由LoadImage、SHLoadBitmap、CreateDIBSection、CreateBitmap创建。

1.非兼容位图 和 兼容位图有两个本质差别
第一个区别:是兼容位图的存放空间通常由GWES或显示驱动分配,处于驱动层之中,可以获取到存放数据的物理地址,而非兼容位图的存放空间通常由应用程序分配,处于应用层中,不能获取到物理地址。
第二个区别:是兼容位图与显示驱动的位深和像素格式保持一致(WinCE显示驱动的位深和格式是固定的),如显示驱动采用的是16位RGB565的位深和像素格式,则兼容位图的格式也一样,而非兼容位图通常不相同,即它内部可能是32位位深ARGB的格式,也有可能是24位RGB888的格式。

2.以上两个区别意味着
第一个区别意味着:非兼容位图无法享受2D显示模块的硬件加速,硬件加速的原理类似DMA,需要物理地址,而非兼容位图获取不到物理地址,自然无法进行硬件加速。
第二个区别意味着:非兼容位图拷贝到显示界面上往往需要进行颜色转换,因为它要符合显示驱动的颜色格式才能正常地显示出来,常用的位图格式是24位RGB888,而显示驱动常用的格式是16位RGB565、32位ARGB8888,自然免不了转换,这部分工作都是在显示驱动中进行的,如果仅有一两次转换或少量像素的转换可能不会有什么,但如果是大量的绘图操作,意味着每次拷贝都会进行转换,这将把宝贵的系统资源消耗在位图的转换上。

你可能感兴趣的:(#,MFC自绘,windows)