先看下网上的实现半透明矩形的代码
一个可绘制半透明矩形的代码 -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图片了,在进行桌面美化时这段代码非常有用,效果见下图