绘制透明位图

=============================================================

标题:绘制透明位图

摘要:通过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函数执行速度较慢,一般要谨慎使用。

     利用这个函数,应该就可以实现图像渐入渐出的效果,还没试过,不知道效果如何。

你可能感兴趣的:(绘制透明位图)