複合方塊(combo box)是另一個很簡單的元件,實際上它僅僅是其它元件的集合。從用戶的觀點來說,這個元件是由一個文字輸入元件和一個下拉選單組成的,用戶可以從一個預先定義的列表裡面選擇一個選項,同時,用戶也可以直接在文字框裡面輸入文字。
下面是從定義複合方塊元件的結構裡面摘取出來的,從中可以看到複合方塊元件是由什麼元件組合形成的:
struct _GtkCombo { GtkHBox hbox; GtkWidget *entry; GtkWidget *button; GtkWidget *popup; GtkWidget *popwin; GtkWidget *list; ... }; |
可以看到,複合方塊元件有兩個主要部分:一個輸入框和一個列表。
用下面的函式創建複合方塊元件:
GtkWidget *gtk_combo_new( void ); |
現在,如果想設置顯示在輸入框部分中的字串,可以直接操縱複合方塊元件內部的文字輸入元件:
gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo)->entry), "My String."); |
要設置下拉列表中的值,可以使用下面的函式:
void gtk_combo_set_popdown_strings( GtkCombo *combo, GList *strings ); |
在使用這個函式之前,先得將要添加的字串組合成一個GList鏈表。GList是一個鏈結串列,是 GLib 的一部分,而GLib是 GTK 的基礎。暫時你可以先設置一個GList指標,其值設為 NULL,然後用下面的函式將字串追加到鏈結串列當中:
GList *g_list_append( GList *glist, gpointer data ); |
要注意的是:一定要將GList鏈結串列的初值設為 NULL,必須將 g_list_append() 函式傳回的值做為GList新的指標。
下面是一段典型的程式碼,用於創建一個選項列表:
GList *glist = NULL; glist = g_list_append (glist, "String 1"); glist = g_list_append (glist, "String 2"); glist = g_list_append (glist, "String 3"); glist = g_list_append (glist, "String 4"); gtk_combo_set_popdown_strings (GTK_COMBO (combo), glist); /* 現在可以釋放glist了,複合方塊已經複製了一份 */ |
複合方塊將傳給它的glist結構裡的字串複製了一份。因此,在恰當的情況下,你應該確認釋放了鏈結串列所使用的記憶體。
到這裡為止,你已經有了一個可以使用的複合方塊元件了。有幾個行為是可以改變的。下面是相關的函式:
void gtk_combo_set_use_arrows( GtkCombo *combo, gboolean val ); void gtk_combo_set_use_arrows_always( GtkCombo *combo, gboolean val ); void gtk_combo_set_case_sensitive( GtkCombo *combo, gboolean val ); |
gtk_combo_set_use_arrows ()讓用戶用上/下方向鍵改變文字輸入元件裡的值。這並不會彈出列表框,只是用列表中的下一個列表項替換了文字輸入框中的文字(向上則取上一個值,向下則取下一個值)。這是通過搜索當前項在列表中的位置並選擇前一項/下一項來實現的。通常,在一個輸入框中方向鍵是用來改變焦點的(也可以用TAB鍵)。注意,如果當前項是列表的最後一項,按向下的方向鍵會改變焦點的位置(這對當前項為列表的第一項時按向上方向鍵也適用)。
如果當前值並不在列表中,則 gtk_combo_set_use_arrows() 函式的功能會失效。
同樣地,gtk_combo_set_use_arrows_always()允許使用上/下方向鍵在下拉列表中選取列表項,但是它在列表項中循環,也就是當列表項位於第一個表項時按向上方向鍵,會跳到最後一個,當列表項位於最後一個表項時按向下方向鍵,會跳到第一個。這樣可以完全禁止使用方向鍵改變焦點。
gtk_combo_set_case_sensitive() 函式切換 GTK 是否以區分大小寫的方式搜索其中的列表項。這在複合方塊根據內部文字輸入元件中的文字查找列表值時使用。可以將其設置為區分大小寫或不區分。如果用戶同時按 下MOD-1和「Tab」鍵,複合方塊元件還可以簡單地補全當前輸入。MOD-1一般被 xmodmap 工具映射為「Alt」鍵。注意,一些視窗管理器也要使用這種組合鍵方式,這將覆蓋 GTK 中這個組合鍵的使用。
注意,我們使用的是複合方塊元件,它能夠為我們從一個下拉列表中選擇一個選項。這一點是很直截了當的。大多數時候,你可能很關心怎樣從其中的文字輸入元件中獲取資料。複合方塊元件內部的文字輸入元件可以用GTK_ENTRY (GTK_COMBO (combo)->entry)存取。一般你想要做的兩件主要工作一個是連接到activate信號,當用戶按ENTER鍵時就能夠進行響應,另一個就是讀出其中的文字。第一件工作可以用下面的方法實現:
g_signal_connect (GTK_COMBO (combo)->entry, "activate", G_CALLBACK (my_callback_function), my_data);
可以使用下面的函式在任意時候取得文字輸入元件中的文字:
gchar *gtk_entry_get_text( GtkEntry *entry ); |
具體做法如下:
gchar *string; string = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (combo)->entry)); |
這就是取得文字輸入框中字串的方法。下面有一個函式
void gtk_combo_disable_activate( GtkCombo *combo ); |
它將停用複合方塊元件內部的文字輸入元件的activate信號。我不明白你為什麼想要用它,不過還是提供了。
1 則留言