`

GTK中 ToolBar详细说明

 
阅读更多

工具栏(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

/* 这个函数连接到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);

上面的代码初始化工具栏构件。

/* 工具栏上第一项是按钮 */

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;

}



分享到:
评论

相关推荐

    GTK+2.0中文教程 html格式

    中文版说明 简介 从这里开始 用 GTK 来写 Hello World 编译 Hello World 程序 信号和回调函数的原理 事件 Hello World 详解 继续 数据类型 深入探索信号处理函数 改进了的 Hello World 组装构件 组装...

    gtk+2.0 tutorial

    教程的最后提到了一些未在文档中详细记录的控件,比如AccelLabel、OptionMenu、MenuItems等,以及如何设置控件属性。 通过这份教程,开发者能够掌握GTK+2.0的基本使用方法,并学会如何构建功能丰富的图形用户界面。...

    GTK+2.0 中文版(基于GNOME官方文档翻译)

    中文版说明 简介 从这里开始 用 GTK 来写 Hello World 编译 Hello World 程序 信号和回调函数的原理 事件 Hello World 详解 继续 数据类型 深入探索信号处理函数 改进了的 Hello World 组装构件...

    GTK+2.0图形界面编程示例

    在GTK+中,可以通过将图标添加到按钮中来实现这一功能。这里需要加载图标资源,并将其添加到按钮中。 ```c GtkWidget *win; GtkWidget *button; GtkWidget *image; gtk_init(&argc, &argv); win = gtk_window_new...

    gtk api api api

    - **基础类型**: 探讨 GTK+ 中的基本数据类型。 - **信号处理**: 深入了解如何在 GTK+ 中处理信号。 - **改进示例**: 对 Hello World 程序进行改进。 #### 三、组件篇 ##### 3.1 容器构件(Container Widgets) - **...

    GTK+2.0编程范例.rar

    GTK+2.0编程范例.pdf 是一个关于GTK+2.0框架的详细教程,它主要面向初学者,旨在帮助开发者掌握GTK+的基础知识,从而能够构建基于此库的图形用户界面(GUI)应用程序。GTK+是GNOME桌面环境的核心组件,广泛用于Linux...

    php gtk 手册

    《PHP GTK手册》是针对PHP开发图形用户界面(GUI)应用程序的重要参考资料,它详细阐述了如何利用PHP GTK库来创建丰富的桌面应用。PHP通常被用于Web开发,但通过GTK扩展,PHP可以跨越到桌面领域,提供与Python、Perl...

    python3+GTK+3.0的示例代码(包括GUI界面的控件示例,代码没有中文注释,英文不好的别下载)

    8. **菜单和工具栏(Menu and Toolbar)**:创建`Gtk.Menu`和`Gtk.Toolbar`,添加菜单项和工具按钮,并设置它们的关联操作。 9. **图像显示**:利用`Gtk.Image`控件加载并显示图像资源,可以是本地文件或网络资源。...

    GTK+ 1.2 Tutorial

    Toolbar Notebooks 11. CList Widget Creating a CList widget Modes of operation Working with titles Manipulating the list itself Adding rows to the list Setting text and pixmaps in the cells Storing ...

    GTK+ 图形化应用程序开发 学习笔记

    笔记可能还会涵盖GTK+的高级主题,如对话框(Dialog)、菜单(Menu)、工具栏(Toolbar)的创建,以及如何使用模型视图控制器(MVC)架构来组织代码。GTK+的数据模型(TreeModel)和列表视图(ListView)允许动态...

    整理的GTK+笔记

    初始化GTK+通常是在程序的主函数中调用`gtk_init(&argc, &argv)`完成的,这里的`argc`和`argv`是程序参数的传递。 #### 二、建立窗口 创建窗口主要通过`GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);...

    Perl.GTK.Reference.pdf

    Gtk.......................................................................................................................................................................................3 Gtk::...

    GTK初步入门

    2. **创建工具栏:** 可以使用 `gtk_toolbar_new()` 创建一个工具栏,然后添加按钮等控件到工具栏中。 #### GTK+布局管理 GTK+提供了多种布局管理器来帮助开发者组织界面元素。常用的布局管理器包括: 1. **Box...

    gtk英文版资料

    GTK+(GIMP Toolkit)是一款广泛应用于Linux环境中的开源图形用户界面工具包,以其丰富的功能、灵活的定制能力和跨平台特性而受到开发者们的青睐。本教程将深入剖析GTK+2.0的核心概念和实用技巧,尤其侧重于通过...

    LINUX应用程序使用GTK+ GNOME13

    本节将详细介绍如何在Linux应用程序中使用GTK+和GNOME的相关知识点。 1. **GnomeApp构件** GnomeApp是GTK+的一个扩展,它为开发者提供了更加便捷的方式来创建具有标准菜单和工具栏的主窗口。GnomeApp是基于GTK+的`...

    GTK+2.0.pdf linux图形编程

    - **GTK信号**:深入了解GTK+2.0中的信号机制。 - **核心构件**:介绍GTK+2.0中重要的核心构件,如`GtkWidget`、`GtkContainer`等。 通过以上内容的学习,开发者不仅可以掌握GTK+2.0的基本使用方法,还能深入了解其...

    Gtk+2.0教程(Linux下的界面)

    Gtk+(GIMP Toolkit)是一款跨平台的GUI库,广泛应用于Linux系统中,为开发者提供了丰富的工具集来构建用户界面。本教程旨在介绍如何使用Gtk+2.0进行图形用户界面的设计与开发,适合初学者以及有一定基础的开发者...

Global site tag (gtag.js) - Google Analytics