2009-03-16 9 views
9

J'ai une zone de dessin dans laquelle j'aimerais recevoir des événements de souris. A partir des tutoriels, j'ai trouvé que KeyPressEvent va également attraper les événements de la souris. Toutefois, pour le code suivant, le gestionnaire n'est jamais appelé.GTK # événement de souris dans la zone de dessin

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

J'ai essayé un tas de choses à la lecture de différents forums et tutoriels, y compris:

Ajout d'un EventBox aux fenêtres et de mettre la DrawingArea dans la zone de l'événement et inscrivez-vous à la keyPressEvent pour le EventBox. (n'a pas fonctionné)

Appel AddEvents ((int) Gdk.EventMask.AllEventsMask); sur tous les widgets

J'ai trouvé que l'abonnement à l'événement KeyPressEvent de Windows m'a donné des événements de clavier mais pas d'événements de clic de souris.

Toutes les pages pertinentes dans les docs mono me donnent des erreurs, donc je suis un peu coincé

Répondre

11

Vous devez également vous rappeler qu'un masque d'événement doit être ajouté à votre DrawingArea: si vous êtes intéressé par la manipulation:

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

donc votre code final devrait ressembler à ça:

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

caveat seulement le 'ButtonReleaseEvent', puis en plus d'ajouter' ButtonReleaseMask' à la liste des événements, vous devez également ajouter 'ButtonPressMask'. Sinon, votre délégué 'ButtonReleaseEvent' ne sera pas appelé. –

0

Si vous voulez attraper les événements de souris, vous devez utiliser ButtonPressEvent, ButtonReleaseEvent et MotionNotifyEvent:

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

KeyPressEvent est juste pour les clés.

Questions connexes