在过去的两个月里,我在Visual Studio中用C#编写了应用程序.现在我必须通过Monodevelop将该应用程序移植到
Linux.好吧,我已经解决了大部分移植错误,但有一个我无法弄清楚.所有双击和鼠标双击事件从Visual Studio停止工作 – 我甚至创建了小型1表单应用程序,我移植到Mono只有窗体和一个事件(双击) – 它也没有工作 – 这意味着Monodevelop不能端口双单击Visual Studio中的事件?我已经检查了WND_Proc函数,而Linux不会抛出任何相应的双击事件(窗口中为515,标题栏上为3百…).我已经放弃并准备编写额外的代码来修复我的代码中的所有双击问题,但也许有人有答案.
我使用Ubuntu linux(如果它可能是tommorow检查内核版本),MONO:2.8.3,Visual Studio 2008和.NET 3.5中的项目.
最佳答案 实现鼠标点击时,您应该记住Windows和Gtk#之间的两个主要区别:
> Gtk#不提供“双击”信号(Windows术语中的“事件”),但只提供单个“点击”信号.但是Gdk库确实实现了它的EventButton类的双击和三击!
> Gtk#区分小部件(或Windows术语中的“控件”)和“容器”(Windows中没有直接可比性).放置在Gtk#表单上的大多数小部件都不会收到鼠标单击事件.为了接收鼠标事件,您需要将窗口小部件放在特定容器中 – 如EventBox.
以下是你如何做到Gtk#:
A.向表单添加EventBox包含(在下面的示例中:eventbox1).您可以将其置于其他窗口小部件后面或因为它不可见,除非您专门选择它(或更改其背景颜色).您可以将一个小部件放在EventBox中,但是您只能使用一个小部件,它也将获得EventBox的形状和大小.
B.将“ButtonPressEvent”信号添加到此EventBox中的“Common Widget Signals”(在下面的示例中: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
希望有所帮助!