分享免费的编程资源和教程

网站首页 > 技术教程 正文

用GTK+来创建一个带界面的C语言程序4—给窗口添加多个控件

goqiw 2024-09-29 16:35:26 技术教程 37 ℃ 0 评论

为窗口添加一个按钮已经知道怎么做了,但是一个窗口程序不可能只有一个按钮控件,当继续向窗口中添加按钮时会发现程序出错了,这是因为一个窗口只能容纳一个控件。而要容纳多个控件那又该怎么做呢?我们知道容器分为两种,能容纳多个控件的容器和只能容纳一个控件的容器,窗口就属于只能容纳一个控件的容器,那么就可以这么做,先把控件放到能容纳多个控件的容器中,然后在把这个容器放到窗口容器中,不就能达到放多个控件的目的了吗。那么就一起来了解一下能容纳多个控件的容器吧。

GTK+中能容纳多个控件的容器有很多,例如有盒状容器(GtkBox)、格状容器(GtkTable)、按钮盒(GtkButtonBox)、分割面板(GtkPanel)、固定布局(GtkFixed)、工具栏(GtkToolbar)等,其中最常用的就是盒状和格状布局。那么就先来认识一下盒状容器吧。

盒状容器顾名思义就是一种按照一定顺序和方向紧密排列多个控件的容器。然后在盒状容器的基础上又可以分为纵向盒状容器(GtkVBox)和横向盒状容器(GtkHBox),两者处了创建和排列控件的方式不一样之外,其使用方式是一样的,没有差别。我们就以添加多个按钮为例。

/*用盒状容器排列按钮*/

#include <gtk/gtk.h>


int main(int argc, char * argv[])

{

GtkWidget * window;

GtkWidget * vbox;

GtkWidget * hbox;

GtkWidget * button;

gchar * title = "盒状容器";


gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);

gtk_window_set_title(GTK_WINDOW(window), title);

gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

gtk_container_set_border_width(GTK_CONTAINER(window), 20);

//创建一个垂直盒子容器

vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);

//创建一个水平盒子容器

hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);

button = gtk_button_new_with_label("按钮一");

//将按钮控件加入到盒子容器中

gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 3);

button = gtk_button_new_with_label("按钮二");

gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 3);

gtk_container_add(GTK_CONTAINER(vbox), hbox);

button = gtk_button_new_with_label("按钮三");

gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 3);

gtk_container_add(GTK_CONTAINER(window), vbox);

gtk_widget_show_all(window);

gtk_main();

return FALSE;

}

编辑Makefile文件,并在终端执行make命令开始编译,执行./GtkBox即可运行此程序,运行结果:

代码分析:

1. 盒状容器

这段代码中我们定义了两个盒状容器的控件指针vbox, hbox, 在处理好窗口内容设置后开始创建盒状容器,创建盒状容器的函数为gtk_box_new(),其函数原型为:

int gtk_box_new(int orientation, int spacing)

orentation:盒子的方向,有两个可选值:GTK_ORIENTATION_HORIZONTAL(水平横向)、GTK_ORIENTATION_VERTICAL(垂直纵向)

spacing:容器中控件之间的间隙,通常为0,单位像素。

创建完盒子容器后,就可以向其中添加其他控件了。向盒状容器中添加控件可以使用我们以前用过的gtk_container_add函数,但是这样只能加一个控件。还有就是本例中的方法:gtk_box_pack_*系列函数向盒状容器中添加并排列控件,这样的函数一共有4个,分别是:gtk_box_pack_start、gtk_box_pack_end、gtk_box_pack_start_defaults、gtk_box_pack_end_defaults。

gtk_box_pack_start、gtk_box_pack_end分别表示按顺序从前到后依次排列和从后到前依次排列。就拿gtk_box_pack_start这个函数举例,其函数原型为:void gtk_box_pack_start(int box, int child,boolean expand, boolean fill, int padding)

box:要容纳控件的容器对象

child:被容纳控件的指针

expand:是否扩展,一般为FALSE

fill:是否添加

padding:与前一个控件的间隔

如果不考虑控件间的间隔、是否扩展和是否添充的话还可以使用函数 gtk_box_pack_start_defaults 和 gtk_box_pack_end_defaults。这两函数只有两个参数,即容器对象指针和被容纳对象指针,即gtk_box_pack_start_defaults(GTK_BOX(box),button);即可。

注意,由于我们创建的是盒状容器Box,而这些函数操作对象是Box,所以一定不要忘了用 GTK_BOX 宏转换一下,否则编译时会出警告信息,程序也会变得不稳定。

2. 创建按钮

这段代码中只定义了一个控件指针 button,我们这里却创建了 4 个按钮,因为每个按钮创建之后就不再对它操作了(即不再明确使用这个指针),所以下一个按钮创建时还会为这个指针赋值,这在 GTK+中是允许的。这样做有利有弊,利在于只声明了一个指针变量,代码行数减少了;弊则是如果分别对这几个按钮操作必需再声明不同名称的变量。

3. 显示所有控件

前面代码中每一个控件都要用函数 gtk_widget_show 来显示,如果还用这个函数来显示控件的话,那么我们的代码还得增加 6 行,这使得代码冗长且不便于维护。这里采用了gtk_widget_show_all 函数,它的参数是一个容器控件的指针,它取代了那 6 行代码(甚至更多行代码),显示容器中所有控件。这样一来使代码更简洁明了,一看就懂。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表