background image

掉,这个函数叫做

TransparentBlt,使用时必须链接 MsImg32.Lib 这个库。在演示程序的精

灵类

CSpirit 中使用到了这个函数,示例如下

TransparentBlt(pDC-

>GetSafeHdc(),m_nX,m_nY,SWIDTH,SHEIGHT,memDC.GetSafeHdc(),SWIDTH*m_frame,SH

EIGHT*act,SWIDTH,SHEIGHT,clr);

其中

clr 为精灵位图的背景色,在函数中作为透明色,SWIDTH 为每帧位图的宽度,在

程序中为

32,SHEIGHT 为每帧位图的高度,在程序中为 48, m_nX,m_nY 为精灵显示的

位置,

m_frame 指出当前显示哪一帧,如图一中就有 3 帧位图,act 指出了是精灵位图的第

几 行 , 代 表 了 不 同 的 动 作 , 比 如 第 一 行 代 表 向 下 走 , 第 二 行 代 表 向 左 走 。 这 样
WIDTH*m_frame,SHEIGHT*act 就可以计算出位图序列中需要显示的帧的横坐标和纵坐
标。该函数的使用并不复杂,具体的参数信息可以参见

MSDN,在使用该函数时有一些小

技巧,比如透明色的计算。因为每个精灵位图的背景色有的时候并不一定是一样的,比如主
角的背景色也许是黄色,怪物的背景色也许是红色。而且这些颜色很难确认,有的看起来很
像红色,也许它的

RGB 离红色就差一点点,如果你使用红色作为透明色,将没有任何效

果。笔者在演示程序中,使用了动态计算的办法

COLORREF clr=memDC.GetPixel(0,0);//得到透明色

取第一点的颜色作为透明色,这样就没有任何问题了。

TransparentBlt 函数在 Windows2000 以上版本中表现良好,可是在 Windows98 和 98 以

下版本中居然有内存泄漏,微软并没有很好的解决这个问题。为了在

Windows98 及一下

版本中使用,有必要自己实现一下该函数。该函数有很多实现版本,下面是一个网上流传的
很广的版本。

void TransparentBlt2( HDC hdcDest,      // 目标 DC

int nXOriginDest,   // 目标 X 偏移
int nYOriginDest,   // 目标 Y 偏移
int nWidthDest,     // 目标宽度
int nHeightDest,    // 目标高度
HDC hdcSrc,       // 源 DC
int nXOriginSrc,    // 源 X 起点
int nYOriginSrc,    // 源 Y 起点
int nWidthSrc,      // 源宽度
int nHeightSrc,     // 源高度
UINT crTransparent  // 透明色,COLORREF 类型
)

{

HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, 
                    nWidthDest, nHeightDest);// 创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, 
                                             nHeightDest, 
                                             1, 
                                             1, 
                                             NULL);

// 创建单色掩码位图