linux環(huán)境程序設計教學第25章信號與處理_第1頁
linux環(huán)境程序設計教學第25章信號與處理_第2頁
linux環(huán)境程序設計教學第25章信號與處理_第3頁
linux環(huán)境程序設計教學第25章信號與處理_第4頁
linux環(huán)境程序設計教學第25章信號與處理_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第25章信號與事件處理信號與事件處理是界面開發(fā)中的重要概念,它們用于對用戶的操作進行處理。事件是Linux系統(tǒng)底層的Xwindow所定義的基本操作,例如鼠標移動、鍵盤按下都是事件。GDK將這些事件封裝起來,可通過調用GDK庫獲得這些事件。信號是GObject對象受外界改變時所發(fā)出的,GTK+對界面構件定義了豐富的信號,其中包括用戶操作界面構件時所產(chǎn)生的信號。例如,窗口顯示、按鈕按下會產(chǎn)生信號。本章將介紹與界面相關的信號與事件處理方法。25.1信號函數(shù)與回調函數(shù)GTK+是以事件驅動的圖形模型,在進入GTK+主循環(huán)后,它會等待事件的發(fā)生以進行反饋。讓GTK+進行工作有兩個最基本的步驟,首先是使用信號函數(shù)將信號與事件進行注冊,并連接到回調函數(shù)中;然后是設計回調函數(shù),將所需執(zhí)行的代碼放在回調函數(shù)內。本節(jié)將詳細介紹信號函數(shù)與回調函數(shù)的使用方法。25.1.1信號函數(shù)GTK+函數(shù)庫是基于“信號”系統(tǒng)的。所有的GTK+應用程序無一例外都是基于“信號”驅動的。假如沒有“信號”發(fā)出,則應用程序就什么都不會做。在GTK+中一個信號就是從Xwindow服務器傳出來的一個消息。當一個“事件”發(fā)生時,它就會通過發(fā)送一個“信號”來表示它已經(jīng)做出了反應。利用GTK+還可以為“信號”綁定專門的回調函數(shù)。也就是說回調函數(shù)只對它特定的“信號”才有反應并執(zhí)行。1.g_signal_connect()函數(shù)在進行信號與事件處理前,首先要使用信號函數(shù)連接信號。信號函數(shù)由GObject庫提供,GTK+的界面構件也是GObject對象,所以可以使用這些函數(shù)。g_signal_connect()函數(shù)用于連接信號或事件,它的一般形式為:gulongg_signal_connect(GObject*object,

constgchar*name,

GCallbackfunc,

gpointerfunc_data);object參數(shù)是發(fā)出信號的對象,如果是GTK+界面構件,那么必須使用宏G_OBJECT()將其強制轉換為GObject對象,或者轉換為gpointer類型。name參數(shù)是信號的名稱,信號的名稱被定義為字符串常量。func參數(shù)是回調函數(shù)的地址,可使用宏G_CALLBACK()返回一個函數(shù)的地址作為回調函數(shù)。func_data參數(shù)是傳遞給回調函數(shù)的gpointer類型,它可以是任何數(shù)據(jù)類型的地址。當一個信號被成功注冊后,g_signal_connect()函數(shù)將返回一個無符號長整型數(shù)作為該信號的標識符。25.1.1信號函數(shù)2.g_signal_handler_disconnect()函數(shù)如果要斷開該信號的連接,信號的標識符就會起到作用。g_signal_handler_disconnect()函數(shù)用于斷開信號連接,它的一般形式為:voidg_signal_handler_disconnect(GObject*object,

gulonghandler_id);object參數(shù)是發(fā)出信號的對象,handler_id是信號標識符。該函數(shù)運行后,原先連接的信號則不能生效。(25_1_1.c)該程序使用了一個結構體記錄多個界面構件和變量的指針,將結構體作為參數(shù)傳遞給回調函數(shù)時,就能訪問到多個窗體構件。主函數(shù)中使用了兩條信號連接函數(shù),分別連接計數(shù)按鈕和開關按鈕的clicked信號。當計數(shù)按鈕被按下時,回調函數(shù)label_const()改變標簽上的內容,使計數(shù)器進1位。開關按鈕按下時,回調函數(shù)close_const()判斷開關按鈕的狀態(tài)。如果是按下狀態(tài),則斷開計數(shù)按鈕clicked信號的連接,這時再次按下計數(shù)按鈕,label_const()函數(shù)不會被調用。否則重新連接按鈕clicked信號,如圖所示。25.1.1信號函數(shù)3.g_signal_connect_after()函數(shù)一個窗體構件的信號可連接多個回調函數(shù),回調函數(shù)的執(zhí)行順序為信號標識符的順序。如果要使某一個的回調函數(shù)在其它回調函數(shù)后執(zhí)行,可使用g_signal_connect_after()函數(shù)連接信號和事件。其連接的回調函數(shù)在其它g_signal_connect()函數(shù)連接的回調函數(shù)后執(zhí)行。該函數(shù)的一般形式為:gulongg_signal_connect_after(GObject*object,

constgchar*name,

GCallbackfunc,

gpointerfunc_data);下面用一個例子說明其用法,該示例是以前一個實例修改實現(xiàn)的。(25_1_1.c)程序中增加了一個回調函數(shù)和g_signal_connect_after()函數(shù)。開關按鈕按下時,g_signal_connect()函數(shù)連接的回調函數(shù)disconn_dialog()被執(zhí)行。該函數(shù)創(chuàng)建了一個消息對話框,待對話框關閉,g_signal_connect_after()函數(shù)連接的label_const()函數(shù)才會被執(zhí)行,如圖所示。25.1.1信號函數(shù)4.g_signal_connect_swapped()函數(shù)g_signal_connect_swapped()函數(shù)的作用同樣是連接信號和事件,但只傳遞一個參數(shù)給回調函數(shù)。它的一般形式為:gulongg_signal_connect_swapped(GObject*object,

constgchar*name,

GCallbackfunc,

GObject*slot_object);該函數(shù)有4個參數(shù),只有slot_object參數(shù)被傳遞到回調函數(shù),所以在設計回調函數(shù)時只需要接收該參數(shù)。如下例所示:

