GTK+ 2.0 教學-改進了的 Hello World

讓我們來看一下稍微改進了的 helloworld,它對回呼作了更好的示範。這也會將我們帶入下一個主題,封裝元件。

#include <gtk/gtk.h>

/* 我們新改進的回呼函式。傳遞到該函數的資料將列印到標準輸出(stdout)。*/
static void callback( GtkWidget *widget,
                      gpointer   data )
{
    g_print ("Hello again - %s was pressedn", (gchar *) data);
}

/* 另一個回呼函式 */
static gboolean delete_event( GtkWidget *widget,
                              GdkEvent  *event,
                              gpointer   data )
{
    gtk_main_quit ();
    return FALSE;
}

int main( int   argc,
          char *argv[] )
{
    /* GtkWidget 是元件的儲存型別 */
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *box1;

    /* 這個函式在所有的 GTK 程式都要呼叫。參數由命令令列中解析出來並且送到該程式中。*/
    gtk_init (&argc, &argv);

    /* 創建一個新視窗 */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    /* 這是一個新的呼叫,設置視窗標題為"Hello Buttons!" */
    gtk_window_set_title (GTK_WINDOW (window), "Hello Buttons!");

    /* 在這裡我們為 delete_event 設置了一個處理函式來立即退出 GTK。*/
    g_signal_connect (window, "delete-event",
		      G_CALLBACK (delete_event), NULL);

    /* 設置視窗邊框的寬度。 */
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);

    /* 我們創建了一個封裝盒。詳情參見「封裝」章節。 * 我們看不見封裝盒,它僅被作為排列元件的工具。*/
    box1 = gtk_hbox_new (FALSE, 0);

    /* 把封裝盒放入主視窗中。*/
    gtk_container_add (GTK_CONTAINER (window), box1);

    /* 創建一個標籤為 "Button 1" 的新按鈕。*/
    button = gtk_button_new_with_label ("Button 1");

    /* 當按鈕被按下時,我們呼叫 "callback" 函式,並將一個指向 "button 1" 的 * 指標作為它的參數。*/
    g_signal_connect (button, "clicked",
		      G_CALLBACK (callback), (gpointer) "button 1");

    /* 代替 gtk_container_add,我們把按鈕放入不可見的封裝盒,該封裝盒已經封 * 裝進窗口中了。*/
    gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);

    /* 總是記住這一步,它告訴 GTK 我們為這個按鈕做的準備工作已經完成了,現 * 在可以顯示它了。*/
    gtk_widget_show (button);

    /* 同樣創建第二個按鈕。*/
    button = gtk_button_new_with_label ("Button 2");

    /* 以不同的參數呼叫相同的回呼函式,用指向 "button 2" 的指標代替。*/
    g_signal_connect (button, "clicked",
		      G_CALLBACK (callback), (gpointer) "button 2");

    gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0);

    /* 顯示的順序並不重要,但我建議最後顯示視窗。這樣它們會同時顯示出來。*/
    gtk_widget_show (button);

    gtk_widget_show (box1);

    gtk_widget_show (window);

    /* 停在這裡等待事件發生。*/
    gtk_main ();

    return 0;
}

用和我們第一個範例相同的連結參數來編譯這個程式,你會發現這次程式不能退出,你不得不使用視窗管理員或命令列去殺死它。插入第三個”Quit”按鈕來退出程式對讀者來說是一個好的練習。你也可能想在讀下一章時用這個程式測試 gtk_box_pack_start() 的各種選項。試試改變視窗的大小,並觀察其行為。

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

1 則留言


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *