你可能要問,如果我想創建一個信號處理函式,當用戶調整範圍元件或微調按鈕時讓這個處理函式進行響應,應該從調整物件中取什麼值,怎樣從中取值呢?要解決這個問題,先看一下 _GtkAdjustment結構的定義:
struct _GtkAdjustment { GtkObject parent_instance; gdouble lower; gdouble upper; gdouble value; gdouble step_increment; gdouble page_increment; gdouble page_size; }; |
如果你不喜歡像一個 real C程式員那樣直接從結構中取值,你可以使用下面的函式來獲取調整物件的value參數值:
gdouble gtk_adjustment_get_value( GtkAdjustment *adjustment); |
因為設置調整物件的值時,通常想讓每個使用這個調整物件的元件對值的改變做出響應,GTK 提供了下面的函式:
void gtk_adjustment_set_value( GtkAdjustment *adjustment, gdouble value ); |
前面說過,和其它元件一樣,調整物件是Object的子類別,因而,它也能夠引發信號。這也是為什麼當捲軸和其它可調整元件共享調整物件時它們能夠自動更新的原因。所有的可調整元件都為它們的調整物件的value_changed信號設置了一個信號處理函式。下面是這個信號在_GtkAdjustmentClass結構中的定義:
void (* value_changed) (GtkAdjustment *adjustment); |
各種使用調整物件的元件都會在它們的值發生變化時引發它們的調整物件的信號。這種情況發生在當用戶用滑鼠使範圍元件的滾軸移動和當程式使用 gtk_adjustment_set_value() 函式明顯地改變調整物件的值時。所以,如果有一個比例元件,想在它的值改變時改變一幅畫的旋轉角度,應該創建像下面這樣的回呼函式:
void cb_rotate_picture (GtkAdjustment *adj, GtkWidget *picture) { set_picture_rotation (picture, gtk_adjustment_get_value (adj)); ... |
再將這個回呼函式連接到元件的調整物件上:
g_signal_connect (G_OBJECT (adj), "value_changed", G_CALLBACK (cb_rotate_picture), picture); |
當元件重新配置了它的調整物件的upper或lower參數時(比如,用戶向文字元件添加了更多的文字時),發生了什麼?在這種情況下,它會引發一個changed信號:
void (* changed) (GtkAdjustment *adjustment); |
範圍元件一般為這個信號設置回呼函式,元件會改變它們的外觀以反映變化。例如,捲軸上的滾軸會根據它的調整物件的lower和upper參數之間的差值的變化而伸長或縮短。
一般不需要處理這個信號,除非你想要寫一個新的範圍元件。不過,如果直接改變了調整物件的任何參數,應該引發這個信號,以便相關元件重新配置自己。用下面的函式引發這個信號:
g_signal_emit_by_name (G_OBJECT (adjustment), "changed"); |
現在盡情使用調整物件吧!
1 則留言