DragDetect (IntPtr, Point) из user32.dll эквивалент в моно? - PullRequest
3 голосов
/ 21 февраля 2011

Кто-нибудь знает управляемый код для упомянутого вызова p / invoke, чтобы использовать его с моно? Существует ли Linux-библиотека, которая обеспечивает функциональность, аналогичную user32.dll в Windows?

1 Ответ

1 голос
/ 22 февраля 2011

Я не уверен, существует ли прямой эквивалент для вызова DragDirect для x11 \ GTK, но вы можете иметь такую ​​же функциональность с методами Gdk.Pointer.Grab и Gdk.Pointer.Ungrab.Захватывайте указатель мыши всякий раз, когда вам нужно, затем отслеживайте движение мыши и отпускайте, когда пользователь нажимает Escape или отпускает мышь или мышь выходит из прямоугольника перетаскивания.

Ниже приведен небольшой пример:

public partial class MainWindow : Gtk.Window
{
    public MainWindow () : base(Gtk.WindowType.Toplevel)
    {
        Build ();
    }

    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }

    protected virtual void OnWidgetEvent (object o, Gtk.WidgetEventArgs args)
    {   
        if (args.Event is Gdk.EventMotion && args.Event.Type==Gdk.EventType.MotionNotify)
        {
            Gdk.EventMotion eventMotion = (Gdk.EventMotion)args.Event; 
            Console.WriteLine("mouse move {0} {1}", eventMotion.X, eventMotion.Y);
        }
        else if (args.Event is Gdk.EventKey && args.Event.Type==Gdk.EventType.KeyPress)
        {
            Gdk.EventKey eventKey = (Gdk.EventKey)args.Event;
            if (eventKey.Key==Gdk.Key.Escape)
            {
                Console.WriteLine("mouse pointer ungrab");
                Gtk.Grab.Remove(this);
                Gdk.Pointer.Ungrab(Gtk.Global.CurrentEventTime);
            }
        }
    }

    protected virtual void OnButton1WidgetEvent (object o, Gtk.WidgetEventArgs args)
    {
        if (args.Event is Gdk.EventButton && args.Event.Type==Gdk.EventType.ButtonPress)
        {
            Console.WriteLine("mouse pointer grab");
            Gdk.Pointer.Grab(this.GdkWindow, true,
                Gdk.EventMask.ButtonPressMask | Gdk.EventMask.ButtonReleaseMask | Gdk.EventMask.PointerMotionMask | Gdk.EventMask.EnterNotifyMask | Gdk.EventMask.LeaveNotifyMask, 
                null, null, Gtk.Global.CurrentEventTime); 
            Gtk.Grab.Add (this);
        }
    }
}

Объявление пользовательского интерфейса MainWindow:

  <widget class="Gtk.Window" id="MainWindow" design-size="400 300">
    <property name="MemberName" />
    <property name="Title" translatable="yes">MainWindow</property>
    <property name="WindowPosition">CenterOnParent</property>
    <signal name="DeleteEvent" handler="OnDeleteEvent" />
    <signal name="WidgetEvent" handler="OnWidgetEvent" />
    <child>
      <widget class="Gtk.Fixed" id="fixed1">
        <property name="MemberName" />
        <property name="HasWindow">False</property>
        <child>
          <widget class="Gtk.Button" id="button1">
            <property name="MemberName" />
            <property name="CanFocus">True</property>
            <property name="Type">TextOnly</property>
            <property name="Label" translatable="yes">GtkButton</property>
            <property name="UseUnderline">True</property>
            <signal name="WidgetEvent" handler="OnButton1WidgetEvent" />
          </widget>
          <packing>
            <property name="X">165</property>
            <property name="Y">125</property>
          </packing>
        </child>
      </widget>
    </child>
  </widget>

подробнее об обработке указателя мыши в GTK здесь: Указатель мыши

надеюсь, это поможет, с уважением

...