GtkWidget

*button;

button=gtk_button_new_from_stock(GTK_STOCK_EXIT)

g_signal_connect_swapped(GTK_OBJECT(button),"clicked",

G_CALLBACK(gtk_widget_destroy),

(gpointer)window);

//window構件指針被傳遞按鈕被按下時,回調函數(shù)gtk_widget_destroy()將window構件刪除。該例的作用是刪除一個窗體,但并非退出程序。gtk_widget_destroy()函數(shù)是GTK+庫所定義的,在擁有多個窗體的程序中,可用于關閉某一窗體而不結束GTK+主循環(huán)。25.1.1信號函數(shù)5.g_signal_handlers_disconnect_by_func()函數(shù)g_signal_handlers_disconnect_by_func()函數(shù)的作用是斷開已連接的信號和事件,它不需要消息標識符作為參數(shù),而是根據(jù)回調函數(shù)的名稱判斷哪些信號和事件被斷開。它的一般形式為:voidg_signal_handlers_disconnect_by_func(GObject*object,

GCallbackfunc,

gpointerdata);object參數(shù)是構件的名稱,該構件所有與func參數(shù)和data參數(shù)定義相同的回調函數(shù)的連接都將被斷開。25.1.2回調函數(shù)回調函數(shù)并非是GTK+所專有的,它是一種通過函數(shù)指針調用的函數(shù)。如果將某一個函數(shù)的指針作為參數(shù)傳遞給另一個函數(shù),當這個指針被用為調用它所指向的函數(shù)時,那么該函數(shù)就是回調函數(shù)。在GTK+中,回調函數(shù)必須造一定的規(guī)則定義。它的一般形式為:voidcallback_func(GObject*object,gpointerfunc_data);object參數(shù)是發(fā)送信號對象的指針,實際應用中也可以定義為GObject的子類,如GtkWidget類型。func_data參數(shù)是傳遞給回調函數(shù)的值,它可以是任意的數(shù)據(jù)類型。如果回調函數(shù)處理的是一個GDK事件,如關閉窗體構件的delete_event,那么在回調函數(shù)中必須有一個參數(shù)接受事件名。它的一般形式為:gintcallback_func(GObject*object,

GdkEvent*event,

gpointerfunc_data);event參數(shù)是一個GdkEvent聯(lián)合體類型的值,實際應用中常用字符串代替。該回調函數(shù)可以使用gint類型定義返回值,返回值實際上會傳遞給GTK+主循環(huán),作用是決定是否繼續(xù)執(zhí)行該事件。(25_1_2.c)25.1.2回調函數(shù)程序中創(chuàng)建了一個名為delete_event()的回調函數(shù),當按下主窗體的關閉按鈕時,delete_event事件發(fā)生。與其相連接的delete_event()函數(shù)會彈出一個對話框詢問是否退出程序。如果選擇確定,那么GTK+主循環(huán)繼續(xù)處理delete_event事件。在窗體關閉時拋出destroy信號,與其相連接的destroy()函數(shù)將結束主循環(huán),這樣就能退出程序。如果在退出程序對話框中選擇取消,那么delete_event()函數(shù)的返回值為TRUE,這時delete_event事件的處理將會終止,窗體繼續(xù)存在,如圖所示。25.2常用GTK+信號與事件GTK+為常用的界面構件定義了信號,這些信號可以認為是對事件的響應。在父類中定義的信號能被子類繼承,例如按鈕構件按下的clicked信號對于開關按鈕、復選按鈕和單選按鈕等子類是有效的。而子類根據(jù)其特性又有特定的信號,如開關按鈕狀態(tài)改變時產(chǎn)生toggled信號。信號的產(chǎn)生時間常見的有以下3種。RunFirst:在動作開始時產(chǎn)生。RunLast:在動作結束時產(chǎn)生。Action:動作中產(chǎn)生。大多數(shù)信號的產(chǎn)生時間都是其中的一種或多種。以窗體構件為例,keys-changed事件在動作開始時產(chǎn)生,set-focus事件在動作結束時產(chǎn)生,activate-default事件在動作中和動作結束時都會產(chǎn)生。下面將介紹常用的GTK+信號。25.2.1GtkObject類信號GtkObject類是GTK+窗體構件對象的父類,該類的信號只有destory一個。當GtkObject對象被刪除后destory信號被拋出。它的定義形式為:voidGtkObject::destroy(GtkObject*,

gpointer);信號的定義形式與作用與面向對象語言中的析構函數(shù)非常相似,它可以用于釋放動態(tài)分配的內存和進行一些清理工作。(25_2_1.c)該程序主窗體中放置了一個按鈕,并使用兩條g_signal_connect()函數(shù)連接按鈕clicked事件和destroy事件。當按下按鈕clicked事件被拋出,回調函數(shù)destroy()調用gtk_widget_destroy()函數(shù)將按鈕刪除。按鈕被刪除后destroy信號被拋出,回調函數(shù)make_label()創(chuàng)建了一個新標簽構件并裝入窗體中。窗體構件作為容器只能在同一時間裝入一個構件,因此可以證明destroy信號是在按鈕構件被徹底刪除后才被拋出,如圖所示。25.2.2GtkWidget界面構件信號GtkWidget類是所有界面構件的父類,定義在該類中的信號也是所有界面構件所共有的。這些信號與界面構件的一般特性有關,其中常用的可以簡單劃分為以下幾類。1.狀態(tài)和樣式所有的界面構件都有狀態(tài)和樣式兩種基本屬性成員。當界面構件狀態(tài)和樣式改變時,會拋出相關信號,如表所示。信

