Container Widgets
The EventBox
一些GTK widget没有用于显示用的X window,这些widget利用其父widget进行显示。由于没有window, 这些widget会在使用时存在问题。比如,这些widget不能接受event、如果他们的尺寸设置不合适,你也不能进行缩放,等等问题。EventBox 就是为这类widget解决这些相关的问题的。
EventBox不在屏幕上显示任何内容,它只负责为widget提供x window。
下面的例子显示了如何使用EventBox,例子的功能是,当放大窗口时,会有更多的文本内容出现,当点击文本内容时,程序会退出。
运行结果:
/*eventwidget.c*/
#include<stdio.h>
#include<gtk/gtk.h>
int main(int argc, char *argv)
{
GtkWidget *window;
GtkWidget *event_box;
GtkWidget *label;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Event Box");
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(exit), NULL);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
event_box = gtk_event_box_new();
gtk_container_add(GTK_CONTAINER(window), event_box);
gtk_widget_show(event_box);
label = gtk_label_new("Click here to quit, quit, quit, quit,quit");
gtk_container_add(GTK_CONTAINER(event_box), label);
gtk_widget_show(label);
gtk_widget_set_size_request(label, 110, 20);
gtk_widget_set_events(event_box, GDK_BUTTON_PRESS_MASK);
g_signal_connect(G_OBJECT(event_box), "button_press_event", G_CALLBACK(exit), NULL);
gtk_widget_realize(event_box);
gdk_window_set_cursor(event_box->window, gdk_cursor_new(GDK_HAND1));
gtk_widget_show(window);
gtk_main();
return 0;
}
编译命令:
gcc -Wall -g eventwidget.c -o eventwidget `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0`
The Alignment widget
Alignment widget的功能是,根据Alignment widget的尺寸放置widget在其window中。
Fixed Container
Fixed Container的功能是,可以将widget放在其窗口的固定位置,这个位置是相对与其窗口的左上角的。
下面的例子显示了Fixed Container的用法。
运行结果:
/*fixconta.c*/
#include<gtk/gtk.h>
gint x = 50;
gint y = 50;
static void move_button(GtkWidget *widget, GtkWidget *fixed)
{
x = (x + 30) % 300;
y = (y + 50) % 300;
gtk_fixed_move(GTK_FIXED(fixed), widget, x, y);
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *fixed;
GtkWidget *button;
gint i;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Fixed Container");
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed);
gtk_widget_show(fixed);
for(i = 1; i <= 3; i++)
{
button = gtk_button_new_with_label("Press me");
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(move_button), (gpointer)fixed);
gtk_fixed_put(GTK_FIXED(fixed), button, i*50, i*50);
gtk_widget_show(button);
}
gtk_widget_show(window);
gtk_main();
return 0;
}
编译命令:
gcc -Wall -g fixconta.c -o fixconta `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0`
Layout Container
Layout Container 与Fixed Container 类似,区别在于,Layout Container 实现了一个无限的scrolling area (无限意思是在2^32之间都行)。