GTK+ 2.0 教學-事件

除有前面描述的信號機制外,還有一套 events 反映 X 事件機制。回呼函式可以與這些事件連接。這些事件是:

  • event
  • button_press_event
  • button_release_event
  • scroll_event
  • motion_notify_event
  • delete_event
  • destroy_event
  • expose_event
  • key_press_event
  • key_release_event
  • enter_notify_event
  • leave_notify_event
  • configure_event
  • focus_in_event
  • focus_out_event
  • map_event
  • unmap_event
  • property_notify_event
  • selection_clear_event
  • selection_request_event
  • selection_notify_event
  • proximity_in_event
  • proximity_out_event
  • visibility_notify_event
  • client_event
  • no_expose_event
  • window_state_event

為了連接一個回呼函式到其中一個事件,你使用函式 g_signal_connect(),像前面介紹的一樣,用上面事件名之一作為 name 參數。事件的回呼函式與信號的回呼函式有一點點不同:

gint callback_func( GtkWidget *widget, GdkEvent *event,gpointer callback_data);

GdkEvent 是一個 C union結構,它的型別依賴於上述事件中的哪個事件發生了。為了讓我們得知發生了哪個事件,每個可能的型別都有一個 type 成員來反映發生的事件。事件結構的其它部分將依賴於這個事件的型別。型別的可能的值有:


GDK_NOTHING
GDK_DELETE
GDK_DESTROY
GDK_EXPOSE
GDK_MOTION_NOTIFY
GDK_BUTTON_PRESS
GDK_2BUTTON_PRESS
GDK_3BUTTON_PRESS
GDK_BUTTON_RELEASE
GDK_KEY_PRESS
GDK_KEY_RELEASE
GDK_ENTER_NOTIFY
GDK_LEAVE_NOTIFY
GDK_FOCUS_CHANGE
GDK_CONFIGURE
GDK_MAP
GDK_UNMAP
GDK_PROPERTY_NOTIFY
GDK_SELECTION_CLEAR
GDK_SELECTION_REQUEST
GDK_SELECTION_NOTIFY
GDK_PROXIMITY_IN
GDK_PROXIMITY_OUT
GDK_DRAG_ENTER
GDK_DRAG_LEAVE
GDK_DRAG_MOTION
GDK_DRAG_STATUS
GDK_DROP_START
GDK_DROP_FINISHED
GDK_CLIENT_EVENT
GDK_VISIBILITY_NOTIFY
GDK_NO_EXPOSE
GDK_SCROLL
GDK_WINDOW_STATE
GDK_SETTING

所以,連接一個回呼函式到這些事件之一,我們會這樣用:

g_signal_connect (button, "button_press_event",
                  G_CALLBACK (button_press_callback), NULL);

這裡假定 button 是一個按鈕元件。現在,當滑鼠位於按鈕上並按一下滑鼠時,函數 button_press_callback() 會被呼叫。這個函式應該聲明為:

static gboolean button_press_callback( GtkWidget      *widget, 
                                       GdkEventButton *event,
                                       gpointer        data );

注意,我們可以把第二個參數型別聲明為 GdkEventButton,因為我們知道哪個型別的事件會發生。

這個函式的傳回值指示這個事件是否應該由 GTK 事件處理機置做進一步的傳播。傳回 TRUE 指示這個事件已經處理了,且不應該做進一步傳播。傳回 FALSE 繼續正常的事件處理。詳見進階事件和信號處理這一章。

GdkEvent 資料型態詳情請參見附錄 GDK 事件型別

GDK 選擇區和拖拉的應用程式介面也發出許多事件,在 GTK 中用信號來反映。下列信號的內容詳見原始元件上的信號目的元件上的信號這兩章:

  • selection_received
  • selection_get
  • drag_begin_event
  • drag_end_event
  • drag_data_delete
  • drag_motion
  • drag_drop
  • drag_data_get
  • drag_data_received

<<信號和回呼函式的原理

單元首頁

Hello World 詳解 >>

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

1 則留言


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *