?? x1126.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><HTML><HEAD><TITLE>組合框 Combo Box</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+"><LINKREL="HOME"TITLE="GTK+ 2.0 教程"HREF="book1.html"><LINKREL="UP"TITLE="雜項構件"HREF="c816.html"><LINKREL="PREVIOUS"TITLE="微調按鈕 Spin Buttons"HREF="x1030.html"><LINKREL="NEXT"TITLE="日歷 Calendar"HREF="x1163.html"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">GTK+ 2.0 教程</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="x1030.html"ACCESSKEY="P"><<< Previous</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">雜項構件</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="x1163.html"ACCESSKEY="N">Next >>></A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="SEC-COMBOBOX">組合框 Combo Box</H1><P>組合框(combo box)是另一個很簡單的構件,實際上它僅僅是其它構件的集合。從用戶的觀點來說,這個構件是由一個文本輸入構件和一個下拉菜單組成的,用戶可以從一個預先定義的列表里面選擇一個選項,同時,用戶也可以直接在文本框里面輸入文本。</P><P>下面是從定義組合框構件的結構里面摘取出來的,從中可以看到組合框構件是由什么構件組合形成的:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">struct _GtkCombo { GtkHBox hbox; GtkWidget *entry; GtkWidget *button; GtkWidget *popup; GtkWidget *popwin; GtkWidget *list; ... };</PRE></TD></TR></TABLE><P>可以看到,組合框構件有兩個主要部分:一個輸入框和一個列表。</P><P>用下面的函數創建組合框構件:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">GtkWidget *gtk_combo_new( void );</PRE></TD></TR></TABLE><P>現在,如果想設置顯示在輸入框部分中的字符串,可以直接操縱組合框構件內部的<TTCLASS="LITERAL">文本輸入</TT>構件:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo)->entry), "My String.");</PRE></TD></TR></TABLE><P>要設置下拉列表中的值,可以使用下面的函數:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">void gtk_combo_set_popdown_strings( GtkCombo *combo, GList *strings );</PRE></TD></TR></TABLE><P>在使用這個函數之前,先得將要添加的字符串組合成一個GList鏈表。GList是一個雙向鏈表,是 <AHREF="c1977.html">GLib</A> 的一部分,而GLib是 GTK 的基礎。暫時你可以先設置一個GList指針,其值設為 NULL,然后用下面的函數將字符串追加到鏈表當中:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">GList *g_list_append( GList *glist, gpointer data );</PRE></TD></TR></TABLE><P>要注意的是:一定要將GList鏈表的初值設為 NULL,必須將 g_list_append() 函數返回的值賦給要操作的鏈表本身。</P><P>下面是一段典型的代碼,用于創建一個選項列表:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">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了,組合框已經復制了一份 */</PRE></TD></TR></TABLE><P>組合框將傳給它的glist結構里的字符串復制了一份。因此,在恰當的情況下,你應該確認釋放了鏈表所使用的內存。</P><P>到這里為止,你已經有了一個可以使用的組合框構件了。有幾個行為是可以改變的。下面是相關的函數:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">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 );</PRE></TD></TR></TABLE><P>gtk_combo_set_use_arrows()讓用戶用上/下方向鍵改變文本輸入構件你的值。這并不會彈出列表框,只是用列表中的下一個列表項替換了文本輸入框中的文本(向上則取上一個值,向下則取下一個值)。這是通過搜索當前項在列表中的位置并選擇前一項/下一項來實現的。通常,在一個輸入框中方向鍵是用來改變焦點的(也可以用TAB鍵)。注意,如果當前項是列表的最后一項,按向下的方向鍵會改變焦點的位置(這對當前項為列表的第一項時按向上方向鍵也適用)。</P><P>如果當前值并不在列表中,則 gtk_combo_set_use_arrows() 函數的功能會失效。</P><P>同樣地,gtk_combo_set_use_arrows_always()允許使用上/下方向鍵在下拉列表中選取列表項,但是它在列表項中循環,也就是當列表項位于第一個表項時按向上方向鍵,會跳到最后一個,當列表項位于最后一個表項時按向下方向鍵,會跳到第一個。這樣可以完全禁止使用方向鍵改變焦點。</P><P>gtk_combo_set_case_sensitive() 函數 切換 GTK 是否以大小寫敏感的方式搜索其中的列表項。這在組合框根據內部文本輸入構件中的文本查找列表值時使用。可以將其設置為大小寫敏感或不敏感。如果用戶同時按下MOD-1和“Tab”鍵,組合框構件還可以簡單地補全當前輸入。MOD-1一般被 <TTCLASS="LITERAL">xmodmap</TT> 工具映射為“Alt”鍵。注意,一些窗口管理器也要使用這種組合鍵方式,這將覆蓋 GTK 中這個組合鍵的使用。</P><P>注意,我們使用的是組合框構件,它能夠為我們從一個下拉列表中選擇一個選項。這一點是很直截了當的。大多數時候,你可能很關心怎樣從其中的文本輸入構件中獲取數據。組合框構件內部的文本輸入構件可以用<TTCLASS="LITERAL">GTK_ENTRY (GTK_COMBO (combo)->entry)</TT>訪問。一般你想要做的兩件主要工作一個是連接到activate信號,當用戶按回車鍵時就能夠進行響應,另一個就是讀出其中的文本。第一件工作可以用下面的方法實現:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">g_signal_connect (G_OBJECT (GTK_COMBO (combo)->entry), "activate", G_CALLBACK (my_callback_function), my_data);</PRE></TD></TR></TABLE><P>可以使用下面的函數在任意時候取得文本輸入構件中的文本:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">gchar *gtk_entry_get_text( GtkEntry *entry );</PRE></TD></TR></TABLE><P>具體做法如下:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING"> gchar *string; string = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (combo)->entry));</PRE></TD></TR></TABLE><P>這就是取得文本輸入框中字符串的方法。下面有一個函數</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">void gtk_combo_disable_activate( GtkCombo *combo );</PRE></TD></TR></TABLE><P>它將屏蔽組合框構件內部的文本輸入構件的activate信號。我不明白你為什么想要用它,不過還是提供了。</P></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="x1030.html"ACCESSKEY="P"><<< Previous</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="book1.html"ACCESSKEY="H">Home</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="x1163.html"ACCESSKEY="N">Next >>></A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">微調按鈕 Spin Buttons</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="c816.html"ACCESSKEY="U">Up</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">日歷 Calendar</TD></TR></TABLE></DIV></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -