2016-08-18 2 views
0

J'expérimente un peu avec monodevelop/C#/gdk et j'ai été capable de créer une fenêtre avec un DrawingArea qui gère correctement l'événement d'exposition.Pourquoi ne pas avoir `ButtonPressEvent`

Les événements de souris ne sont cependant pas distribués et je ne comprends pas pourquoi. Les délégués ont été mis en place dans le code généré automatiquement par le concepteur graphique:

this.da.ExposeEvent += new global::Gtk.ExposeEventHandler (this.OnDAExposeEvent); 
this.da.ButtonPressEvent += new global::Gtk.ButtonPressEventHandler (this.OnDAButtonPressEvent); 
this.da.MotionNotifyEvent += new global::Gtk.MotionNotifyEventHandler (this.OnDAMotionNotifyEvent); 

et voici mon code d'initialisation:

public MainWindow() : base (Gtk.WindowType.Toplevel) 
    { 
     Build(); 
     Gdk.Color col = new Gdk.Color(); 
     col.Red = col.Green = col.Blue = 0x8888; 
     da.ModifyBg(StateType.Normal, col); 
     var p = "wr/wn/wb/wq/wk/wp/br/bn/bb/bq/bk/bp".Split ('/'); 
     for (int i = 0; i < p.Length; i++) { 
      pieces[p[i]] = new ImageSurface("/home/agriffini/x/chessboard/i" + p [i] + ".png"); 
     } 
     da.Events |= (Gdk.EventMask.ButtonPressMask 
         | Gdk.EventMask.ButtonReleaseMask 
         | Gdk.EventMask.KeyPressMask 
         | Gdk.EventMask.PointerMotionMask); 
    } 

mais la fonction de gestionnaire OnDAButtonPressEvent ne sera jamais appelé (vérifié en plaçant un point d'arrêt Là).

Quelle est la pièce qui manque?

Répondre

0

J'ai trouvé le problème en regardant la sortie de la console.

Le problème est que le masque d'événement doit être défini avant la réalisation du widget. Cela signifie que lorsque vous utilisez monodevelop et le concepteur de gui, vous devez les définir en utilisant le gui dans widget-> properties-> events car la méthode Build générée automatiquement définit le masque d'événement au bon moment avant la réalisation.

La définition du masque d'événement dans le code avant l'appel Build ne fonctionnerait pas (les widgets n'ont pas encore été créés); régler le masque après cet appel ne fonctionnerait pas non plus (ils ont déjà été réalisés).