GTK # событие мыши в области рисования - PullRequest
10 голосов
/ 16 марта 2009

У меня есть DrawingArea, который я хотел бы получать события мыши. Из учебников я обнаружил, что KeyPressEvent также будет перехватывать события мыши. Однако для следующего кода обработчик никогда не вызывается.

static void Main ()
{
    Application.Init ();
    Gtk.Window w = new Gtk.Window ("");

    DrawingArea a = new CairoGraphic ();
    a.KeyPressEvent += KeyPressHandler;
    w.Add(a);

    w.Resize (500, 500);
    w.DeleteEvent += close_window;
    w.ShowAll ();

    Application.Run ();
}

private static void KeyPressHandler(object sender, KeyPressEventArgs args)
{
    Console.WriteLine("key press event");   
}

Я пробовал кучу вещей, читая различные форумы и учебники, включая:

Добавление EventBox к окнам и размещение DrawingArea в окне событий и подписка на KeyPressEvent для EventBox. (не работает)

Вызов AddEvents ((int) Gdk.EventMask.AllEventsMask); на любом виджете

Я обнаружил, что подписка на Windows KeyPressEvent действительно давала мне события клавиатуры, но не события щелчка мыши.

Все соответствующие страницы в моно документах дают мне ошибки, поэтому я немного застрял

Ответы [ 2 ]

13 голосов
/ 30 апреля 2009

Вы также должны помнить, что маска событий должна быть добавлена ​​к вашей DrawingArea:

a.AddEvents ((int) 
            (EventMask.ButtonPressMask    
            |EventMask.ButtonReleaseMask    
            |EventMask.KeyPressMask    
            |EventMask.PointerMotionMask));

Итак, ваш окончательный код должен выглядеть так:

class MainClass
{
    static void Main ()
    {
        Application.Init ();
        Gtk.Window w = new Gtk.Window ("");

        DrawingArea a = new DrawingArea ();
        a.AddEvents ((int) EventMask.ButtonPressMask);
        a.ButtonPressEvent += delegate(object o, ButtonPressEventArgs args) {
            Console.WriteLine("Button Pressed");
        };

        w.Add(a);

        w.Resize (500, 500);
        w.DeleteEvent += close_window;
        w.ShowAll ();

        Application.Run ();
    }

    static void close_window(object o, DeleteEventArgs args) {
        Application.Quit();
        return;
    }
}
0 голосов
/ 16 марта 2009

Если вы хотите перехватить события мыши, вы должны использовать ButtonPressEvent, ButtonReleaseEvent и MotionNotifyEvent:

a.ButtonPressEvent += delegate(object o, ButtonPressEventArgs args) {
    Console.WriteLine("Button Pressed");
}

KeyPressEvent только для ключей.

...