使用C ++,我正在使用Win32 API制作Tic-Tac-Toe游戏。要标记正方形(X或O),我希望玩家单击正方形,然后将其更改为X或O.
我现在正在做的是有一个按钮点击事件,它将静态文本框变为X或O.但是,当我将按钮放在文本框的顶部并使其不可见时,我无法点击它。
我真正需要的是一个仍然有效的隐形按钮。所以它没有设置WS_VISIBLE
,但你仍然可以点击它。
这可能还是有另外一种解决这个问题的方法吗?
答案 0 :(得分:2)
我可以在这看到几个合理的可能性。
第一个也是最明显的是根本不使用按钮,只需让底层窗口处理WM_LBUTTONDOWN
消息,并在正确的位置设置“X”或“O”。为此,您甚至不需要静态控件 - 您可以直接在父窗口上检测鼠标点击,并在相应的方块中绘制“X”或“O”。
另一种可能性是标记为“可见”的按钮,但恰好是透明的。 IMO,这是一个相当糟糕的选择。要做到这一点,你需要自己创建一个透明的按钮控件,或者子类按钮控件来禁用它的绘图。
至少IMO,显而易见的路线是完全不使用静态控制。相反,只需直接使用按钮 - 按钮通常有一个标题。从该标题开始作为空字符串。单击该按钮时,根据需要将其标题更改为“X”或“O”。它应该也可能会响应按钮单击而自行禁用,因此再次单击它将不会产生任何进一步的效果。
答案 1 :(得分:1)
无法制作仍然有效的隐形按钮。想象一下,如果可能的话,所有可能被滥用的方法!更不用说拥有隐形但功能性的UI会让人感到困惑。
Mark Ransom posted完全正确:您需要让现有控件响应鼠标点击事件,就像按钮一样。然后,您可以根据点击次数执行任何操作。您只需点击即可使用按钮。
你说你有一个“静态文本框”,但我不确定那是什么。有文本框(不是静态的),然后有静态控件(可以显示文本)。我会假设你有后者。
在这种情况下,您不需要直接处理WM_LBUTTONDOWN
和WM_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)