號發(fā)出時間說

明state-changedRunFirst當前界面構件狀態(tài)發(fā)生改變時產(chǎn)生,回調函數(shù)中需要處理GtkStateType類型的參數(shù)style-setRunFirst界面構件樣式改變時產(chǎn)生的信號,回調函數(shù)中需要處理GtkStyle類型參數(shù)25.2.2GtkWidget界面構件信號狀態(tài)用于決定如何繪制界面構件,它是GtkStateType枚舉類型。該類型用于定義使用何種顏色繪制構件,例如當構件處于活動狀態(tài)時通常使用明亮的顏色,而處于被選擇的狀態(tài)時使用較深的顏色。樣式用于為構件的不同狀態(tài)定義顏色,它被定義為GtkStyle類。在連接樣式和狀態(tài)的函數(shù)中,需要額外處理一個參數(shù),如下例所示:voiduser_function(GtkWidget*widget,

GtkStateTypestate,

gpointeruser_data);

//連接state-changed信號的回調函數(shù)voiduser_function(GtkWidget*widget,

GtkStyle*previous_style,

gpointeruser_data);

//連接style-set信號的回調函數(shù)在這兩個回調函數(shù)的原型中,分別增加GtkStateType類型和GtkStyle類型的參數(shù),這樣就能在回調函數(shù)中獲得狀態(tài)和樣式屬性的指針。25.2.2GtkWidget界面構件信號2.顯示與隱藏界面構件顯示與隱藏的過程中會拋出一系列信號,這些信號在不同的時間產(chǎn)生,如表所示。通過捕捉這些信號,可以知道界面構件顯示狀態(tài)的改變。界面構件的顯示是通過gtk_widget_show()函數(shù)實現(xiàn)的,它的作用是將已創(chuàng)建的界面構件顯示在屏幕上。因此show信號的產(chǎn)生時間是調用gtk_widget_show()函數(shù)顯示構件的時候,雖然這時該構件并非已經(jīng)完成了在屏幕上的繪圖。界面構件的隱藏是gtk_widget_hide()函數(shù)實現(xiàn)的,它的作用是將構件隱藏起來。界面構件并沒有被刪除,它與上層容器間的關系也沒有被改變。hide信號在界面構件隱藏時產(chǎn)生。(25_2_2)信

