• 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,自然免不了转换,这部分工作都是在显示驱动中进行的,如果仅有一两次转换或少量像素的转换可能不会有什么,但如果是大量的绘图操作,意味着每次拷贝都会进行转换,这将把宝贵的系统资源消耗在位图的转换上。

  • 相关阅读:
    maven打完包运行,测试结果和本地不一致
    编译链接(Compile Link)
    鸿蒙实战项目开发:【短信服务】
    SQL教程之性能不仅仅是查询
    论文阅读笔记(二)
    c++小学生入门课程(一)
    第7章 博客文章的前端渲染显示
    项目管理工具dhtmlxGantt入门教程(一):如何安装dhtmlxGantt
    视频抽帧转图片,opencv和ffmpeg效果测评
    【JAVA程序设计】基于SSH(非maven)便利店管理系统-有文档
  • 原文地址:https://blog.csdn.net/zxf347085420/article/details/133946387