使用 C++,我正在使用 Win32 API 制作井字游戏。要标记一个正方形(X 或 O),我希望玩家单击该正方形,然后该正方形会变为 X 或 O。
我现在正在做的是有一个按钮单击事件,它将静态文本框变为 X 或 O。但是,当我将按钮放在文本框顶部并使其不可见时,我无法单击它。
我真正需要的是一个仍然起作用的隐形按钮。所以它没有设置WS_VISIBLE
,但你仍然可以点击它。
这是可能的还是有其他方法可以解决这个问题?
我可以在这里看到几个合理的可能性。
第一个也是最明显的是完全跳过使用按钮,让底层窗口处理WM_LBUTTONDOWN
消息,并将“X”或“O”设置在正确的位置。为此,您甚至不需要静态控件——您可以直接在父窗口上检测鼠标点击,并在相应的正方形中绘制您的“X”或“O”。
另一种可能性是标记为“可见”的按钮,但恰好是透明的。IMO,虽然这是一个相当糟糕的选择。为此,您需要自己创建一个透明按钮控件,或者子类化一个按钮控件以禁用其绘图。
至少 IMO,明显的路线是完全跳过使用静态控制。相反,直接使用按钮——按钮通常有标题。以该标题作为空字符串开始。单击按钮时,将其标题更改为“X”或“O”。它可能还应该禁用自身以响应按钮单击,因此再次单击它不会产生任何进一步的影响。
没有办法制作一个仍然起作用的隐形按钮。想象一下所有可能被滥用的方式!更不用说拥有不可见但功能强大的 UI 是多么令人困惑。
Mark Ransom 发布的内容完全正确:您需要让现有控件响应鼠标单击事件,就像按钮一样。然后你可以做任何你想做的事情来响应点击。你不需要一个按钮就可以点击。
您说您有一个“静态文本框”,但我不确定那是什么。有文本框(不是静态的),然后是静态控件(可以显示文本)。我假设你有后者。
在这种情况下,您不需要直接处理WM_LBUTTONDOWN
andWM_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
包含你的静态控件的句柄。