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)); //指定黑色透明;

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
易语言是一种简单易学的编程语言,它提供了一套功能强大的GDI(图形设备接口)绘制库,可以实现各种图形、文字、图像的绘制操作。 下面是一个简单的易语言GDI绘制源码示例: ``` 导入文件 GDIPLUS.DLL ' 创建绘制区域 创建窗口 800, 600, 32 ' 初始化GDI+ 获取GDI+ 绘图对象 创建 GDI+ 位图 ' 设置绘制参数 设定 GDI+ 位图宽高 设定 GDI+ 位图背景颜色 ' 绘制图形 选择 GDI+ 绘图对象 设定绘图参数,如线条颜色、线条宽度等 绘制线条,起点坐标、终点坐标 绘制矩形,左上角坐标、宽度、高度 绘制圆形,圆心坐标、半径 绘制椭圆,矩形范围 绘制文本,位置坐标、字体、颜色、内容 ' 完成绘制 释放 GDI+ 绘图对象 释放 GDI+ 位图 释放 GDI+ 保存为图片文件 ' 关闭程序 结束程序 ``` 以上源码演示了如何使用易语言的GDI绘制库实现不同图形的绘制操作。通过选择不同的绘图对象,设置不同的绘制参数,我们可以绘制出线条、矩形、圆形、椭圆等不同形状的图形,并可以在图形上添加文字等内容。 这个示例只是简单的表达了易语言GDI绘制的基本操作,实际应用可以根据需求进行更复杂的绘制。 易语言的GDI绘制功能能够满足很多简单的图形绘制需求,适合初学者入门学习和简单的项目开发。但对于一些复杂、高级的图形绘制需求,可能需要借助其他更强大的图形库或者跳转到其他高级语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值