GDI绘制透明位图

/*

下面的DrawTransparentBmp函数是一个完整的正确显示透明位图的函数,其各参数说明如下:
HDC   hdc:目标HDC,即将要绘制位图的HDC
HBITMAP   hbmp:位图的句柄,此位图可以是2位、4位、8位、16位、24位位图。
RECT   &rect:将要绘制的区域
COLORREF   colorTrans:透明色
*/

 

BOOL   DrawTransparentBmp(HDC   hdc,   HBITMAP   hbmp,   RECT   &rect,   COLORREF   colorTrans)
{
  HDC   dcImage,   dcTrans,   dcImage24;
  HBITMAP   holdbmp24,   hbmp24;
  HBITMAP   holdbmp;
  HBITMAP   hbmpTrans,   holdbmpTrans;

  //   创建内存DC
  dcImage   =   CreateCompatibleDC(hdc);
  dcTrans   =     CreateCompatibleDC(hdc);
  dcImage24   =   CreateCompatibleDC(hdc);

  if   (dcImage   ==   NULL   ||   dcTrans   ==   NULL   ||   dcImage24   ==   NULL)
    //   Error:   can 't   create   compatible   dc
    return   FALSE;
  //   获得图像属性
  BITMAP   bmp;
  GetObject(hbmp,   sizeof(bmp),   &bmp);

  //   选择图片到dcImage中
  holdbmp   =   (HBITMAP)SelectObject(dcImage,   hbmp);

  //   创建24色位图,这样才能正确地显示带透明色的位图
  LPBITMAPINFO   lpBmpInfo;
 
  lpBmpInfo   =   (BITMAPINFO*)   new   BYTE[sizeof(BITMAPINFOHEADER)];
 
  lpBmpInfo-> bmiHeader.biSize   =   sizeof(BITMAPINFOHEADER);
  lpBmpInfo-> bmiHeader.biPlanes   =   1;  
  lpBmpInfo-> bmiHeader.biBitCount   =   /*nBitCount*/24;  
  lpBmpInfo-> bmiHeader.biCompression   =   BI_RGB;  
  lpBmpInfo-> bmiHeader.biSizeImage   =   0;  
  lpBmpInfo-> bmiHeader.biClrUsed   =   0;  
 
  lpBmpInfo-> bmiHeader.biWidth   =   bmp.bmWidth;
  lpBmpInfo-> bmiHeader.biHeight   =   bmp.bmHeight;
 
  HDC   dc   =   CreateCompatibleDC(NULL);
 
  //   创建新图片
  LPVOID   lpBits;
  hbmp24   =::CreateDIBSection(dc,lpBmpInfo,DIB_RGB_COLORS,
    &lpBits,NULL,0);
 
  DeleteDC(dc);
  delete   lpBmpInfo;

  if   (hbmp24   ==   NULL)
    //   Error
    return   FALSE;

  holdbmp24   =   (HBITMAP)SelectObject(dcImage24,   hbmp24);

  //   将原图片绘制到24色位图中
  BitBlt(dcImage24,   0,   0,   bmp.bmWidth,   bmp.bmHeight,   dcImage,   0,   0,   SRCCOPY);

  //   创建Mask位图
  hbmpTrans   =   CreateBitmap(bmp.bmWidth,   bmp.bmHeight,   1,   1,   NULL);
  if   (hbmpTrans   ==   NULL)
    //   Error
    return   FALSE;

  //   选择mask位图到dcTrans中
  holdbmpTrans   =   (HBITMAP)SelectObject(dcTrans,   hbmpTrans);
 
  //   创建掩码图像(基于指定的颜色)
  COLORREF   oldbkcolor   =   SetBkColor(dcImage24,   colorTrans);
  BitBlt(dcTrans,   0,   0,   bmp.bmWidth,   bmp.bmHeight,   dcImage24,   0,   0,   SRCCOPY);
 
  SetBkColor(dcImage24,   RGB(0,0,0));
  COLORREF   oldtextcolor   =   SetTextColor(dcImage24,   RGB(255,255,255));
  BitBlt(dcImage24,   0,   0,   bmp.bmWidth,   bmp.bmHeight,   dcTrans,   0,   0,   SRCAND);

  //   去除指定的颜色
  COLORREF   crOldBack,   crOldText;
  crOldBack   =   SetBkColor(hdc,   RGB(255,255,255));
  crOldText   =   SetTextColor(hdc,   RGB(0,0,0));

  //   显示透明位图
  StretchBlt(hdc,   rect.left,   rect.top,   rect.right   -   rect.left,rect.bottom   -   rect.top,
    dcTrans,   0,   0,   bmp.bmWidth,   bmp.bmHeight,   SRCAND);
  StretchBlt(hdc,   rect.left,   rect.top,   rect.right   -   rect.left,rect.bottom   -   rect.top,
    dcImage24,   0,   0,   bmp.bmWidth,   bmp.bmHeight,   SRCPAINT);
 
  //   恢复设置及释放资源
  SelectObject(dcImage,   holdbmp);
 
  SelectObject(dcImage24,   holdbmp24);
  SelectObject(dcTrans,   holdbmpTrans);

  DeleteObject(hbmp24);
  DeleteObject(hbmpTrans);

  SetBkColor(hdc,   crOldBack);
  SetTextColor(hdc,   crOldText);
 
  SetBkColor(dcImage24,   oldbkcolor);
  SetTextColor(dcImage24,   oldtextcolor);

  DeleteDC(dcImage);
  DeleteDC(dcImage24);
  DeleteDC(dcTrans);

  return   TRUE;
}

 

用法:

 HBITMAP hbmReturn=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"pictrue.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
 
 DrawTransparentBmp(GetDC()->m_hDC,  hbmReturn, CRect(0,0, 1000,1000), RGB(0,0,0)); //指定黑色透明;

 

 

阅读更多
上一篇c++ 重载 覆盖 隐藏
下一篇串行化(Serialization)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