欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

刚完成一个透明圆角矩形代码的编写,与大家分享一下

刚完成一个透明圆角矩形代码的编写,与大家分享一下

先看下网上的实现半透明矩形的代码

一个可绘制半透明矩形的代码 -nohacks 收集整理
                                  
 CDC   memdc;   
  CBitmap   bmp,*pOldBitmap;   
  memdc.CreateCompatibleDC(pDC);   
  bmp.CreateCompatibleBitmap(pDC,300,200);   
  pOldBitmap   =   memdc.SelectObject(&bmp);   
  memdc.FillSolidRect(0,0,300,200,RGB(0,0,255));   //蓝色   
  BLENDFUNCTION   bf;   
  bf.BlendOp   =   AC_SRC_OVER;   
  bf.BlendFlags   =   0;   
  bf.SourceConstantAlpha   =   0x7f;   //半透明   
  bf.AlphaFormat   =   0;   
  AlphaBlend(pDC->GetSafeHdc() ,0,0,300,200,memdc.GetSafeHdc(),0,0,300,200,bf);   
   memdc.SelectObject(pOldBitmap);   
  
  
typedef struct _BLENDFUNCTION {
  BYTE  BlendOp;                              源混合操作,只支持AC_SRC_OVER
  BYTE  BlendFlags;                            保留,必须为0
  BYTE  SourceConstantAlpha;                    透明度 0-255
  BYTE  AlphaFormat;                            透明这里应为0,
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
 
AlphaBlend  函数功能:该函数用来显示具有指定透明度的图像。
  函数原型:AlphaBlend(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int hHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,BLENDFUNCTION blendFunction);
  参数:
  hdcDest:指向目标设备环境的句柄。
  nXoriginDest:指定目标矩形区域左上角的X轴坐标,按逻辑单位。
  nYOriginDest:指定目标矩形区域左上角的Y轴坐标,按逻辑单位。
  nWidthDest:指定目标矩形区域的宽度,按逻辑单位。
  hHeghtdest:指向目标矩形区域高度的句柄,按逻辑单位。
  hdcSrc:指向源设备环境的句柄。
  nXOriginSrc:指定源矩形区域左上角的X轴坐标,按逻辑单位。
  nYOriginSrc:指定源矩形区域左上角的Y轴坐标,按逻辑单位。
  nWidthSrc:指定源矩形区域的宽度,按逻辑单位。
  nHeightSrc:指定源矩形区域的高度,按逻辑单位。
  blendFunction:指定用于源位图和目标位图使用的alpha混合功能,用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER。
 
AlphaBlend的详细说明:http://baike.baidu.com/view/1080365.htm?fr=ala0
 
    我们要实现在桌面上画透明圆角矩形,用上面的代码肯定不行,CreateCompatibleBitmap不能创建圆角矩形的BMP图片,当然我们可以用RoundRect 画圆角矩形,但怎么进行透明叠加了,我们可以采用下面的方法:
创建2个与屏幕兼容的DC和BMP
 
在源BMP上用RoundRect画圆角矩形,用AlphaBlend进行透明叠加,结果保存在目标BMP
如下面的代码:

HDC = GetDC (0)  ' 取屏幕DC
CDC = CreateCompatibleDC (HDC)  ' 目标设备环境的句柄
dc = CreateCompatibleDC (HDC)  ' 源设备环境的句柄
BMP = CreateCompatibleBitmap (HDC, 1024, 768)  ' 目标BMP
fBitmap = CreateCompatibleBitmap (HDC, 1024, 768)  ' 源BMP
ReleaseDC (0, HDC)
SelectObject (CDC, BMP)  ' 关联到目标DC
oldBitmap = SelectObject (dc, fBitmap)  ' 关联到源DC
' 开始在源BMP上画圆角矩形
hPen = CreatePen (PS_INSIDEFRAME|PS_SOLID), 500, RGB (255, 255, 10))
SelectObject (dc, hPen)
RoundRect (dc, 1024, 1024- 275, 124, 20, 20)

  ' 画随机壁纸,要在透明处理前
  .......
' 进行透明叠加,结果在目标DC
  bf.BlendOp   =   AC_SRC_OVER
  bf.BlendFlags   =   0
  bf.SourceConstantAlpha   =  50
  bf.AlphaFormat   =   0
 AlphaBlend (CDC, 0, 0, 1024, 768, dc, 0, 0, 1024, 768, bf)

这样BMP 里就是含有透明矩形的BMP图片了,在进行桌面美化时这段代码非常有用,效果见下图

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功