wxWidgets:检测自定义控件的点击事件

3
如何为使用wxWidgets作为基础的自定义控件添加点击事件监听器?在事件列表中,我看到...
wxEVT_LEFT_DOWN 
wxEVT_LEFT_UP 
wxEVT_LEFT_DCLICK
wxEVT_MIDDLE_DOWN
wxEVT_MIDDLE_UP 
wxEVT_MIDDLE_DCLICK
wxEVT_RIGHT_DOWN 
wxEVT_RIGHT_UP
wxEVT_RIGHT_DCLICK
wxEVT_MOTION
wxEVT_ENTER_WINDOW
wxEVT_LEAVE_WINDOW
wxEVT_MOUSEWHEEL 

但是没有wxEVT_LEFT_CLICK或类似的事件。
2个回答

4
通常情况下,没有“点击”事件(在wxWidgets的情况下 - 也是如此)。点击行为被分成两个部分:鼠标按下和鼠标抬起。通常你认为的“左键单击”事件实际上是在“左键抬起”事件中处理的。
试一试:
- 悬停在按钮上(例如本页面的“添加评论”按钮) - 点击并按住左键 - 在按住左键的同时将鼠标移出按钮范围 - 松开左键 - 什么都不会发生!
这次:
- 悬停在同一个按钮上 - 点击并按住左键 - 松开左键 - 你期望的“点击”动作由抬起事件触发!

是的,这就是使用左键按下而不是点击的问题。通常情况下,用户可以通过将指针移动到对象外部来取消点击,但是在这里我需要通过检测左键按下和左键抬起来准确地检测点击?真是麻烦 :( - Randy Sugianto 'Yuku'
1
我认为,如果你正在编写一个控件,你需要准备好管理用户鼠标交互的所有细节。从这个角度来看,wxWidget鼠标事件系列是有意义的。 - Bill Forster

2
在这种情况下,我建议从wxControl而不是wxWindow继承,wxControl专门设计用于此目的,您不太可能发现自己在与系统作斗争。当我查看自己的wxWidgets应用程序中构建的控件时,我看到我的单击处理程序附加到wxEVT_LEFT_DOWN。在查看我的Cross Platform GUI Programming with wxWidgets副本时,我可以看到所有wxMouseEvents的列表,其中没有wxEVT_LEFT_CLICK。我建议使用wxEVT_LEFT_DOWN事件。

现在发布后,我已经阅读了Burly的答案并同意他的观点,wxWidgets提供最低级别的事件,这为您构建的用户界面提供了最大的控制权。


感谢您建议使用wxControl。我是wxWidgets的新手,不知道应该继承哪个控件。左下事件与单击事件不同,用户不能通过在释放鼠标按钮之前将指针移出控件来取消单击。 - Randy Sugianto 'Yuku'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接