捕获Win32游戏中文本框上的鼠标点击
Capture mouse clicks on text boxes in a Win32 game
使用c++,我正在使用Win32 API制作一字棋游戏。为了标记一个正方形(X或O),我希望玩家点击这个正方形,然后它会变成X或O。
我现在正在做的是有一个按钮点击事件,它把一个静态文本框变成X或O.然而,当我把按钮放在文本框的顶部,使它不可见,我不能点击它。
我真正需要的是一个仍然可以工作的隐形按钮。所以它没有设置为WS_VISIBLE
,但是你仍然可以点击它。
这是可能的还是有其他方法来解决这个问题?
我可以在这里看到一些合理的可能性。
第一个也是最明显的是根本不使用按钮,只让底层窗口处理WM_LBUTTONDOWN
消息,并将"X"或"O"设置在正确的位置。为此,你甚至不需要静态控件——你可以直接检测父窗口上的鼠标点击,并在相应的方格中绘制"X"或"O"。
另一种可能是标记为"可见"的按钮,但碰巧是透明的。在我看来,这是一个相当糟糕的选择。要做到这一点,你需要自己创建一个透明的按钮控件,或者子类化一个按钮控件来禁用它的绘图。
至少在我看来,最明显的方法是完全跳过使用静态控件。相反,直接使用按钮——按钮通常有标题。以空字符串的标题开始。单击按钮后,将其标题更改为"X"或"O"。它可能还应该禁用自己响应按钮点击,所以再次点击它不会有任何进一步的影响。
没有办法让一个不可见的按钮仍然发挥作用。想象一下,如果有可能的话,所有可能被滥用的方式!更不用说一个不可见但功能强大的UI是多么令人困惑。
马克赎金张贴的是完全正确的:你需要得到你现有的控制响应鼠标点击事件,就像一个按钮。然后你可以对点击做任何你想做的事情。你不需要一个按钮只是为了点击。
你说你有一个"静态文本框",但我不太确定那是什么。有文本框(不是静态的),还有静态控件(可以显示文本)。我假设你有后者。
在这种情况下,您不需要直接处理WM_LBUTTONDOWN
和WM_LBUTTONUP
消息,这将要求您子类化控件。虽然这可能是最好的设计方法(职责分离等等),但它也会带来很多麻烦。
相反,您可以通过为静态控件设置SS_NOTIFY
样式来处理父窗口过程中的单击事件(您可以在对话框编辑器中或在对CreateWindow
的调用中执行此操作,具体取决于您如何创建控件)。这导致控件在四种情况下通知它的父控件:当它被单击(STN_CLICKED
),当它被双击(STN_DBLCLK
),当它被启用(STN_ENABLE
),以及当它被禁用(STN_DISABLE
)。
因此,在父节点上,您需要处理WM_COMMAND
消息。您正在寻找的消息将具有STN_CLICKED
的HIWORD(wParam)
(表明已单击SS_NOTIFY
样式的静态控件),对应于您的静态控件的ID的LOWORD(wParam)
(在对话框编辑器中设置或在调用CreateWindow
时指定为hMenu
参数),以及包含您的静态控件句柄的lParam
。
如果您使用SW_HIDE,它不仅使窗口不可见,而且使它的行为也不可见。你真正想要的可能只是让按钮透明。我从来没有那样做过,你可能会发现这个或这个很有用。
你可能只是废弃文本框,只是使用按钮,我的意思是一个按钮看起来复选框与ownerdraw或位图。或者像Mark建议的那样去掉按钮并处理鼠标事件
- Win32编译器选项和内存分配
- WinAPI挂钩鼠标
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- C++win32 API创建多个类似视口的窗口
- 跟踪滚动条上的鼠标事件
- Win32 发送输入鼠标移动滞后并冻结
- 如何检测将鼠标悬停在静态 Win32 控件上
- WM_PAINT和鼠标事件.MFC/WIN32 API.
- 为什么将鼠标悬停在静态 Win32 控件上会增加内存并删除我的 GUI?
- C Win32 API在按钮区域内通知鼠标
- 如何使用Win32 API阻止来自透明窗口的鼠标输入?
- 如何确定鼠标的拖动方式(Win32、C++)
- 如何在C++Win32中捕捉鼠标在标题栏上的移动
- 捕获鼠标但未聚焦窗口时捕获键盘事件(Win32)
- CPP Win32移动鼠标,Wont移动到我指定的位置
- Win32中缺少鼠标移动消息
- 重复消息在鼠标进程c++ Win32
- 如何在vc++ Win32应用程序中打印句子在鼠标光标的位置
- Win32:测试鼠标是否停留了一秒钟
- 在鼠标移动/单击之前,SetCursor 不起作用 (Win32 API)