【问题标题】:Win32 API: Child windows with different imagesWin32 API:具有不同图像的子窗口
【发布时间】:2016-03-28 14:38:03
【问题描述】:

我在大学得到了一项任务:在MASM 中编写一个游戏。我选择了“三连冠”类型的游戏。游戏中的对象是一些糖果:冰淇淋、棒棒糖等。但我有一个问题。我不知道如何制作具有不同图像的子窗口。我试过了,但没有任何效果。也许有人知道如何实现这个?任何帮助表示赞赏。即使在C/C++。如果有人用文字向我解释如何做到这一点,我会很高兴。对我来说最重要的是理解这个概念。

我有

但我需要这个

【问题讨论】:

  • 从学习如何在 C++ 中做到这一点开始
  • @DavidHeffernan 对我来说,用什么编程语言编写并不重要。正如我已经提到的,我只是不知道如何实现它。
  • @Gerardo 我已经在这里展示了代码。它并没有给我带来任何好处。想法,概念如何去做——这才是最重要的。
  • 如果您不知道如何在 Windows 程序中绘画,并且希望我们教您,那么这个问题就太宽泛了。你为什么不读一本好书,或者一个好的在线教程?
  • @DavidHeffernan 你在第一张照片中看到的 - 我做到了。我知道一些事情,但当然不是全部。我读了一些书,上网,但没有那样的事。我尝试了一些方法,但没有奏效。

标签: winapi assembly masm32


【解决方案1】:

当然,您只有一个图像,因为 hBit 是一个全局变量,所以 hBit 在对 CreateSweetsWindow 的所有调用中都会被覆盖,实际上:它会保留最后加载的图像。

我建议你将 hBit 添加到 SweetsWindowStruct 结构中:

SweetsWindowStruct struct
    stype   SWEETSTYPE     ?
    sweetsID DWORD         ?
    hBit HBITMAP           ?
SweetsWindowStruct ends

并删除全局 hBit(在 sweets.asm 文件中的第 44 行),您必须像这样更改 WM_PAINT 代码:

 .elseif [iMsg] == WM_PAINT

    invoke BeginPaint, [hwnd], addr ps
    mov [hdc], eax

    invoke CreateCompatibleDC, hdc
    mov [hMemDC], eax

    SweetsWindowStruct *sws;// sorry show you in c++
    sws = (SweetsWindowStruct*)GetWindowLong(hwnd, GWL_USERDATA);
    HBITMAP hBit = sws->hBit;

    invoke SelectObject, hMemDC, [hBit]
    mov [oldDC], eax

其他问题:我认为你有一个错误,你说:

invoke SetWindowLong, [hwnd], 0, addr [sws]

一定是:

invoke SetWindowLong, [hwnd], GWL_USERDATA, addr [sws]

请检查

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2010-12-15
    相关资源
    最近更新 更多