Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35567
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 142
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-28 20:06
文章分类

全部博文(14)

文章存档

2016年(8)

2015年(7)

我的朋友

分类: C/C++

2015-11-06 18:58:39

 一.三者区别
   
 CBitmap是封装了GDI中的位图的类,并且提供了操纵位图的成员函数。使用CBitmap对象之前要先构造CBitmap对象,调用其中的一个初始化成员函数设置位图对象的句柄。此后就可以调用其它成员函数了。
     BITMAP是一个结构体,封装着bitmap的一些信息。定义了逻辑位图的类型,高,宽,颜色格式和位值。
        typedef struct tagBITMAP{
           LONG bmType; //位图类型,必须为0
           LONG bmWidth; //位图宽度
           LONG bmHeight; //位图高度
           LONG bmWidthBytes; //每一行像素所在的byte数
           WORD bmPlanes; //颜色平面数
           WORD bmBitsPixel; //像素的位数
           LPVOID bmBits; //位图内存指针
           }BITMAP;

    HBITMAP是bitmap的句柄。          
   三者之间的关系转换:

          HBITMAP hBitmap;
          CBitmap bitmap;
          BITMAP bm;
          //下面是三者之间的联系:
          bitmap.Attach(hBitmap);//由HBITMAP 得到关联的CBitmap,即从HBITMAP获得位图  
          bitmap.GetBitmap(&bm); // 从CBitmap中获得位图信息,并将信息存入bm结构体中。
          hBitmap=(HBITMAP)bitmap.GetSafeHandle();//由CBitmap得到相关的HBITMAP
     附1. CBitmap::GetBitmap
        int GetBimap( BITMAP* pBitMap );
        返回值:调用成功时返回非零值,否则为0。
        参数: pBitMap 指向BITMAP结构的一个指针,不能为NULL。  说明:本函数用于查看CBitmap对象的信息。返回的信息存放在pBitMap指向的BITMAP结构中。
     附2.由于位图是GDI的对象之一,故也可以通过poldBitmap=MemDC.SelectObject(bitmap)来操作位图。(只有内存设备上下文环境可选择位图,并且在同一时刻只能一个设备上下文环境选择位图)。
  二.CBitmap说明
         首先,构造对象,然后初始化初始化CBitmap对象时,常用Cbitmap::LoadBitmap,该函数有两种形式:
                  BOOL   LoadBitmap(   LPCTSTR   lpszRecourceName   );    其中lpszRecourceName  为VC工程内部已导入的资源名
                  BOOL   LoadBitmap(   UINT   nIDResource   );   

   最后调用pBmp.DeleteObject();删除由LoadBitmap加载的位图,否则Cbitmap的析构函数将删除该位图对象。注意: 在删除位图对象之前,要保证它没有被选到设备上下文中。

点击(此处)折叠或打开

  1. CBitmap pBmp;
  2.     pBmp.LoadBitmap(IDB_BITMAP1);
  3.     
  4.     CDC dccompatibleDC;
  5.     dccompatibleDC.CreateCompatibleDC(pDC);
  6.     CBitmap* poldbmp = dccompatibleDC.SelectObject(&pBmp);
  7.     
  8.     BITMAP bitmap;
  9.     pBmp.GetBitmap(&bitmap);
  10.     pDC->BitBlt(100,100,bitmap.bmWidth,bitmap.bmHeight,&dccompatibleDC,0,0,SRCCOPY);

  11.     dccompatibleDC.SelectObject(poldbmp);//删除位图对象之前,要保证它没有被选到设备上下文

  12.     pBmp.DeleteObject();
            另外,可以使用API函数LoadImage加载位图文件,得到位图HBITMAP资源句柄,再与CBitmap对象相连。

点击(此处)折叠或打开

  1. CBitmap pBmp;
  2.     //pBmp.LoadBitmap(IDB_BITMAP1);
  3.     HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), _T("ts.bmp"), IMAGE_BITMAP, 0,0, LR_LOADFROMFILE);
  4.     if (NULL!=hBmp)
  5.     {
  6.         pBmp.DeleteObject();
  7.         pBmp.Attach(hBmp);
  8.     }

  9.     CDC dccompatibleDC;
  10.     dccompatibleDC.CreateCompatibleDC(pDC);
  11.     CBitmap* poldbmp = dccompatibleDC.SelectObject(&pBmp);
  12.     
  13.     BITMAP bitmap;
  14.     pBmp.GetBitmap(&bitmap);

  15.     pDC->BitBlt(100,100,bitmap.bmWidth,bitmap.bmHeight,&dccompatibleDC,0,0,SRCCOPY);

  16.     dccompatibleDC.SelectObject(poldbmp);

  17.     pBmp.DeleteObject();



             
   





阅读(1525) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~