本系列不准備對GTK+的各個組件分別介紹,這會讓人覺得很無趣,采用開發一個小軟件作為演示,該軟件的功能就是演示GTK+的控件應用,以達到學習目的。在上一篇的最后我給出了一段代碼來測試環境——顯示了一個空白的窗口,代碼如下:
#include <gtk/gtk.h> int main( int argc, char *argv[]) { GtkWidget *window; /*初始化整個GTK+程序,是每一個GTK+程序必不可少的部分*/ gtk_init(&argc, &argv); /*這里生成了一個窗口構件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的標題欄和邊框,同意用窗口管理器來進行管理*/ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /*開始顯示窗口*/ gtk_widget_show(window); gtk_main(); return 0; }
現在我們來給窗口做一些改進工作:
一、添加一個標題、設置默認大小以及顯示位置。
#include <gtk/gtk.h> int main( int argc, char *argv[]) { GtkWidget *window; /*初始化整個GTK+程序,是每一個GTK+程序必不可少的部分*/ gtk_init(&argc, &argv); /*這里生成了一個窗口構件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的標題欄和邊框,同意用窗口管理器來進行管理*/ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /*設置窗口標題*/ gtk_window_set_title(GTK_WINDOW(window), "一步一步學GTK+ DEMO"); /*設置窗口默認大小*/ gtk_window_set_default_size(GTK_WINDOW(window), 500, 400); /* * 設置窗口在顯示器中的位置為居中。 * GTK_WIN_POS_NONE :不固定 * GTK_WIN_POS_CENTER : 居中 * GTK_WIN_POS_MOUSE : 出現在鼠標位置 * GTK_WIN_POS_CENTER_ALWAYS : 窗口改變大小的時候仍然居中 */ gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); /*開始顯示窗口*/ gtk_widget_show(window); gtk_main(); return 0; }
約定:紅色部分為新增代碼,方便讀者更容易看到變化,運行結果如下:
二、設置應用程序的圖標
#include <gtk/gtk.h> /* @Description: 從一個圖片中獲取信息得到pixbuf @param: gchar filename */ GdkPixbuf *create_pixbuf(const gchar * filename) { GdkPixbuf *pixbuf; GError *error = NULL; /* * 函數gdk_pixbuf_new_from_file() 從一個圖片文件中加載圖象數據,從而生成一個新的 pixbuf, * 至於文件中包含圖象的格式,是由系統自動檢測的。如果該函數返回值是NULL 的話,程序就會出現錯誤。 */ pixbuf = gdk_pixbuf_new_from_file(filename, &error); if(!pixbuf) { fprintf(stderr, "%s\n", error->message); g_error_free(error); } return pixbuf; } int main( int argc, char *argv[]) { GtkWidget *window; /*初始化整個GTK+程序,是每一個GTK+程序必不可少的部分*/ gtk_init(&argc, &argv); /*這里生成了一個窗口構件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的標題欄和邊框,同意用窗口管理器來進行管理*/ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /*設置窗口標題*/ gtk_window_set_title(GTK_WINDOW(window), "一步一步學GTK+ DEMO"); /*設置窗口默認大小*/ gtk_window_set_default_size(GTK_WINDOW(window), 500, 400); /* * 設置窗口在顯示器中的位置為居中。 * GTK_WIN_POS_NONE :不固定 * GTK_WIN_POS_CENTER : 居中 * GTK_WIN_POS_MOUSE : 出現在鼠標位置 * GTK_WIN_POS_CENTER_ALWAYS : 窗口改變大小的時候仍然居中 */ gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); /*函數gtk_window_set_icon() 是為窗口設置圖標用的,函數create_pixbuf是我們自定義的,目的是從一個圖片中獲取信息得到pixbuf。*/ gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("./images/bear.png")); /*開始顯示窗口*/ gtk_widget_show(window); gtk_main(); return 0; }
三、當點擊關閉窗口(X)時,應該結束程序
在命令行下運行這個demo,點擊右上角的X時候,窗口雖然關閉了,但是程序還在運行,需要按ctrl+C(linux下 ctrl+D)來結束程序運行。我們希望點擊X的時候就結束程序的運行。我們必須要明確為這個例子程序連接一個關閉的信號(destroy signal),然后調用回調函數gtk_main_quit() 實現結束程序。這里涉及到事件和信號會在日后講到。
#include <gtk/gtk.h> /* @Description: 從一個圖片中獲取信息得到pixbuf @param: gchar filename */ GdkPixbuf *create_pixbuf(const gchar * filename) { GdkPixbuf *pixbuf; GError *error = NULL; /* * 函數gdk_pixbuf_new_from_file() 從一個圖片文件中加載圖象數據,從而生成一個新的 pixbuf, * 至於文件中包含圖象的格式,是由系統自動檢測的。如果該函數返回值是NULL 的話,程序就會出現錯誤。 */ pixbuf = gdk_pixbuf_new_from_file(filename, &error); if(!pixbuf) { fprintf(stderr, "%s\n", error->message); g_error_free(error); } return pixbuf; } int main( int argc, char *argv[]) { GtkWidget *window; /*初始化整個GTK+程序,是每一個GTK+程序必不可少的部分*/ gtk_init(&argc, &argv); /*這里生成了一個窗口構件——GtkWindow,GTK_WINDOW_TOPLEVEL包含窗口的標題欄和邊框,同意用窗口管理器來進行管理*/ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /*設置窗口標題*/ gtk_window_set_title(GTK_WINDOW(window), "一步一步學GTK+ DEMO"); /*設置窗口默認大小*/ gtk_window_set_default_size(GTK_WINDOW(window), 500, 400); /* * 設置窗口在顯示器中的位置為居中。 * GTK_WIN_POS_NONE :不固定 * GTK_WIN_POS_CENTER : 居中 * GTK_WIN_POS_MOUSE : 出現在鼠標位置 * GTK_WIN_POS_CENTER_ALWAYS : 窗口改變大小的時候仍然居中 */ gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); /*函數gtk_window_set_icon() 是為窗口設置圖標用的,函數create_pixbuf是我們自定義的,目的是從一個圖片中獲取信息得到pixbuf。*/ gtk_window_set_icon(GTK_WINDOW(window), create_pixbuf("./images/bear.png")); /***********************************以下是信號處理部分************************************/ /*關閉窗口時退出主循環*/ g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit), NULL); /***********************************以下是顯示控件部分************************************/ /*開始顯示窗口*/ gtk_widget_show(window); gtk_main(); return 0; }
關於移動窗口、改變窗口大小以及拖拽等情況會在下一篇中介紹。