- #include <gtk/gtk.h>
- #include <stdio.h>
- GtkWidget *togglebutton;
- GtkWidget *checkbutton;
- GtkWidget *radiobutton1, *radiobutton2;
- void window_quit(GtkWidget *window, gpointer usr_data)
- {
- gtk_main_quit();
- }
- void add_widget_with_label(GtkContainer *container, const gchar *caption,
- GtkWidget *widget)
- {
- GtkWidget *label = gtk_label_new(caption);
- GtkWidget *hbox = gtk_hbox_new(TRUE, 4);
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 4);
- gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 4);
- gtk_container_add(container, hbox);
- }
- void print_active(GtkToggleButton *button, const gchar *button_name)
- {
- gboolean active = gtk_toggle_button_get_active(button);
- printf("%s is %s\n", button_name, active?"active":"not active");
- }
- void button_clicked(GtkWidget *button, gpointer usr_data)
- {
- print_active(GTK_TOGGLE_BUTTON(togglebutton), "Togglebutton");
- print_active(GTK_TOGGLE_BUTTON(checkbutton), "Checkbutton");
- print_active(GTK_TOGGLE_BUTTON(radiobutton1), "Radiobutton1");
- print_active(GTK_TOGGLE_BUTTON(radiobutton2), "Radiobutton2");
- printf("\n");
- }
- gint main(gint argc, gchar *argv[])
- {
- GtkWidget *window;
- GtkWidget *button;
- GtkWidget *vbox;
- gtk_init(&argc, &argv);
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
- gtk_window_set_title(GTK_WINDOW(window), "button");
- g_signal_connect(GTK_OBJECT(window), "destroy",
- GTK_SIGNAL_FUNC(window_quit), NULL);
- button = gtk_button_new_with_label("OK");
- togglebutton = gtk_toggle_button_new_with_label("Toggle");
- checkbutton = gtk_check_button_new();
- radiobutton1 = gtk_radio_button_new(NULL);
- radiobutton2 = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(radiobutton1));
- vbox = gtk_vbox_new(TRUE, 4);
- add_widget_with_label(GTK_CONTAINER(vbox), "Toggle button:",
- togglebutton);
- add_widget_with_label(GTK_CONTAINER(vbox), "Check button:",
- checkbutton);
- add_widget_with_label(GTK_CONTAINER(vbox), "Radio button1:",
- radiobutton1);
- add_widget_with_label(GTK_CONTAINER(vbox), "Radio button2:",
- radiobutton2);
- add_widget_with_label(GTK_CONTAINER(vbox), "Button:",
- button);
- g_signal_connect(GTK_OBJECT(button), "clicked",
- GTK_SIGNAL_FUNC(button_clicked), NULL);
- gtk_container_add(GTK_CONTAINER(window), vbox);
- gtk_widget_show_all(window);
- gtk_main();
- return 0;
- }
- 1.一个空白的GtkWindow
- (1)输入代码,保存为gtk1.c:
- #include <gtk/gtk.h>
- int main(int argc, char *argv[])
- {
- GtkWidget *window;
- gtk_init(&argc, &argv);
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_widget_show(window);
- gtk_main();
- return 0;
- }
- (2)编译运行gtk1.c
- $ gcc gtk1.c -o gtk1 `pkg-config --cflags --libs gtk+-2.0`
- $ ./gtk1
- 可以看到一个窗口弹出来。
- 2.解析
- #include <gtk/gtk.h>包含必需的GTK+库和相关库(包括GLib)的头文件。
- GtkWidget *window; 声明窗口为一个指向GtkWidget的指针。
- 为了初始化GTK+库,你必须调用gtk_init函数,将命令行参数argc和argv传递给它。这给了GTK+一个
- 机会来解析它需要知道的任何命令行参数。注意:必须在调用任何GTK+函数之前对其进行这样的初始化。
- 核心代码是对gtk_window_new的调用,函数原型:
- GtkWidget* gtk_window_new(GtkWindowType type);
- 参数type根据窗口的目的可取下面两个值之一。
- GTK_WINDOW_TOPLEVEL: 一个标准的有框架窗口。
- GTK_WINDOW_POPUP: 一个适用于对话框的无框架窗口。
- 几乎可以总使用GTK_WINDOW_TOPLEVEL,因为还有更方便的创建对话框的方法。
- gtk_window_new调用在内存中建立窗口,使得在将窗口实际显示在屏幕之前,有机会在它的里面放置构件,调整它的大小,改变窗口的标题等。要实际显示窗口,需要调用gtk_window_show:
- gtk_window_show(window);
- 该函数需要一个GtkWidget指针,因此只需把窗口的引用传给它即可。
- 最后调用的函数是gtk_main。这个关键函数通过把控制权交给GTK+来启动交互过程,并且一直运行,直到调用gtk_main_quit才返回。gtk1.c并未调用gtk_main_quit,因此,即使窗口被关闭,程序也不会停止。点击关闭图标,可以看到并没有返回命令提示符。