1

使用 C++,我正在使用 Win32 API 制作井字游戏。要标记一个正方形(X 或 O),我希望玩家单击该正方形,然后该正方形会变为 X 或 O。

我现在正在做的是有一个按钮单击事件,它将静态文本框变为 X 或 O。但是,当我将按钮放在文本框顶部并使其不可见时,我无法单击它。

我真正需要的是一个仍然起作用的隐形按钮。所以它没有设置WS_VISIBLE,但你仍然可以点击它。

这是可能的还是有其他方法可以解决这个问题?

4

3 回答 3

2

我可以在这里看到几个合理的可能性。

第一个也是最明显的是完全跳过使用按钮,让底层窗口处理WM_LBUTTONDOWN消息,并将“X”或“O”设置在正确的位置。为此,您甚至不需要静态控件——您可以直接在父窗口上检测鼠标点击,并在相应的正方形中绘制您的“X”或“O”。

另一种可能性是标记为“可见”的按钮,但恰好是透明的。IMO,虽然这是一个相当糟糕的选择。为此,您需要自己创建一个透明按钮控件,或者子类化一个按钮控件以禁用其绘图。

至少 IMO,明显的路线是完全跳过使用静态控制。相反,直接使用按钮——按钮通常有标题。以该标题作为空字符串开始。单击按钮时,将其标题更改为“X”或“O”。它可能还应该禁用自身以响应按钮单击,因此再次单击它不会产生任何进一步的影响。

于 2013-06-12T14:38:52.250 回答
1

没有办法制作一个仍然起作用的隐形按钮。想象一下所有可能被滥用的方式!更不用说拥有不可见但功能强大的 UI 是多么令人困惑。

Mark Ransom 发布的内容完全正确:您需要让现有控件响应鼠标单击事件,就像按钮一样。然后你可以做任何你想做的事情来响应点击。你不需要一个按钮就可以点击。

您说您有一个“静态文本框”,但我不确定那是什么。有文本框(不是静态的),然后是静态控件(可以显示文本)。我假设你有后者。

在这种情况下,您不需要直接处理WM_LBUTTONDOWNandWM_LBUTTONUP消息,这需要您对控件进行子类化。尽管这可能是设计方面最好的方法(职责分离等等),但它也带来了更多的麻烦。

相反,您可以通过设置SS_NOTIFY静态控件的样式来处理父窗口过程中的单击事件(您可以在对话框编辑器中或在调用中执行此操作CreateWindow,具体取决于您创建控件的方式)。这导致控件在四种情况下通知其父级:单击时 ( STN_CLICKED)、双击时 ( STN_DBLCLK)、启用时 ( STN_ENABLE) 和禁用时 ( STN_DISABLE)。

所以在父级,你需要处理WM_COMMAND消息。您要查找的消息将有一个HIWORD(wParam)of STN_CLICKED(表示SS_NOTIFY已单击具有该样式的静态控件),一个LOWORD(wParam)对应于您的静态控件的 ID(在对话框编辑器中设置或hMenu在调用中指定为参数CreateWindow),和一个lParam包含你的静态控件的句柄。

于 2013-06-11T20:50:00.987 回答
0

如果您使用 SW_HIDE,它不仅会使窗口不可见,还会使其行为如此。您真正想要的可能只是使按钮透明。我从来没有这样做过,你可能会发现这个这个很有帮助。

您可以只使用按钮废弃文本框,我的意思是带有 ownerdraw 或位图的按钮外观复选框。或者像马克建议的那样报废按钮并处理鼠标事件。

于 2013-06-11T19:23:42.187 回答