gtk布局

1. GtkFixed
GtkFixed是固定控件位置和大小的容器,代码示例如下:
#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *fixed;

	GtkWidget *btn1;
	GtkWidget *btn2;
	GtkWidget *btn3;

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window), "GtkFixed");
	gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

	fixed = gtk_fixed_new();
	gtk_container_add(GTK_CONTAINER(window), fixed);

	btn1 = gtk_button_new_with_label("Button1");
	gtk_fixed_put(GTK_FIXED(fixed), btn1, 150, 50);
	gtk_widget_set_size_request(btn1, 80, 30);

	btn2 = gtk_button_new_with_label("Button2");
	gtk_fixed_put(GTK_FIXED(fixed), btn2, 15, 15);
	gtk_widget_set_size_request(btn2, 80, 30);

	btn3 = gtk_button_new_with_label("Button3");
	gtk_fixed_put(GTK_FIXED(fixed), btn3, 100, 100);
	gtk_widget_set_size_request(btn3, 80, 30);

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

	gtk_widget_show_all(window);

	gtk_main();

	return 0;
}

gtk_fixed_new()函数用于创建一个GtkFixed容器。

gtk_container_add()函数将一个名为fixed的容器添加到window这个窗口容器之上。

接下来是使用gtk_fixed_put()函数将按钮控件添加到fixed容器之上,后面两个参数是控件的坐标,x = 150, y = 50。

然后是设置控件的大小。

效果如下:



2. GtkAlignment
GtkAlignment用于控制控件的对齐,同时它还可以管理缩放,代码示例如下:

#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *align;

	GtkWidget *lbl;

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window), "GtkAlignment");
	gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_container_set_border_width(GTK_CONTAINER(window), 5);

	align = gtk_alignment_new(0, 1, 0, 0);
	lbl = gtk_label_new("bottom-left");

	gtk_container_add(GTK_CONTAINER(align), lbl);
	gtk_container_add(GTK_CONTAINER(window), align);

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

	gtk_widget_show_all(window);

	gtk_main();

	return 0;
}
gtk_alignment_new()函数我们之前都已经见过了,用于新建一个GtkAlignment容器。第一个参数是水平对齐,0左对齐,1是右对齐。第二个参数是垂直对齐,0是上对齐,1是下对齐。第3个参数和第4个参数分别对应水平缩放和垂直缩放,也就是说控件会随着窗口大小改变而改变。

然后调用gtk_label_new()函数创建一个label标签,调用gtk_container_add()函数将这个label控件添加到GtkAlignment容器中,而GtkAlignment这个容器最后还是要添加到window这个窗口容器中,否则是没办法正确显示的。

最后调用gtk_widget_show_all()函数来显示窗口。


3. GtkVBox
GtkVBox是垂直盒子容器,示例如下:
#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *vbox;

	GtkWidget *settings;
	GtkWidget *accounts;
	GtkWidget *loans;
	GtkWidget *cash;
	GtkWidget *debts;

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_window_set_default_size(GTK_WINDOW(window), 230, 250);
	gtk_window_set_title(GTK_WINDOW(window), "GtkVBox");
	gtk_container_set_border_width(GTK_CONTAINER(window), 5);

	vbox = gtk_vbox_new(TRUE, 1);
	gtk_container_add(GTK_CONTAINER(window), vbox);

	settings = gtk_button_new_with_label("Settings");
	accounts = gtk_button_new_with_label("Account");
	loans = gtk_button_new_with_label("Loans");
	cash = gtk_button_new_with_label("Cash");
	debts = gtk_button_new_with_label("Debts");

	gtk_box_pack_start(GTK_BOX(vbox), settings, TRUE, TRUE, 0);
	gtk_box_pack_start(GTK_BOX(vbox), accounts, TRUE, TRUE, 0);
	gtk_box_pack_start(GTK_BOX(vbox), loans, TRUE, TRUE, 0);
	gtk_box_pack_start(GTK_BOX(vbox), cash, TRUE, TRUE, 0);
	gtk_box_pack_start(GTK_BOX(vbox), debts, TRUE, TRUE, 0);

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

	gtk_widget_show_all(window);

	gtk_main();

	return 0;
}
gtk_vbox_new()函数用于创建一个vbox容器,其中第一个参数为TRUE表示所有的控件具有相同大小,而第二个参数为它们之间的间隔,这里设置为1个像素。

然后创建了5个label,然后是gtk_box_pack_start()函数,后三个参数分别表示expand、fill和padding,如果expand参数设置为FALSE,那么fill参数是无效的,相似的如果gtk_vbox_new()函数的第一个参数为TRUE,那么expand参数也是无效的。


4. GtkTable
GtkTable是表格类型的布局容器,示例如下:
#include <gtk/gtk.h>

int main(int argc, char *argv[])
{
	GtkWidget *window;
	GtkWidget *table;
	GtkWidget *button;

	gchar *values[16] = {
		"7", "8", "9", "/",
		"4", "5", "6", "*",
		"1", "2", "3", "-",
		"0", ".", "=", "+"};

	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_window_set_default_size(GTK_WINDOW(window), 250, 180);
	gtk_window_set_title(GTK_WINDOW(window), "GtkTable");

	gtk_container_set_border_width(GTK_CONTAINER(window), 5);

	table = gtk_table_new(4, 4, TRUE);
	gtk_table_set_row_spacings(GTK_TABLE(table), 2);
	gtk_table_set_col_spacings(GTK_TABLE(table), 2);

	int i = 0;
	int j = 0;
	int pos = 0;

	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) {
			button = gtk_button_new_with_label(values[pos]);
			gtk_table_attach_defaults(GTK_TABLE(table), button, j, j+1, i, i+1);
			pos++;
		}
	}

	gtk_container_add(GTK_CONTAINER(window), table);

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

	gtk_widget_show_all(window);

	gtk_main();

	return 0;
}
使用gtk_table_new()函数新建了一个4*4的表格容器,然后使用gtk_table_attach_defaults()函数将控件添加到表格容器中。


参考:http://zetcode.com/gui/gtk2/gtklayoutmanagement/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值