2009-03-16 13 views
9

Mam rysunek terenu, który chciałbym otrzymać zdarzenia myszy. Z samouczków dowiedziałem się, że KeyPressEvent będzie również przechwytywać zdarzenia myszy. Jednak dla następującego kodu obsługa nigdy nie jest wywoływana.GTK # zdarzenie myszy w obszarze rysowania

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"); 
} 

Próbowałem kilka rzeczy, czytając różne fora i samouczków w tym:

Dodawanie EventBox do okien i oddanie DrawingArea w oknie zdarzeń i subskrybowania keyPressEvent dla EventBox. (nie działa)

Wywołanie AddEvents ((int) Gdk.EventMask.AllEventsMask); na wszystkich widgetach:

Odkryłem, że subskrybowanie Windows KeyPressEvent dało mi zdarzenia na klawiaturze, ale nie kliknięcia myszą.

Wszystkie odpowiednie strony w docs mono daje mi błędy, więc jestem nieco zatrzymany

Odpowiedz

11

Należy również pamiętać, że maską zdarzeń należy dodać do swojej DrawingArea:

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

Więc twój ostateczny kod powinien wyglądać tak:

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

zastrzeżenie: jeśli jesteś zainteresowany obsługą tylko 'ButtonReleaseEvent', a następnie oprócz dodawania' ButtonReleaseMask' do listy zdarzeń, musisz również dodać 'ButtonPressMask'. W przeciwnym razie delegat 'ButtonReleaseEvent' nie zostanie wywołany. –

0

Jeśli chcesz złapać zdarzeń myszy, trzeba użyć ButtonPressEvent, ButtonReleaseEvent i MotionNotifyEvent:

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

KeyPressEvent służy tylko do klawiszy.

Powiązane problemy