1. GtkFixed
GtkFixed是固定控件位置和大小的容器,代码示例如下:
然后调用gtk_label_new()函数创建一个label标签,调用gtk_container_add()函数将这个label控件添加到GtkAlignment容器中,而GtkAlignment这个容器最后还是要添加到window这个窗口容器中,否则是没办法正确显示的。
最后调用gtk_widget_show_all()函数来显示窗口。
3. GtkVBox
GtkVBox是垂直盒子容器,示例如下:
然后创建了5个label,然后是gtk_box_pack_start()函数,后三个参数分别表示expand、fill和padding,如果expand参数设置为FALSE,那么fill参数是无效的,相似的如果gtk_vbox_new()函数的第一个参数为TRUE,那么expand参数也是无效的。
4. GtkTable
GtkTable是表格类型的布局容器,示例如下:
参考:http://zetcode.com/gui/gtk2/gtklayoutmanagement/
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/