=============================================================
标题:绘制透明位图
摘要:通过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函数执行速度较慢,一般要谨慎使用。
利用这个函数,应该就可以实现图像渐入渐出的效果,还没试过,不知道效果如何。
(朱铭雷) |