(二)、一步一步學GTK+之窗口

本系列不準備對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;
}

關於移動窗口、改變窗口大小以及拖拽等情況會在下一篇中介紹。

轉載於:https://www.cnblogs.com/ikodota/archive/2013/03/12/step_by_step_study_gtk_window.html