- #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,因此,即使窗口被關閉,程序也不會停止。點擊關閉圖標,可以看到並沒有返回命令提示符。