在MASM中调用TransparentBlt

时间:2017-06-14 01:37:42

标签: windows winapi bitmap transparency masm

我试图在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 的功能感到非常兴奋......

1 个答案:

答案 0 :(得分:0)

你可能传递了错误的尺寸。

从概念上讲,BitBlt是一个非常简单的功能。您可以将其简单地视为" blitting" (复制)从一个设备上下文到另一个设备上下文的像素块。因此,它需要以下参数:

  1. 源设备上下文
  2. 目标设备上下文
  3. 源矩形的原点(左上角)。
  4. 目标矩形的原点(左上角)。
  5. 尺寸(宽度和高度)。
  6. 它还需要一个光栅操作代码,但是您正在传递SRCCOPY,这正是我上面所描述的:将一个像素块从一个设备上下文复制到另一个设备上下文。你可以用BitBlt做更好的东西,但我们会忽略它。

    这里需要注意的是BitBlt永远不会进行任何调整大小。源矩形和目标矩形可以有不同的起源,它们可以从不同的坐标开始),它们总是具有相同的尺寸(< em> ie ,源和目标总是具有相同的宽度和高度。)

    如果你想在blit时对位图进行调整(拉伸或压缩),那么有一个函数可以做到:StretchBltStretchBlt基本上只是一个能够伸展的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,因为它更简单。