工具栏(Toolbars)常用来将一些元件分组,这样能够简化定制它们的外观和布局。典型情况下工具栏由带图示和标签以及工具提示的按钮组成,不过,其它元件也可以放在工具栏里面。最后,各工具栏组件可以水平或垂直排列,还可以显示图示或标签,或者两者都显示。
用下面的函式创建一个工具栏(可能有些人已经猜到了):
GtkWidget *gtk_toolbar_new( void ); |
创建工具栏以后,可以向其中追加、前插和插入工具栏项(这里意指简单文字字串)或元素(这里意指任何元件类型)。要想描述一个工具栏上的物件,需要一个标签文字、一个工具提示文字、一个私有工具提示文字、一个图示和一个回呼函式。例如,要前插或追加一个按钮,应该使用下面的函式:
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(),除上面函式中要指定的参数以外,还要指定插入物件的位置,形式如下:
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 ); |
要简单地在工具栏项之间添加空白区域,可以使用下面的函式:
void gtk_toolbar_append_space( GtkToolbar *toolbar ); void gtk_toolbar_prepend_space( GtkToolbar *toolbar ); void gtk_toolbar_insert_space( GtkToolbar *toolbar, gint position ); |
如果需要,工具栏的放置方向和它的式样可以在不工作时用下面的函式设置:
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参数取GTK_ORIENTATION_HORIZONTAL或GTK_ORIENTATION_VERTICAL。style参数用于设置工具栏项的外观,可以取GTK_TOOLBAR_ICONS,GTK_TOOLBAR_TEXT或GTK_TOOLBAR_BOTH。
要想了解工具栏还能做什么,看一看下面的程式(在程式码之间我们插入了一些解释):
#include <gtk/gtk.h> /* 这个函式连接到Close按钮或者从视窗管理器关闭视窗的事件上 */ gint delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_main_quit (); return FALSE; } |
上面的程式码和其它的 GTK 应用程式差别不大,有一点不同的是:我们包含了一个漂亮的 XPM 图片,用作所有按钮的图示。
GtkWidget* close_button; /* 这个按钮将引发一个信号以 * 关闭应用程式 */ GtkWidget* tooltips_button; /* 启用/停用工具提示 */ GtkWidget* text_button, * icon_button, * both_button; /* 切换工具栏风格的单选按钮 */ GtkWidget* entry; /* 一个文字输入元件,用于说明任何元件都可以封装到 * 工具栏里 */ |
事实上,不是上面所有的元件都是必须的,我把它们放在一起,是为了让事情更清晰。
/* 很简单...当按钮进行状态切换时,我们检查哪一个按钮是活动的,依此设置工具栏的式样 * 注意,工具栏是作为用户资料传递到回呼函式的! */ 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); } /* 更简单,检查给定开关按钮的状态,依此启用或停用工具提示 */ void toggle_event (GtkWidget *widget, gpointer data) { gtk_toolbar_set_tooltips (GTK_TOOLBAR (data), GTK_TOGGLE_BUTTON (widget)->active ); } |
上面只是当工具栏上的一个按钮被按下时要呼叫的两个回呼函式。你应该已经熟悉了这些东西,如果你已经使用过开关按钮(以及单选按钮)。
int main (int argc, char *argv[]) { /* 下面是主视窗(一个对话框)和一个把手盒(handlebox) */ GtkWidget* dialog; GtkWidget* handlebox; /* 好了,我们需要一个工具栏,一个带遮罩(mask)的图示(所有的按钮共用一个遮罩)以及 * 一个放图示的图示元件(但我们会为每个按钮创建一个分割元件) */ GtkWidget * toolbar; GtkWidget * iconw; /* 这个在所有的 GTK 程式中都被呼叫。 */ gtk_init (&argc, &argv); /* 用给定的标题和尺寸创建一个新视窗 */ 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; /* 在关闭视窗时退出 */ g_signal_connect (G_OBJECT (dialog), "delete_event", G_CALLBACK (delete_event), NULL); /* 需要实现的视窗,因为我们要在它的内容中为工具栏设置图片 */ gtk_widget_realize (dialog); /* 我们将工具栏放在一个把手元件(handle box)上, * 这样它可以从主视窗上移开 */ handlebox = gtk_handle_box_new (); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), handlebox, FALSE, FALSE, 5); |
上面的程式码和任何其它Gtk应用程示都差不多。它们进行 GTK 初始化,创建主视窗等。唯一需要解释的是:一个把手盒(a handle box)。把手盒只是一个可以在其中封装元件的盒子。它和普通盒子的区别在于它能从一个父视窗移开(事实上,把手盒保留在父视窗上,但是它缩小为一个非常小的矩形,同时它的所有内容重新放在一个新的可自由移动的浮动视窗上)。拥有一个可浮动工具栏给人感觉非常好,所以这两种元件经常同时使用。
/* 工具栏设置为水平的,同时带有图示和文字 * 在每个项之间有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); |
上面的程式码初始化工具栏元件。
/* 工具栏上第一项是<close>按钮 */ iconw = gtk_image_new_from_file ("gtk.xpm"); /* 图示元件 */ close_button = gtk_toolbar_append_item (GTK_TOOLBAR (toolbar), /* 工具栏 */ "Close", /* 按钮标签 */ "Closes this app", /* 按钮的工具提示 */ "Private", /* 工具提示的私有信息 */ iconw, /* 图示元件 */ GTK_SIGNAL_FUNC (delete_event), /* 一个信号 */ NULL); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); /* 工具栏项后的空白 */ |
在上面的程式码中,可以看到最简单的情况:在工具栏上增加一个按钮。在追加一个新的工具栏项前,必须构造一个图片(image)元件用作该项的图示,这个步骤我们要对每一个工具栏项重复一次。在工具栏项之间还要增加间隔空间,这样后面的工具栏项就不会一个接一个紧挨着。可以看到, gtk_toolbar_append_item()返回一个指向新创建的按钮元件的指标,所以我们可以用正常的方式使用它。
/* 现在,我们创建单选按钮组... */ iconw = gtk_image_new_from_file ("gtk.xpm"); icon_button = gtk_toolbar_append_element ( GTK_TOOLBAR (toolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON, /* 元素类型 */ NULL, /* 指向元件的指标 */ "Icon", /* 标签 */ "Only icons in toolbar", /* 工具提示 */ "Private", /* 工具提示的私有字串 */ iconw, /* 图示 */ GTK_SIGNAL_FUNC (radio_event), /* 信号 */ toolbar); /* 信号传递的资料 */ gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); |
这里我们开始创建一个单选按钮组。用 gtk_toolbar_append_element 就行了。事实上,使用这个函式,我们能够添加简单的工具栏项或空白间隔(类型为GTK_TOOLBAR_CHILD_SPACE或GTK_TOOLBAR_CHILD_BUTTON)。在上面的范例中,我们先创建了一个单选按钮组。要为这个组创建其它单选按钮,需要一个指向前一个按钮的指标,这样按钮的清单可以很容易组织起来(看在本文件前面部分的单选按钮节)。
/* 后面的单选按钮引用前面创建的 */ 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); |
最后,我们必须手工设置其中一个按钮的状态(否则它们全部处于活动状态,并阻止我们在它们之间做出选择)。
/* 下面只是一个简单的开关按钮 */ 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); |
开关按钮的创建方法就很明显了(如果你已经知道怎么创建单选按钮了)。
/* 要将一个元件封装到工具栏上,只需创建它,然后将它追 * 加到工具栏上,同时设置合适的工具提示 */ entry = gtk_entry_new (); gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), entry, "This is just an entry", "Private"); /* 因为它不是工具栏自己创建的,所以我们还需要显示它 */ gtk_widget_show (entry); |
可以看到,将任何元件添加到工具栏上都是非常简单的。唯一要记住的是,这个元件必须手动显示(与此相反,工具栏自己创建的工具栏项随工具栏一起显示)。
/* 好了,现在可以显示所有的东西了 */ gtk_widget_show (toolbar); gtk_widget_show (handlebox); gtk_widget_show (dialog); /* 进入主循环,等待用户的操作 */ gtk_main (); return 0; } |
这样,我们就到了工具栏教学的末尾。当然,还需要一个漂亮的XPM图示。下面就是:
/* XPM */ static char * gtk_xpm[] = { "32 39 5 1", ". c none", "+ c black", "@ c #3070E0", "# c #F05050", "$ c #35E035", "................+...............", "..............+++++.............", "............+++++@@++...........", "..........+++++@@@@@@++.........", "........++++@@@@@@@@@@++........", "......++++@@++++++++@@@++.......", ".....+++@@@+++++++++++@@@++.....", "...+++@@@@+++@@@@@@++++@@@@+....", "..+++@@@@+++@@@@@@@@+++@@@@@++..", ".++@@@@@@+++@@@@@@@@@@@@@@@@@@++", ".+#+@@@@@@++@@@@+++@@@@@@@@@@@@+", ".+##++@@@@+++@@@+++++@@@@@@@@$@.", ".+###++@@@@+++@@@+++@@@@@++$$$@.", ".+####+++@@@+++++++@@@@@+@$$$$@.", ".+#####+++@@@@+++@@@@++@$$$$$$+.", ".+######++++@@@@@@@++@$$$$$$$$+.", ".+#######+##+@@@@+++$$$$$$@@$$+.", ".+###+++##+##+@@++@$$$$$$++$$$+.", ".+###++++##+##+@@$$$$$$$@+@$$@+.", ".+###++++++#+++@$$@+@$$@++$$$@+.", ".+####+++++++#++$$@+@$$++$$$$+..", ".++####++++++#++$$@+@$++@$$$$+..", ".+#####+++++##++$$++@+++$$$$$+..", ".++####+++##+#++$$+++++@$$$$$+..", ".++####+++####++$$++++++@$$$@+..", ".+#####++#####++$$+++@++++@$@+..", ".+#####++#####++$$++@$$@+++$@@..", ".++####++#####++$$++$$$$$+@$@++.", ".++####++#####++$$++$$$$$$$$+++.", ".+++####+#####++$$++$$$$$$$@+++.", "..+++#########+@$$+@$$$$$$+++...", "...+++########+@$$$$$$$$@+++....", ".....+++######+@$$$$$$$+++......", "......+++#####+@$$$$$@++........", ".......+++####+@$$$$+++.........", ".........++###+$$$@++...........", "..........++##+$@+++............", "...........+++++++..............", ".............++++..............."}; |
2 則留言
Comments are closed.