號發(fā)出時間說

明showRunFirst界面構件顯示時產(chǎn)生hideRunFirst界面構件隱藏時產(chǎn)生mapRunFirst界面構件請求被映射時產(chǎn)生unmapRunFirst界面構件請求取消映射時產(chǎn)生screen-changedRunLast界面在另一個屏幕上顯示時產(chǎn)生,回調函數(shù)中需要處理GdkScreen類型參數(shù)realizeRunFirst界面構件請求實現(xiàn)時產(chǎn)生unrealizeRunFirst界面構件請求消除時產(chǎn)生25.2.2GtkWidget界面構件信號程序中創(chuàng)建了一個主窗體和一個子窗體,主窗體上放置著一個標簽和按鈕。標簽顯示子窗體顯示狀態(tài),按鈕用于顯示或隱藏子窗體。按鈕按下時,clicked信號的回調函數(shù)window2_sh()將判斷子窗體是否已顯示。如果顯示則將其隱藏,反之將其顯示。子窗體關閉按鈕按下時,delete-event信號連接的回調函數(shù)delete_event()將子窗體隱藏,并返回TRUE終斷delete-event信號的處理,這樣子窗體不會被刪除。子窗體顯示或隱藏時,連接show和hide信號的回調函數(shù)window2_show()和window2_hide()將子窗體的顯示狀態(tài)寫入到主窗體的標簽上,如圖所示。25.2.2GtkWidget界面構件信號map信號在界面構件請求被映射時產(chǎn)生,gtk_widget_show()函數(shù)和gtk_widget_map()函數(shù)運行會產(chǎn)生該信號。unmap信號在gtk_widget_unmap()函數(shù)運行時產(chǎn)生。Linux系統(tǒng)可設置多個屏幕,如果一個界面構件被移動到另一個屏幕上,screen-changed將被拋出?;卣{函數(shù)的一般形式為:voiduser_function(GtkWidget*widget,

GdkScreen*previous_screen,

gpointeruser_data);只有在使用GObject類派生新的子類窗體構件時,才會使用gtk_widget_realize()函數(shù)和gtk_widget_unrealize()函數(shù)。調用這兩個函數(shù)會產(chǎn)生realize信號和unrealize信號。25.2.2GtkWidget界面構件信號3.外觀改變在界面構件的尺寸和位置改變時,或者為界面構件最小尺寸需求改變時,將產(chǎn)生如表所示的信號。信

號發(fā)出時間說

明configure-eventRunLast在界面構件尺寸、位置和結構改變后產(chǎn)生,回調函數(shù)中需要處理GdkEventConfigure類型參數(shù)size-allocateRunFirst在界面構件尺寸改變時產(chǎn)生,回調函數(shù)中需要處理GtkAllocation類型參數(shù)size-requestRunFirst在界面構件最小尺寸需求改變時產(chǎn)生,回調函數(shù)中需要處理GtkRequisition類型參數(shù)25.2.2GtkWidget界面構件信號在使用鼠標改變構件尺寸時,configure-event事件只會在操作結束產(chǎn)生一次,size-allocate事件會連續(xù)不斷地產(chǎn)生。這3個信號實際是事件,所以需要使用處理事件的函數(shù)原型來連接回調函數(shù)。如下例所示:01

gbooleanuser_function(GtkWidget*widget,02

GdkEventConfigure*event,03

gpointeruser_data);

//連接configure-event信號的回調函數(shù)04

voiduser_function(GtkWidget*widget,05

GtkAllocation*allocation,06

gpointeruser_data);

//連接size-allocate信號的回調函數(shù)07

voiduser_function(GtkWidget*widget,08

GtkRequisition*requisition,09

gpointeruser_data);

//連接size-request信號的回調函數(shù)這3個回調函數(shù)中的第二個參數(shù)是信號函數(shù)傳遞給回調函數(shù)的相關數(shù)據(jù)類型。GdkEventConfigure是結構體類型,它包含產(chǎn)生信號的事件信息。GtkAllocation結構體包含構件尺寸信息,GtkRequisition結構體包含最小尺寸需求信息。25.2.2GtkWidget界面構件信號4.焦點焦點是窗體構件或得能夠被鍵盤控制的狀態(tài)。包括窗體在內,按鈕、文本輸入框等擁有獨立XWindow的窗體對象都能獲得焦點。與焦點相關的信號見下表。信

號發(fā)出時間說

明focusRunLast界面構件獲得焦點時產(chǎn)生,回調函數(shù)中需要處理Gtk-DirectionType類型參數(shù)move-focusRunLast焦點在同一個窗體內的界面構件中移動時產(chǎn)生,回調函數(shù)中需要處理GtkDirectionType類型參數(shù)25.2.2GtkWidget界面構件信號GtkDirectionType枚舉類型是GTK+為方向定義的常量,在與以上信號連接的函數(shù)中,它用于標明焦點移動的方向。回調函數(shù)的定義形式為:gbooleanuser_function(GtkWidget*widget,

GtkDirectionTypearg1,

gpointeruser_data);

//連接focus信號的回調函數(shù)voiduser_function(GtkWidget*widget,

GtkDirectionTypearg1,

gpointeruser_data);

