我试图在Masm中制作游戏(我的老师这么说),我遇到了TransparentBlt()函数的一些问题。 我为我的游戏奠定了基础,我正在使用BitBlt,就像这样:
C = FOREACH B {
max_sal = ORDER A BY sal DESC;
max_limit = LIMIT max_sal 1;
GENERATE FLATTEN(max_limit);
}
DUMP C;
其中coordX和coordY表示主要字符的坐标,默认值(500,478)是我窗口的大小。 它的工作非常好,但有一天我正在寻找并找到了TransparentBlt,我很着迷于它的演示结果。然后我试着把它放在我的项目上,只是VUSH!发生了什么事?我的角色刚刚消失了......
invoke SelectObject,memDC,hPerson ;// selecting the Handler of my bitmap
mov hFImage, eax ;// putting the result in hFImage(using in other locals)
invoke BitBlt,hDC,0,0,500,478,memDC,coordX,coordY,SRCCOPY ;// drawing
如果您想知道,59和30是我的位图的宽度和高度。
有人可以告诉我如何使用TransparentBlt(不仅仅是MSDN)吗?我对这个几乎是PNG 的功能感到非常兴奋......
答案 0 :(得分:0)
你可能传递了错误的尺寸。
从概念上讲,BitBlt
是一个非常简单的功能。您可以将其简单地视为" blitting" (复制)从一个设备上下文到另一个设备上下文的像素块。因此,它需要以下参数:
它还需要一个光栅操作代码,但是您正在传递SRCCOPY
,这正是我上面所描述的:将一个像素块从一个设备上下文复制到另一个设备上下文。你可以用BitBlt
做更好的东西,但我们会忽略它。
这里需要注意的是BitBlt
永远不会进行任何调整大小。源矩形和目标矩形可以有不同的起源(即,它们可以从不同的坐标开始),它们总是具有相同的尺寸(< em> ie ,源和目标总是具有相同的宽度和高度。)
如果你想在blit时对位图进行调整(拉伸或压缩),那么有一个函数可以做到:StretchBlt
。 StretchBlt
基本上只是一个能够伸展的BitBlt
版本。它可以向上或向下缩放源图像的大小,因此它需要单独的维度来源和目标。
这与TransparentBlt
有什么关系?好吧,TransparentBlt
也支持调整大小。它基本上是StretchBlt
的扩展版本,支持有限形式的透明度。 *
所以进展基本上是这样的:
BitBlt
是基本功能。StretchBlt
以此为基础,通过在将源图像绘制到目标位置时添加调整大小的功能。TransparentBlt
以此为基础,添加了在源图像中将特定颜色绘制到目的地时透明的功能。我认为这种概念性理解很重要,因为它可以帮助您保持应该如何使用这些功能。
它也有助于回答您的问题。如果您想使用TransparentBlt
作为透明等效于BitBlt
,那么您不需要任何拉伸,因此您需要为源传递与目标完全相同的尺寸。
换句话说,请按以下方式致电TransparentBlt
:
invoke TransparentBlt, hDC, 0, 0, 500, 478, memDC, coordX, coordY, 500, 478, ebx
最后一点:您确实需要检查Windows API函数的返回值,否则您将无法知道它们是否失败。通常,他们会在失败时返回FALSE
(== 0)。 有时(查看MSDN文档以确定是否属实),可以在另一个函数返回GetLastError
后立即调用FALSE
函数以获取有关的其他信息为什么功能失败了。您的代码没有检查任何的返回值,因此您不知道函数是否失败,因此无法知道从哪里开始调试。
__
* 从技术上讲,使用最后一个参数(光栅操作代码)TransparentBlt
可以使用StretchBlt
完成所有操作。事实上,这就是在{98}之前,在TransparentBlt
功能存在之前必须完成的工作。甚至在Windows 98上,您经常希望以传统方式执行此操作,避免使用TransparentBlt
,因为TransparentBlt
有泄漏。现在那些日子已经远远落后于我们,每个人都只使用TransparentBlt
,因为它更简单。