在实现鼠标点击时,您应该记住 Windows 和 Gtk# 之间的两个主要区别:
- Gtk# 不提供“双击”信号(Windows 术语中的“事件”),而仅提供“单击”信号。但是 Gdk 库确实使用其 EventButton 类实现了双击和三次单击!
- Gtk# 区分小部件(或 Windows 术语中的“控件”)和“容器”(在 Windows 中没有直接可比性)。大多数放置在 Gtk# 表单上的小部件不会接收鼠标点击事件。为了接收鼠标事件,您需要将小部件放置在特定容器内 - 例如 EventBox。
这是你如何做到的Gtk#:
A. 在表单中添加一个 EventBox 容器(在下面的示例中:eventbox1)。您可以将其放置在其他小部件之后,或者因为它不可见,除非您专门选择它(或更改其背景颜色)。您可以在 EventBox 中放置一个小部件,但您只能使用一个小部件,这也将获得 EventBox 的形状和大小。
B. 将“Common Widget Signals”中的“ButtonPressEvent”信号添加到此 EventBox(在下面的示例中:OnEventbox1ButtonPressEvent)
每次在 EventBox 内单击鼠标按钮(左、中、中或组合)时,都会触发该事件,并调用函数 OnEventbox1ButtonPressEvent()。如果您需要识别在处理此事件时单击的按钮,请使用以下 uint 值:args.Event.Button 通常“1”是鼠标左键,“2”是中间按钮,“3”是右键(“2”也可能是同时单击左右按钮时)。
顺便说一句,默认情况下不发送鼠标运动事件(没有按下按钮)。因此,如果您需要感知它们,您还需要在下面的代码示例中添加 PointMotionMask。
下面是一个使用 EventButton 类捕获双击事件的 ButtonPress 事件处理程序(EventBox 名称为 'eventbox1')的代码示例:
// The following line is may not be needed but is here to show how to do it
eventbox1.GdkWindow.Events = eventbox1.GdkWindow.Events | Gdk.EventMask.ButtonPressMask;
protected void OnEventbox1ButtonPressEvent (object o, ButtonPressEventArgs args)
{
if( ((Gdk.EventButton)args.Event).Type == Gdk.EventType.TwoButtonPress)
System.Media.SystemSounds.Beep.Play (); // Play a sound only if this is a double-click event
}
接收到的事件的顺序(在双击的情况下)是:
- Gdk.EventType.ButtonPress
- Gdk.EventType.ButtonRelease
- Gdk.EventType.ButtonPress
- Gdk.EventType.TwoButtonPress
- Gdk.EventType.ButtonRelease
希望有帮助!