//連接move-focus信號的回調函數(shù)25.2.2GtkWidget界面構件信號5.快捷鍵定義快捷鍵集合并將該集合連接到窗體構件后,將產(chǎn)生與快捷鍵相關的信號,如表所示。注冊一個快捷鍵后,將構件和信號標識符作為參數(shù)傳遞給gtk_widget_can_activate_accel()函數(shù),那么使用快捷鍵時can-activate-accel信號被拋出。can-activate-accel信號的回調函數(shù)能夠決定快捷鍵是否能被執(zhí)行。(25_2_2)信

號發(fā)出時間說

明accel-closures-changedRunLast窗體構件添加或刪除快捷鍵集合對象時產(chǎn)生can-activate-accelRunLast窗體構件快捷鍵集合對象可用時產(chǎn)生,回調函數(shù)中需要處理signal_id信號標識符mnemonic-activateRunLast下劃線快捷鍵可用時產(chǎn)生,回調函數(shù)中需要處理gboolean類型參數(shù)25.2.2GtkWidget界面構件信號6.選擇操作當構件中的數(shù)據(jù)被選擇后,將產(chǎn)生與選擇操作相關的信號,如表所示。信

號發(fā)出時間說

明selection-getRunLast選擇數(shù)據(jù)后產(chǎn)生,回調函數(shù)中需要處理GtkSelectionData類型參數(shù)selection-clear-eventRunLast放棄選擇的數(shù)據(jù)后產(chǎn)生,回調函數(shù)中需要處理GtkSelectionData類型參數(shù)selection-receivedRunLast構件收到選擇請求后產(chǎn)生,回調函數(shù)中需要處理GtkSelectionData類型參數(shù)selection-request-eventRunLast當另一個構件請求目標構件選擇數(shù)據(jù)時產(chǎn)生,回調函數(shù)中需要處理GtkSelectionData類型參數(shù)selection-notify-eventRunLast任何選擇操作都將產(chǎn)生該信號,回調函數(shù)中需要處理GtkSelectionEvent類型參數(shù)25.2.2GtkWidget界面構件信號GtkSelectionData結構體是為選擇操作定義的,它用于保存選擇的數(shù)據(jù)。該結構的定義如下:structGtkSelectionData{

GdkAtomselection;

GdkAtomtarget;

GdkAtomtype;

gintformat;

guchar*data;

gintlength;};selection及target參數(shù)是在gtk_selection_convert()函數(shù)調用中所選定的值。type參數(shù)是構件返回的,用于定義數(shù)據(jù)形態(tài),例如STRING表示為字符串,INTEGER表示整型數(shù)據(jù)。format參數(shù)是每個數(shù)據(jù)單位的位長,例如8位或32位。data參數(shù)是所選擇數(shù)據(jù)的首地址指針。length是選擇數(shù)據(jù)的長度,以字節(jié)為單位,負值表示選擇的數(shù)據(jù)無效。25.2.2GtkWidget界面構件信號GtkSelectionEvent結構體除能夠保存選擇的數(shù)據(jù)外,還能保存操作類型。選擇參數(shù)的回調函數(shù)一般形式為:01 voiduser_function(GtkWidget*widget,02 GtkSelectionData*data,03 guintinfo,04 guinttime,05 gpointeruser_data); //連接selection-get信號06 gbooleanuser_function(GtkWidget*widget,07 GdkEventSelection*event,08 gpointeruser_data);//連接selection-clear-event信號09 voiduser_function(GtkWidget*widget,10 GtkSelectionData*data,11 guinttime,12 gpointeruser_data); //連接selection-received信號13 gbooleanuser_function(GtkWidget*widget,14 GdkEventSelection*event,15 gpointeruser_data);

