在Win32游戏中捕获鼠标单击文本框

时间:2013-06-11 18:53:40

标签: c++ winapi

使用C ++,我正在使用Win32 API制作Tic-Tac-Toe游戏。要标记正方形(X或O),我希望玩家单击正方形,然后将其更改为X或O.

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

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

这可能还是有另外一种解决这个问题的方法吗?

3 个答案:

答案 0 :(得分:2)

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

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

另一种可能性是标记为“可见”的按钮,但恰好是透明的。 IMO,这是一个相当糟糕的选择。要做到这一点,你需要自己创建一个透明的按钮控件,或者子类按钮控件来禁用它的绘图。

至少IMO,显而易见的路线是完全不使用静态控制。相反,只需直接使用按钮 - 按钮通常有一个标题。从该标题开始作为空字符串。单击该按钮时,根据需要将其标题更改为“X”或“O”。它应该也可能会响应按钮单击而自行禁用,因此再次单击它将不会产生任何进一步的效果。

答案 1 :(得分:1)

无法制作仍然有效的隐形按钮。想象一下,如果可能的话,所有可能被滥用的方法!更不用说拥有隐形但功能性的UI会让人感到困惑。

Mark Ransom posted完全正确:您需要让现有控件响应鼠标点击事件,就像按钮一样。然后,您可以根据点击次数执行任何操作。您只需点击即可使用按钮。

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

在这种情况下,您不需要直接处理WM_LBUTTONDOWNWM_LBUTTONUP消息,这将要求您对控件进行子类化。虽然这可能是设计方面的最佳方法(责任分离和所有这些),但它也更麻烦。

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

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

答案 2 :(得分:0)

如果您使用SW_HIDE,它不仅会使窗口不可见,而且会使其行为类似。你真正想要的只是让按钮透明。我从未这样做过,您可能会发现thisthis有帮助。

你可能只是使用按钮废弃文本框,我的意思是带有ownerdraw或bitmaps的按钮式复选框。或者废弃按钮并处理鼠标事件,如马克建议的那样。