捕获Win32游戏中文本框上的鼠标点击

Capture mouse clicks on text boxes in a Win32 game

本文关键字:鼠标 Win32 游戏 中文 文本 捕获      更新时间:2023-10-16

使用c++,我正在使用Win32 API制作一字棋游戏。为了标记一个正方形(X或O),我希望玩家点击这个正方形,然后它会变成X或O。

我现在正在做的是有一个按钮点击事件,它把一个静态文本框变成X或O.然而,当我把按钮放在文本框的顶部,使它不可见,我不能点击它。

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

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

我可以在这里看到一些合理的可能性。

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

另一种可能是标记为"可见"的按钮,但碰巧是透明的。在我看来,这是一个相当糟糕的选择。要做到这一点,你需要自己创建一个透明的按钮控件,或者子类化一个按钮控件来禁用它的绘图。

至少在我看来,最明显的方法是完全跳过使用静态控件。相反,直接使用按钮——按钮通常有标题。以空字符串的标题开始。单击按钮后,将其标题更改为"X"或"O"。它可能还应该禁用自己响应按钮点击,所以再次点击它不会有任何进一步的影响。

没有办法让一个不可见的按钮仍然发挥作用。想象一下,如果有可能的话,所有可能被滥用的方式!更不用说一个不可见但功能强大的UI是多么令人困惑。

马克赎金张贴的是完全正确的:你需要得到你现有的控制响应鼠标点击事件,就像一个按钮。然后你可以对点击做任何你想做的事情。你不需要一个按钮只是为了点击。

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

在这种情况下,您不需要直接处理WM_LBUTTONDOWNWM_LBUTTONUP消息,这将要求您子类化控件。虽然这可能是最好的设计方法(职责分离等等),但它也会带来很多麻烦。

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

因此,在父节点上,您需要处理WM_COMMAND消息。您正在寻找的消息将具有STN_CLICKEDHIWORD(wParam)(表明已单击SS_NOTIFY样式的静态控件),对应于您的静态控件的ID的LOWORD(wParam)(在对话框编辑器中设置或在调用CreateWindow时指定为hMenu参数),以及包含您的静态控件句柄的lParam

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

你可能只是废弃文本框,只是使用按钮,我的意思是一个按钮看起来复选框与ownerdraw或位图。或者像Mark建议的那样去掉按钮并处理鼠标事件