16 //連接selection-request-event信號17 gbooleanuser_function(GtkWidget*widget,18 GdkEventSelection*event,19 gpointeruser_data);

20 //連接selection-notify-event信號25.2.2GtkWidget界面構件信號7.拖放操作拖放操作涉及到很多GDK函數(shù),例如在繪圖區(qū)構件的操作中會產(chǎn)生拖放操作相關信號,如表所示。信

號發(fā)出時間說

明drag-beginRunLast拖放動作開始時產(chǎn)生,回調函數(shù)中需要處理GdkDragContext類型參數(shù)drag-data-deleteRunLast拖放動作結束后并刪除相關數(shù)據(jù)時產(chǎn)生,回調函數(shù)中需要處理GdkDragContext類型參數(shù)drag-data-getRunLast選區(qū)拖放操作產(chǎn)生,回調函數(shù)中需要處理GdkDragContext類型參數(shù)和GtkSelectionData類型參數(shù)drag-data-receivedRunLast目標構件獲得拖放數(shù)據(jù)時產(chǎn)生,回調函數(shù)中需要處理GdkDragContext類型參數(shù)和GtkSelectionData類型參數(shù)drag-dropRunLast當數(shù)據(jù)拖放在構件上時產(chǎn)生,回調函數(shù)中需要處理GdkDragContext類型參數(shù)drag-endRunLast拖放動作結束后產(chǎn)生,回調函數(shù)中需要處理GdkDragContext類型參數(shù)drag-failedRunLast拖放操作失敗時產(chǎn)生,回調函數(shù)中需要處理GdkDragContext類型參數(shù)drag-leaveRunLast拖放操作完成,光標離開放入的地點時產(chǎn)生,回調函數(shù)中需要處理GdkDragContext類型參數(shù)drag-motionRunLast所有拖放操作都將產(chǎn)生,回調函數(shù)中需要處理GdkDragContext類型參數(shù)25.2.2GtkWidget界面構件信號GdkDragContext結構體用于存放拖放操作的相關數(shù)據(jù),回調函數(shù)的一般形式。(25_2_2_7.c)25.2.2GtkWidget界面構件信號8.鼠標操作GtkWidget對象為鼠標事件設置了一系列信號,這些信號如表所示。信

號發(fā)出時間說

明button-press-eventRunLast鼠標按鍵按下時產(chǎn)生,回調函數(shù)中需要處理GdkEventButton類型參數(shù)button-release-eventRunLast鼠標按鍵放開時產(chǎn)生,回調函數(shù)中需要處理GdkEventButton類型參數(shù)motion-notify-eventRunLast鼠標指針移動到構件上時產(chǎn)生,回調函數(shù)中需要處理GdkEventMotion類型參數(shù)scroll-eventRunLast鼠標中的滾軸滾動時產(chǎn)生,回調函數(shù)中需要處理GdkEventScroll類型參數(shù)25.2.2GtkWidget界面構件信號GdkEventButton結構體用于保存鼠標操作信息,可通過訪問結構體成員獲得這些信息。通常在程序中使用事件盒接收鼠標操作信號。(25_2_2)程序中設置了一個按鈕盒,并且在按鈕盒中放置了一個標簽按鈕。當鼠標按鍵在信號盒上按下時,回調函數(shù)button_press通過訪問GdkEventButton類型的type成員判斷進行的操作是何種類型。GdkEventMotion結構體用于保存鼠標的位置的信息,GdkEventScroll結構體用于保存鼠標滾軸操作的信息。鼠標操作相關信號的回調函數(shù)一般形式為:01

