=============================================================
标题:绘制透明位图
摘要:通过AlphaBlend函数实现
备注:Windows CE + VS2005
日期:2010.4.26
姓名:朱铭雷
=============================================================
如果要绘制透明位图,可以利用AlphaBlend函数实现。该函数的原型如下:
BOOL AlphaBlend(
HDC hdcDest,
int nXOriginDest,
int nYOriginDest,
int nWidthDest,
int nHeightDest,
HDC hdcSrc,
int nXOriginSrc,
int nYOriginSrc,
int nWidthSrc,
int nHeightSrc,
BLENDFUNCTION blendFunction
);
前十个参数的含义一目了然,最关键的是最后一个函数blendFunction。
BLENDFUNCTION结构体的原型如下:
typedef struct _BLENDFUNCTION {
BYTE BlendOp;
BYTE BlendFlags;
BYTE SourceConstantAlpha;
BYTE AlphaFormat;
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
BlendOp:设置为AC_SRC_OVER。
BlendFlags:必须设置为0。
SourceConstantAlpha:该成员是源位图绘制到目标DC上的透明度。设置为0,则完全透明;设置为255,则不透明绘制。可以通过调节该参数,来实现一个自己满意的效果。
AlphaFormat:该参数如果设置为AC_SRC_ALPHA,源位图必须是32 bpp的。如果不是,则ALPHABLEND函数将调用失败。
关于这个函数更详细的信息,可以查阅Windows CE帮助文档。
下面是一段基于Win32的示例程序,添加在WM_PAINT消息响应函数中:
———————————————————————————————————————
BLENDFUNCTION blend;
blend.AlphaFormat = 0;
blend.BlendFlags = 0;
blend.BlendOp = AC_SRC_OVER;
blend.SourceConstantAlpha = 100;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&ps);
HDC hdcBmp = CreateCompatibleDC(hdc);
HANDLE hBmpDis =
LoadImage(hInst,MAKEINTRESOURCE(IDB_BITMAP),IMAGE_BITMAP,0,0,0);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hdcBmp,hBmpDis);
if(!AlphaBlend(hdc,200,200,48,48,hdcBmp,0,0,48,48,blend))
{
OutputDebugString(_T("AlphaBlend Faild/n"));
}
SelectObject(hdcBmp,hOldBmp);
DeleteDC(hdcBmp);
EndPaint (hWnd,&ps);
———————————————————————————————————————
效果如下:
源位图 绘制的透明位图:
据说AlphaBlend函数执行速度较慢,一般要谨慎使用。
利用这个函数,应该就可以实现图像渐入渐出的效果,还没试过,不知道效果如何。