• 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结构体

    1. /* Bitmap Header Definition */
    2. typedef struct tagBITMAP
    3. {
    4. LONG bmType;
    5. LONG bmWidth;
    6. LONG bmHeight;
    7. LONG bmWidthBytes;
    8. WORD bmPlanes;
    9. WORD bmBitsPixel;
    10. LPVOID bmBits;
    11. } 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,自然免不了转换,这部分工作都是在显示驱动中进行的,如果仅有一两次转换或少量像素的转换可能不会有什么,但如果是大量的绘图操作,意味着每次拷贝都会进行转换,这将把宝贵的系统资源消耗在位图的转换上。

  • 相关阅读:
    [Linux] [rpm -qa][|grep]查询是否安装了软件包
    Linux、docker、kubernetes、MySql、Shell运维快餐
    CesiumJS PrimitiveAPI 高级着色入门 - 从参数化几何与 Fabric 材质到着色器 - 上篇
    VS Code关闭受限模式,关闭信任工作区
    关于学习老是忘记的问题讨论
    [HDLBits] Exams/ece241 2013 q7
    Linux - 札记 - W10: Warning: Changing a readonly file
    TCP协议灵魂之问
    Towards Class-Oriented Poisoning Attacks Against Neural Networks 论文笔记
    【Azure 存储服务】Java Azure Storage SDK V12使用Endpoint连接Blob Service遇见 The Azure Storage endpoint url is malformed
  • 原文地址:https://blog.csdn.net/zxf347085420/article/details/133946387