zoukankan      html  css  js  c++  java
  • CBitmap、HBITMAP、BITMAP相互转换

    一:理解

    BITMAP是C++中定义的位图结构体

    HBITMAP是Windows中使用的位图句柄

    CBitmap是MFC封装的位图类

    二:相互转换

    1、HBITMAP->CBitmap 

    方法一:

    HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    CBitmap bitmap;
    bitmap.Attach(hBitmap);

    方法二:

    HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);        
    CBitmap *bitmap=CBitmap::FromHandle(hBitmap);

    注意:Attach和FromHandle的区别

    FromHandle得到的指针是临时变量,通过Attach连接的句柄可以长久保留,但通过FromHandle得到的只是暂时的,大概只在一个消息区间内有效,很快便会被删除,所以基本上不能用。我用了FromHandle然后一直出错!!!

    实验源码,在(OnPaint函数中添加) 

    CString str = _T("E:\picture\lena.bmp");
    HBITMAP hBitmap=(HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    CBitmap bitmap;
    bitmap.Attach(hBitmap);
    CPaintDC dc(this);
    CDC MemDC;
    MemDC.CreateCompatibleDC(&dc);
    MemDC.SelectObject(&bitmap);
    CRect rect;
    GetClientRect(&rect);
    dc.BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);

    注意:CBitmap类中的成员函数:

    BOOL LoadBitmap(LPCTSTR lpszRecourceName);   
    BOOL LoadBitmap(UINT nIDResource); 

    都可以加载位图,但他们只能加载工程中的位图,不能像LoadImage一样,加载硬盘中的位图。尤其要注意:

    BOOL LoadBitmap(LPCTSTR lpszRecourceName)函数中的lpszRecourceName不能为路径字符串。它指的是位图的ID是用字符串表示的。 

    比如:我在工程中创建了一个位图资源IDB_BITMAP1 ,lpszResourceName是指什么呢,是硬盘上的bitmap1.bmp吗,如果是,以下代码为什么是错的。

    CBitmap   bmp;   
    bmp.LoadBitmap("d:\..\res\bitmpa1.bmp");   
    CDC   memdc;   
    BITMAP   bm;   
    bmp.GetBitmap(&bm);   
    memdc.CreateCompatibleDC(pDC);   
    memdc.SelectObject(&bmp);   
    pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&memdc,0,0,SRCCOPY);  

    用Notepad打开*.rc文件,找到类似下面一行:   

    IDB_BITMAP   BITMAP   "res\background.bmp"   
    改成:Bitmap1   BITMAP   "resackground.bmp"   
    或者,在VC中察看位图资源的属性,将其ID栏内改为"Bitmap"(注意,一定要加引号)。
    然后调用:bmp.LoadBitmap("Bitmap1"); 保证成功。   
    资源可以用一个整数来标示,也可以用一个字符串标示。但无论如何,这些ID都不是指位图文件名。
     

    2、HBITMAP->BITMAP 

    CString str = _T("E:\picture\lena.bmp");
    HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    BITMAP bm;
    ::GetObject(hBitmap, sizeof(bm), &bm);

    3、CBitmap->BITMAP

    CBitmap bitmap;
    bitmap.LoadBitmapW(IDB_BITMAP1);
    BITMAP bm;
    bitmap.GetBitmap(&bm);

    4、CBitmap->HBITMAP

    方法一:

    CBitmap bitmap;        
    bitmap.LoadBitmapW(IDB_BITMAP1);
    HBITMAP hBitmap = (HBITMAP)bitmap.m_hObject;

    方法二:

    CBitmap bitmap;
    bitmap.LoadBitmapW(IDB_BITMAP1);
    HBITMAP hBitmap = (HBITMAP)bitmap;

    5、BITMAP->HBITMAP

    HBITMAP hBitmap;
    
    pbm->GetHBITMAP(NULL, &hBitmap);

    6、BITMAP->CBitmap 

    Bitmap* pBitmap = new Bitmap(width,height,PixelFormat24bppRGB);
    HBITMAP hBitmap;
    BITMAP bm;
    pBitmap ->GetHBITMAP(NULL,&hBitmap);
    CBitmap* bmp;
    bmp.Attach(hBitmap);

     

  • 相关阅读:
    Android多种打包方式
    Service、HandlerThread、IntentService、Broadcast
    Handler、Looper、MessageQueue、Message的联系
    深入了解ANR
    深入了解OOM
    laravel的核心概念:服务提供者provider解析
    简单理解laravel框架中的服务容器,服务提供者以及怎样调用服务
    Laravel框架数据库CURD操作、连贯操作总结
    Laravel数据库操作的三种方式
    Python操作MySQL数据库9个实用实例
  • 原文地址:https://www.cnblogs.com/nilongqibu/p/4129371.html
Copyright © 2011-2022 走看看