2009-03-16 34 views
9

Tôi có một DrawingArea mà tôi muốn nhận các sự kiện chuột. Từ hướng dẫn tôi đã tìm thấy rằng KeyPressEvent cũng sẽ bắt các sự kiện chuột. Tuy nhiên đối với mã sau, trình xử lý không bao giờ được gọi.Sự kiện chuột GTK # trong vùng vẽ

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

Tôi đã thử một loạt các điều từ việc đọc các diễn đàn và hướng dẫn khác nhau bao gồm:

Thêm một EventBox để các cửa sổ và đặt DrawingArea trong hộp sự kiện và đăng ký vào các KeyPressEvent cho EventBox. (không hoạt động)

Gọi AddEvents ((int) Gdk.EventMask.AllEventsMask); trên bất kỳ và tất cả các tiện ích

Tôi nhận thấy rằng việc đăng ký Windows KeyPressEvent đã cho tôi sự kiện bàn phím nhưng không cho phép các sự kiện nhấp chuột.

Tất cả các trang có liên quan trong các tài liệu mono cho tôi lỗi vì vậy tôi một chút khó khăn

Trả lời

11

Bạn cũng nên nhớ rằng một mặt nạ sự kiện nên được thêm vào DrawingArea của bạn:

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

Vì vậy, mã cuối cùng của bạn sẽ giống như thế:

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

Nên biết trước: nếu bạn quan tâm trong việc xử lý chỉ có 'ButtonReleaseEvent', ngoài việc thêm' ButtonReleaseMask' vào danh sách các sự kiện, bạn cũng phải thêm 'ButtonPressMask'. Nếu không, đại biểu 'ButtonReleaseEvent' của bạn sẽ không được gọi. –

0

Nếu bạn muốn bắt sự kiện chuột, bạn phải sử dụng ButtonPressEvent, ButtonReleaseEvent và MotionNotifyEvent:

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

KeyPressEvent chỉ dành cho Keys.

Các vấn đề liên quan