?? x1126.html
字號(hào):
<!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="雜項(xiàng)構(gòu)件"HREF="c816.html"><LINKREL="PREVIOUS"TITLE="微調(diào)按鈕 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">雜項(xiàng)構(gòu)件</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)是另一個(gè)很簡(jiǎn)單的構(gòu)件,實(shí)際上它僅僅是其它構(gòu)件的集合。從用戶的觀點(diǎn)來(lái)說(shuō),這個(gè)構(gòu)件是由一個(gè)文本輸入構(gòu)件和一個(gè)下拉菜單組成的,用戶可以從一個(gè)預(yù)先定義的列表里面選擇一個(gè)選項(xiàng),同時(shí),用戶也可以直接在文本框里面輸入文本。</P><P>下面是從定義組合框構(gòu)件的結(jié)構(gòu)里面摘取出來(lái)的,從中可以看到組合框構(gòu)件是由什么構(gòu)件組合形成的:</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>可以看到,組合框構(gòu)件有兩個(gè)主要部分:一個(gè)輸入框和一個(gè)列表。</P><P>用下面的函數(shù)創(chuàng)建組合框構(gòu)件:</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">GtkWidget *gtk_combo_new( void );</PRE></TD></TR></TABLE><P>現(xiàn)在,如果想設(shè)置顯示在輸入框部分中的字符串,可以直接操縱組合框構(gòu)件內(nèi)部的<TTCLASS="LITERAL">文本輸入</TT>構(gòu)件:</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>要設(shè)置下拉列表中的值,可以使用下面的函數(shù):</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>在使用這個(gè)函數(shù)之前,先得將要添加的字符串組合成一個(gè)GList鏈表。GList是一個(gè)雙向鏈表,是 <AHREF="c1977.html">GLib</A> 的一部分,而GLib是 GTK 的基礎(chǔ)。暫時(shí)你可以先設(shè)置一個(gè)GList指針,其值設(shè)為 NULL,然后用下面的函數(shù)將字符串追加到鏈表當(dāng)中:</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鏈表的初值設(shè)為 NULL,必須將 g_list_append() 函數(shù)返回的值賦給要操作的鏈表本身。</P><P>下面是一段典型的代碼,用于創(chuàng)建一個(gè)選項(xiàng)列表:</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); /* 現(xiàn)在可以釋放glist了,組合框已經(jīng)復(fù)制了一份 */</PRE></TD></TR></TABLE><P>組合框?qū)鹘o它的glist結(jié)構(gòu)里的字符串復(fù)制了一份。因此,在恰當(dāng)?shù)那闆r下,你應(yīng)該確認(rèn)釋放了鏈表所使用的內(nèi)存。</P><P>到這里為止,你已經(jīng)有了一個(gè)可以使用的組合框構(gòu)件了。有幾個(gè)行為是可以改變的。下面是相關(guān)的函數(shù):</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()讓用戶用上/下方向鍵改變文本輸入構(gòu)件你的值。這并不會(huì)彈出列表框,只是用列表中的下一個(gè)列表項(xiàng)替換了文本輸入框中的文本(向上則取上一個(gè)值,向下則取下一個(gè)值)。這是通過(guò)搜索當(dāng)前項(xiàng)在列表中的位置并選擇前一項(xiàng)/下一項(xiàng)來(lái)實(shí)現(xiàn)的。通常,在一個(gè)輸入框中方向鍵是用來(lái)改變焦點(diǎn)的(也可以用TAB鍵)。注意,如果當(dāng)前項(xiàng)是列表的最后一項(xiàng),按向下的方向鍵會(huì)改變焦點(diǎn)的位置(這對(duì)當(dāng)前項(xiàng)為列表的第一項(xiàng)時(shí)按向上方向鍵也適用)。</P><P>如果當(dāng)前值并不在列表中,則 gtk_combo_set_use_arrows() 函數(shù)的功能會(huì)失效。</P><P>同樣地,gtk_combo_set_use_arrows_always()允許使用上/下方向鍵在下拉列表中選取列表項(xiàng),但是它在列表項(xiàng)中循環(huán),也就是當(dāng)列表項(xiàng)位于第一個(gè)表項(xiàng)時(shí)按向上方向鍵,會(huì)跳到最后一個(gè),當(dāng)列表項(xiàng)位于最后一個(gè)表項(xiàng)時(shí)按向下方向鍵,會(huì)跳到第一個(gè)。這樣可以完全禁止使用方向鍵改變焦點(diǎn)。</P><P>gtk_combo_set_case_sensitive() 函數(shù) 切換 GTK 是否以大小寫敏感的方式搜索其中的列表項(xiàng)。這在組合框根據(jù)內(nèi)部文本輸入構(gòu)件中的文本查找列表值時(shí)使用。可以將其設(shè)置為大小寫敏感或不敏感。如果用戶同時(shí)按下MOD-1和“Tab”鍵,組合框構(gòu)件還可以簡(jiǎn)單地補(bǔ)全當(dāng)前輸入。MOD-1一般被 <TTCLASS="LITERAL">xmodmap</TT> 工具映射為“Alt”鍵。注意,一些窗口管理器也要使用這種組合鍵方式,這將覆蓋 GTK 中這個(gè)組合鍵的使用。</P><P>注意,我們使用的是組合框構(gòu)件,它能夠?yàn)槲覀儚囊粋€(gè)下拉列表中選擇一個(gè)選項(xiàng)。這一點(diǎn)是很直截了當(dāng)?shù)摹4蠖鄶?shù)時(shí)候,你可能很關(guān)心怎樣從其中的文本輸入構(gòu)件中獲取數(shù)據(jù)。組合框構(gòu)件內(nèi)部的文本輸入構(gòu)件可以用<TTCLASS="LITERAL">GTK_ENTRY (GTK_COMBO (combo)->entry)</TT>訪問(wèn)。一般你想要做的兩件主要工作一個(gè)是連接到activate信號(hào),當(dāng)用戶按回車鍵時(shí)就能夠進(jìn)行響應(yīng),另一個(gè)就是讀出其中的文本。第一件工作可以用下面的方法實(shí)現(xiàn):</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>可以使用下面的函數(shù)在任意時(shí)候取得文本輸入構(gòu)件中的文本:</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>這就是取得文本輸入框中字符串的方法。下面有一個(gè)函數(shù)</P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><PRECLASS="PROGRAMLISTING">void gtk_combo_disable_activate( GtkCombo *combo );</PRE></TD></TR></TABLE><P>它將屏蔽組合框構(gòu)件內(nèi)部的文本輸入構(gòu)件的activate信號(hào)。我不明白你為什么想要用它,不過(guò)還是提供了。</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">微調(diào)按鈕 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>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -