- 論壇徽章:
- 0
|
工具欄 Toolbar
工具欄(Toolbars)常用來將一些構(gòu)件分組,這樣能夠簡化定制它們的外觀和布局。典型情況下工具欄由帶圖標(biāo)和標(biāo)簽以及工具提示的按鈕組成,不過,其它構(gòu)件也可以放在工具欄里面。最后,各工具欄組件可以水平或垂直排列,還可以顯示圖標(biāo)或標(biāo)簽,或者兩者都顯示。
用下面的函數(shù)創(chuàng)建一個工具欄(可能有些人已經(jīng)猜到了):
GtkWidget *gtk_toolbar_new( void );
創(chuàng)建工具欄以后,可以向其中追加、前插和插入工具欄項(這里意指簡單文本字符串)或元素(這里意指任何構(gòu)件類型)。要想描述一個工具欄上的對象,需要一個標(biāo)簽文本、一個工具提示文本、一個私有工具提示文本、一個圖標(biāo)和一個回調(diào)函數(shù)。例如,要前插或追加一個按鈕,應(yīng)該使用下面的函數(shù):
GtkWidget *gtk_toolbar_append_item( GtkToolbar *toolbar,
const char *text,
const char *tooltip_text,
const char *tooltip_private_text,
GtkWidget *icon,
GtkSignalFunc callback,
gpointer user_data );
GtkWidget *gtk_toolbar_prepend_item( GtkToolbar *toolbar,
const char *text,
const char *tooltip_text,
const char *tooltip_private_text,
GtkWidget *icon,
GtkSignalFunc callback,
gpointer user_data );
如果要使用 gtk_toolbar_insert_item(),除上面函數(shù)中要指定的參數(shù)以外,還要指定插入對象的位置,形式如下:
GtkWidget *gtk_toolbar_insert_item( GtkToolbar *toolbar,
const char *text,
const char *tooltip_text,
const char *tooltip_private_text,
GtkWidget *icon,
GtkSignalFunc callback,
gpointer user_data,
gint position );
要簡單地在工具欄項之間添加空白區(qū)域,可以使用下面的函數(shù):
void gtk_toolbar_append_space( GtkToolbar *toolbar );
void gtk_toolbar_prepend_space( GtkToolbar *toolbar );
void gtk_toolbar_insert_space( GtkToolbar *toolbar,
gint position );
如果需要,工具欄的放置方向和它的式樣可以在運行時用下面的函數(shù)設(shè)置:
void gtk_toolbar_set_orientation( GtkToolbar *toolbar,
GtkOrientation orientation );
void gtk_toolbar_set_style( GtkToolbar *toolbar,
GtkToolbarStyle style );
void gtk_toolbar_set_tooltips( GtkToolbar *toolbar,
gint enable );
上面的orientation參數(shù)取GTK_ORIENTATION_HORIZONTAL或GTK_ORIENTATION_VERTICAL。style參數(shù)用于設(shè)置工具欄項的外觀,可以取GTK_TOOLBAR_ICONS,GTK_TOOLBAR_TEXT或GTK_TOOLBAR_BOTH。
要想了解工具欄還能做什么,看一看下面的程序(在代碼之間我們插入了一些解釋):
#include
/* 這個函數(shù)連接到Close按鈕或者從窗口管理器關(guān)閉窗口的事件上 */
gint delete_event (GtkWidget *widget, GdkEvent *event, gpointer data)
{
gtk_main_quit ();
return FALSE;
}
上面的代碼和其它的 GTK 應(yīng)用程序差別不大,有一點不同的是:我們包含了一個漂亮的 XPM 圖片,用作所有按鈕的圖標(biāo)。
GtkWidget* close_button; /* 這個按鈕將引發(fā)一個信號以
* 關(guān)閉應(yīng)用程序 */
GtkWidget* tooltips_button; /* 啟用/禁用工具提示 */
GtkWidget* text_button,
* icon_button,
* both_button; /* 切換工具欄風(fēng)格的單選按鈕 */
GtkWidget* entry; /* 一個文本輸入構(gòu)件,用于演示任何構(gòu)件都可以組裝到
* 工具欄里 */
事實上,不是上面所有的構(gòu)件都是必須的,我把它們放在一起,是為了讓事情更清晰。
/* 很簡單...當(dāng)按鈕進(jìn)行狀態(tài)切換時,我們檢查哪一個按鈕是活動的,依此設(shè)置工具欄的式樣
* 注意,工具欄是作為用戶數(shù)據(jù)傳遞到回調(diào)函數(shù)的! */
void radio_event (GtkWidget *widget, gpointer data)
{
if (GTK_TOGGLE_BUTTON (text_button)->active)
gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
else if (GTK_TOGGLE_BUTTON (icon_button)->active)
gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
else if (GTK_TOGGLE_BUTTON (both_button)->active)
gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
}
/* 更簡單,檢查給定開關(guān)按鈕的狀態(tài),依此啟用或禁用工具提示 */
void toggle_event (GtkWidget *widget, gpointer data)
{
gtk_toolbar_set_tooltips (GTK_TOOLBAR (data),
GTK_TOGGLE_BUTTON (widget)->active );
}
上面只是當(dāng)工具欄上的一個按鈕被按下時要調(diào)用的兩個回調(diào)函數(shù)。你應(yīng)該已經(jīng)熟悉了這些東西,如果你已經(jīng)使用過開關(guān)按鈕(以及單選按鈕)。
int main (int argc, char *argv[])
{
/* 下面是主窗口(一個對話框)和一個把柄盒(handlebox) */
GtkWidget* dialog;
GtkWidget* handlebox;
/* 好了,我們需要一個工具欄,一個帶掩碼(mask)的圖標(biāo)(所有的按鈕共用一個掩碼)以及
* 一個放圖標(biāo)的圖標(biāo)構(gòu)件(但我們會為每個按鈕創(chuàng)建一個分割構(gòu)件) */
GtkWidget * toolbar;
GtkWidget * iconw;
/* 這個在所有的 GTK 程序中都被調(diào)用。 */
gtk_init (&argc, &argv);
/* 用給定的標(biāo)題和尺寸創(chuàng)建一個新窗口 */
dialog = gtk_dialog_new ();
gtk_window_set_title (GTK_WINDOW (dialog), "GTKToolbar Tutorial");
gtk_widget_set_size_request (GTK_WIDGET (dialog), 600, 300);
GTK_WINDOW (dialog)->allow_shrink = TRUE;
/* 在關(guān)閉窗口時退出 */
g_signal_connect (G_OBJECT (dialog), "delete_event",
G_CALLBACK (delete_event), NULL);
/* 需要實例化窗口,因為我們要在它的內(nèi)容中為工具欄設(shè)置圖片 */
gtk_widget_realize (dialog);
/* 我們將工具欄放在一個手柄構(gòu)件(handle box)上,
* 這樣它可以從主窗口上移開 */
handlebox = gtk_handle_box_new ();
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
handlebox, FALSE, FALSE, 5);
上面的代碼和任何其它Gtk應(yīng)用程序都差不多。它們進(jìn)行 GTK 初始化,創(chuàng)建主窗口等。唯一需要解釋的是:一個手柄盒(a handle box)。手柄盒只是一個可以在其中組裝構(gòu)件的盒子。它和普通盒子的區(qū)別在于它能從一個父窗口移開(事實上,手柄盒保留在父窗口上,但是它縮小為一個非常小的矩形,同時它的所有內(nèi)容重新放在一個新的可自由移動的浮動窗口上)。擁有一個可浮動工具欄給人感覺非常好,所以這兩種構(gòu)件經(jīng)常同時使用。
/* 工具欄設(shè)置為水平的,同時帶有圖標(biāo)和文本
* 在每個項之間有5像素的間距,
* 并且,我們也將它放在手柄盒上 */
toolbar = gtk_toolbar_new ();
gtk_toolbar_set_orientation (GTK_TOOLBAR (toolbar), GTK_ORIENTATION_HORIZONTAL);
gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_BOTH);
gtk_container_set_border_width (GTK_CONTAINER (toolbar), 5);
gtk_toolbar_set_space_size (GTK_TOOLBAR (toolbar), 5);
gtk_container_add (GTK_CONTAINER (handlebox), toolbar);
上面的代碼初始化工具欄構(gòu)件。
/* 工具欄上第一項是按鈕 */
iconw = gtk_image_new_from_file ("gtk.xpm"); /* 圖標(biāo)構(gòu)件 */
close_button =
gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), /* 工具欄 */
"Close", /* 按鈕標(biāo)簽 */
"Closes this app", /* 按鈕的工具提示 */
"Private", /* 工具提示的私有信息 */
iconw, /* 圖標(biāo)構(gòu)件 */
GTK_SIGNAL_FUNC (delete_event), /* 一個信號 */
NULL);
gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); /* 工具欄項后的空白 */
在上面的代碼中,可以看到最簡單的情況:在工具欄上增加一個按鈕。在追加一個新的工具欄項前,必須構(gòu)造一個圖片(image)構(gòu)件用作該項的圖標(biāo),這個步驟我們要對每一個工具欄項重復(fù)一次。在工具欄項之間還要增加間隔空間,這樣后面的工具欄項就不會一個接一個緊挨著。可以看到,gtk_toolbar_append_item()返回一個指向新創(chuàng)建的按鈕構(gòu)件的指針,所以我們可以用正常的方式使用它。
/* 現(xiàn)在,我們創(chuàng)建單選按鈕組... */
iconw = gtk_image_new_from_file ("gtk.xpm");
icon_button = gtk_toolbar_append_element (
GTK_TOOLBAR (toolbar),
GTK_TOOLBAR_CHILD_RADIOBUTTON, /* 元素類型 */
NULL, /* 指向構(gòu)件的指針 */
"Icon", /* 標(biāo)簽 */
"Only icons in toolbar", /* 工具提示 */
"Private", /* 工具提示的私有字符串 */
iconw, /* 圖標(biāo) */
GTK_SIGNAL_FUNC (radio_event), /* 信號 */
toolbar); /* 信號傳遞的數(shù)據(jù) */
gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
這里我們開始創(chuàng)建一個單選按鈕組。用 gtk_toolbar_append_element 就行了。事實上,使用這個函數(shù),我們能夠添加簡單的工具欄項或空白間隔(類型為GTK_TOOLBAR_CHILD_SPACE或GTK_TOOLBAR_CHILD_BUTTON)。在上面的示例中,我們先創(chuàng)建了一個單選按鈕組。要為這個組創(chuàng)建其它單選按鈕,需要一個指向前一個按鈕的指針,這樣按鈕的清單可以很容易組織起來(看在本文檔前面部分的
單選按鈕
節(jié))。
/* 后面的單選按鈕引用前面創(chuàng)建的 */
iconw = gtk_image_new_from_file ("gtk.xpm");
text_button =
gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
GTK_TOOLBAR_CHILD_RADIOBUTTON,
icon_button,
"Text",
"Only texts in toolbar",
"Private",
iconw,
GTK_SIGNAL_FUNC (radio_event),
toolbar);
gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
iconw = gtk_image_new_from_file ("gtk.xpm");
both_button =
gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
GTK_TOOLBAR_CHILD_RADIOBUTTON,
text_button,
"Both",
"Icons and text in toolbar",
"Private",
iconw,
GTK_SIGNAL_FUNC (radio_event),
toolbar);
gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (both_button), TRUE);
最后,我們必須手工設(shè)置其中一個按鈕的狀態(tài)(否則它們?nèi)刻幱诨顒訝顟B(tài),并阻止我們在它們之間做出選擇)。
/* 下面只是一個簡單的開關(guān)按鈕 */
iconw = gtk_image_new_from_file ("gtk.xpm");
tooltips_button =
gtk_toolbar_append_element (GTK_TOOLBAR (toolbar),
GTK_TOOLBAR_CHILD_TOGGLEBUTTON,
NULL,
"Tooltips",
"Toolbar with or without tips",
"Private",
iconw,
GTK_SIGNAL_FUNC (toggle_event),
toolbar);
gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tooltips_button), TRUE);
開關(guān)按鈕的創(chuàng)建方法就很明顯了(如果你已經(jīng)知道怎么創(chuàng)建單選按鈕了)。
/* 要將一個構(gòu)件組裝到工具欄上,只需創(chuàng)建它,然后將它追
* 加到工具欄上,同時設(shè)置合適的工具提示 */
entry = gtk_entry_new ();
gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar),
entry,
"This is just an entry",
"Private");
/* 因為它不是工具欄自己創(chuàng)建的,所以我們還需要顯示它 */
gtk_widget_show (entry);
可以看到,將任何構(gòu)件添加到工具欄上都是非常簡單的。唯一要記住的是,這個構(gòu)件必須手工顯示(與此相反,工具欄自己創(chuàng)建的工具欄項隨工具欄一起顯示)。
/* 好了,現(xiàn)在可以顯示所有的東西了 */
gtk_widget_show (toolbar);
gtk_widget_show (handlebox);
gtk_widget_show (dialog);
/* 進(jìn)入主循環(huán),等待用戶的操作 */
gtk_main ();
return 0;
}
這樣,我們就到了工具欄教程的末尾。當(dāng)然,還需要一個漂亮的XPM圖標(biāo)。下面就是:
/* XPM */
static char * gtk_xpm[] = {
"32 39 5 1",
". c none",
"+ c black",
"@ c #3070E0",
"# c #F05050",
"$ c #35E035",
"................+...............",
"..............+++++.............",
"............+++++@@++...........",
"..........+++++@@@@@@++.........",
"........++++@@@@@@@@@@++........",
"......++++@@++++++++@@@++.......",
".....+++@@@+++++++++++@@@++.....",
"...+++@@@@+++@@@@@@++++@@@@+....",
"..+++@@@@+++@@@@@@@@+++@@@@@++..",
".++@@@@@@+++@@@@@@@@@@@@@@@@@@++",
".+#+@@@@@@++@@@@+++@@@@@@@@@@@@+",
".+##++@@@@+++@@@+++++@@@@@@@@$@.",
".+###++@@@@+++@@@+++@@@@@++$$$@.",
".+####+++@@@+++++++@@@@@+@$$$$@.",
".+#####+++@@@@+++@@@@++@$$$$$$+.",
".+######++++@@@@@@@++@$$$$$$$$+.",
".+#######+##+@@@@+++$$$$$$@@$$+.",
".+###+++##+##+@@++@$$$$$$++$$$+.",
".+###++++##+##+@@$$$$$$$@+@$$@+.",
".+###++++++#+++@$$@+@$$@++$$$@+.",
".+####+++++++#++$$@+@$$++$$$$+..",
".++####++++++#++$$@+@$++@$$$$+..",
".+#####+++++##++$$++@+++$$$$$+..",
".++####+++##+#++$$+++++@$$$$$+..",
".++####+++####++$$++++++@$$$@+..",
".+#####++#####++$$+++@++++@$@+..",
".+#####++#####++$$++@$$@+++$@@..",
".++####++#####++$$++$$$$$+@$@++.",
".++####++#####++$$++$$$$$$$$+++.",
".+++####+#####++$$++$$$$$$$@+++.",
"..+++#########+@$$+@$$$$$$+++...",
"...+++########+@$$$$$$$$@+++....",
".....+++######+@$$$$$$$+++......",
"......+++#####+@$$$$$@++........",
".......+++####+@$$$$+++.........",
".........++###+$$$@++...........",
"..........++##+$@+++............",
"...........+++++++..............",
".............++++..............."};
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/75558/showart_1273253.html |
|