掉,这个函数叫做
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);
// 创建单色掩码位图