4

在过去的 2 个月里,我在 Visual Studio 中用 C# 编写了应用程序。现在我必须通过 Monodevelop 将该应用程序移植到 Linux。好吧,我已经解决了大部分移植错误,但有一个我无法弄清楚。Visual Studio 中的所有双击和鼠标双击事件都停止工作 - 我什至创建了小型 1-form 应用程序,我只用窗体和一个事件(双击)移植到 Mono - 它也不起作用 - 这意味着 Monodevelop 不能移植双Visual Studio 中的单击事件?我已经检查了 WND_Proc 函数,Linux 没有抛出任何相应的双击事件(窗口中为 515,标题栏上为 300 ……)。我已经放弃并准备编写额外的代码来修复我的代码中的所有双击问题,但也许有人有答案。

我正在使用 Ubuntu linux(如果需要的话,我明天可能会检查内核版本)、MONO:2.8.3、Visual Studio 2008 和 .NET 3.5 中的项目。

4

2 回答 2

2

在实现鼠标点击时,您应该记住 Windows 和 Gtk# 之间的两个主要区别:

  1. Gtk# 不提供“双击”信号(Windows 术语中的“事件”),而仅提供“单击”信号。但是 Gdk 库确实使用其 EventButton 类实现了双击和三次单击!
  2. 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
}

接收到的事件的顺序(在双击的情况下)是:

  1. Gdk.EventType.ButtonPress
  2. Gdk.EventType.ButtonRelease
  3. Gdk.EventType.ButtonPress
  4. Gdk.EventType.TwoButtonPress
  5. Gdk.EventType.ButtonRelease

希望有帮助!

于 2012-09-08T00:52:24.633 回答
0

GTK# 处理双击事件的方式与 Windows 窗体不同。您将不得不编写代码来翻译事件。如果你这样做,你不妨花时间反对双击作为成语。

于 2012-09-07T20:47:13.930 回答