2009-03-16 15 views
9

Tengo un DrawingArea que me gustaría recibir eventos de mouse. De los tutoriales he encontrado que KeyPressEvent también capturará eventos de mouse. Sin embargo, para el siguiente código nunca se llama al controlador.Evento GTK # mouse en el área de dibujo

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

He probado un montón de cosas de la lectura de diferentes foros y tutoriales incluyendo:

Adición de un EventBox a las ventanas y poner el DrawingArea en el cuadro evento y la suscripción de la KeyPressEvent para la EventBox. (no funcionó)

Llamando a AddEvents ((int) Gdk.EventMask.AllEventsMask); en todos y cada uno de los widgets

Encontré que suscribiéndome a Windows KeyPressEvent me dio eventos de teclado pero no eventos de clic de mouse.

Todas las páginas correspondientes en los documentos mono me dan errores, así que estoy un poco atascado

Respuesta

11

También debe recordar que una máscara de evento debe ser añadido a su DrawingArea:

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

Así que su código final debe ser similar a lo siguiente:

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

Advertencia: si está interesado en la manipulación solo el 'ButtonReleaseEvent', luego, además de agregar' ButtonReleaseMask' a la lista de eventos, también debe agregar 'ButtonPressMask'. De lo contrario, su delegado 'ButtonReleaseEvent' no será llamado. –

0

Si se desea capturar eventos de ratón, usted tiene que utilizar ButtonPressEvent, ButtonReleaseEvent y MotionNotifyEvent:

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

KeyPressEvent es solo para llaves.

Cuestiones relacionadas