我有一个Windows应用程序,它注册一个处理对话框的WM_HELP消息的CALLBACK过程,以及一个处理自定义按钮的WM_LBUTTONUP消息的CALLBACK过程。
现在,当用户点击“?”时按钮,然后单击自定义按钮,帮助打开按预期(在鼠标按下),但如果帮助窗口没有遮挡按钮,也会触发WM_LBUTTONUP消息以及自定义按钮(在鼠标上方)。这会导致按钮在用户只是寻求帮助时触发。
如果按下按钮是为了帮助,有没有办法阻止发送WM_LBUTTONUP消息?
编辑:自定义按钮使用STATIC控件实现。我相信这是因为它需要有一个图像而没有边框。因此,它不会发送BN_CLICKED通知。事实上,它似乎根本没有触发父母的WM_COMMAND。
由于
答案 0 :(得分:6)
这很正常。请务必使用按钮的BN_CLICKED通知来查看差异。当用户单击按钮时生成,而不是在用户使用帮助光标时生成。该按钮仍然可以看到正常的按钮向上/向下消息,因此这不是检测点击的好触发器。额外的好处是现在也可以用键盘(空格键)点击按钮。
一个优秀的类库可以处理这些讨厌的小细节。
答案 1 :(得分:1)
更好的方法是将?创建为具有BS_CHECKBOX | BS_PUSHLIKE
样式的自定义控件并捕获鼠标。之后,您将获得所有WM_LBUTTONDOWN
消息到此自定义控件,然后您可以使用WindowFromPoint获取发生WM_LBUTTONDOWN的窗口,并可以向父窗口发送自定义通知。然后,父窗口可以显示工具提示或打开帮助文档或将其丢弃。
优点是,您只需创建一次控件,并且可以在多个位置使用它。
答案 2 :(得分:0)
好的,我通过创建具有SS_NOTIFY样式的自定义按钮(静态控件)来修复它,然后在WM_COMMAND消息中处理STN_CLICKED通知。 (SS_NOTIFY导致WM_COMMAND在单击时在父项中触发。)使用“?”时不会触发按钮。谢谢!