gbooleanuser_function(GtkWidget*widget,02

GdkEventScroll*event,03

gpointeruser_data);

04

//連接button-press-event或button-release-event信號05

gbooleanuser_function(GtkWidget*widget,06

GdkEventMotion*event,07

gpointeruser_data);

08

//連接motion-notify-event信號09

gbooleanuser_function(GtkWidget*widget,10

GdkEventScroll*event,11

gpointeruser_data);

//連接scroll-event信號25.2.2GtkWidget界面構件信號9.鍵盤操作鍵盤操作通常不需要開發(fā)者去處理,GTK+提供了完整的機制處理鍵盤事件。在鍵盤事件發(fā)生時,界面構件可獲得如表所示的信號。信

號發(fā)出時間說

明key-press-eventRunLast鍵盤按鍵按下時產(chǎn)生,回調函數(shù)中需要處理GdkEventKey類型參數(shù)key-release-eventRunLast鍵盤按鍵放開時產(chǎn)生,回調函數(shù)中需要處理GdkEventKey類型參數(shù)keynav-failedRunLast導航鍵失敗時產(chǎn)生,回調函數(shù)中需要處理GtkDirectionType類型參數(shù)25.2.2GtkWidget界面構件信號GdkEventKey結構體用于保存按下的鍵的信息,GtkDirectionType枚舉類型用于保存導航鍵的方向信息?;卣{函數(shù)的一般形式為:01

gbooleanuser_function(GtkWidget*widget,02

GdkEventKey*event,03

gpointeruser_data);

04

//連接key-press-event或key-release-event信號05

gbooleanuser_function(GtkWidget*widget,06

GtkDirectionTypedirection,07

gpointeruser_data);

//連接keynav-failed信號25.2.3GtkWindow窗體構件信號窗體構件的信號主要是在窗體構件中放置的界面構件被操作時產(chǎn)生,常用的信號如表所示。信

號發(fā)出時間說

明activate-defaultRunLast/Action窗體構件中默認的界面構件被按下時產(chǎn)生,通常是在按下鍵盤的回車鍵時activate-focusRunLast/Action窗體構件中獲得焦點的界面構件被按下時產(chǎn)生,通常是在按下空格鍵時frame-eventRunLast窗體構件收到鼠標或鍵盤等任意事件時產(chǎn)生,回調函數(shù)中需要處理GdkEvent類型參數(shù)keys-changedRunFirst窗體構件中的界面構件添加、刪除或改變熱鍵時產(chǎn)生set-focusRunLast窗體構件中的界面構件獲得焦點時產(chǎn)生25.2.3GtkWindow窗體構件信號GdkEvent聯(lián)合體用于保存鼠標或鍵盤等事件的信息,通常每種事件對應其中一個成員。例如,鼠標按下事件發(fā)生時,使用的是聯(lián)合體中GdkEventButton類型的成員。處理frame-event事件的回調函數(shù)一般形式為:gbooleanuser_function(GtkWindow*window,

GdkEvent*event,

gpointeruser_data);25.2.4GtkContainer容器構件信號容器構件在裝入或移出界面構件,以及尺寸被重設和其中的界面構件獲得焦點時將產(chǎn)生信號,如表所示。信

號發(fā)出時間說

明addRunFirst容器構件中裝入界面構件時產(chǎn)生check-resizeRunLast容器構件中裝入界面構件前檢查是否需要重設尺寸時產(chǎn)生removeRunFirst容器構件中裝入界面構件時產(chǎn)生,回調函數(shù)中需要處理GtkWidget類型參數(shù)set-focus-childRunFirst容器構件中的界面構件獲得焦點時產(chǎn)生,回調函數(shù)中需要處理GtkWidget類型參數(shù)25.2.4GtkContainer容器構件信號remove和set-focus-child信號會將相關界面構件的指針作為參數(shù)傳遞給回調函數(shù)?;卣{函數(shù)的一般形式為:voiduser_function(GtkContainer*container,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論