GTK+ 2.0 教學-封裝示範程式

/* example-start packbox packbox.c */

#include <stdio.h>
#include <stdlib.h>
#include "gtk/gtk.h"

static gboolean delete_event( GtkWidget *widget,
                              GdkEvent  *event,
                              gpointer   data )
{
    gtk_main_quit ();
    return FALSE;
}

/* 生成一個填滿按鈕-標籤的橫向盒。我們將感興趣的參數傳遞進了這個函式。  
 * 我們不顯示這個盒,但顯示它內部的所有東西。 */
static GtkWidget *make_box( gboolean homogeneous,
                            gint     spacing,
                            gboolean expand,
                            gboolean fill,
                            guint    padding ) 
{
    GtkWidget *box;
    GtkWidget *button;
    char padstr[80];

    /* 以合適的 homogeneous 和 spacing 設定創建一個新的橫向盒 */
    box = gtk_hbox_new (homogeneous, spacing);

    /* 以合適的設定創建一系列的按鈕 */
    button = gtk_button_new_with_label ("gtk_box_pack");
    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
    gtk_widget_show (button);

    button = gtk_button_new_with_label ("(box,");
    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
    gtk_widget_show (button);

    button = gtk_button_new_with_label ("button,");
    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
    gtk_widget_show (button);

    /* 根據 expand 的值創建一個帶標籤的按鈕 */
    if (expand == TRUE)
	    button = gtk_button_new_with_label ("TRUE,");
    else
	    button = gtk_button_new_with_label ("FALSE,");

    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
    gtk_widget_show (button);

    /* 這個和上面根據 "expand" 創建按鈕一樣,不過用了簡化的形式。 */
    button = gtk_button_new_with_label (fill ? "TRUE," : "FALSE,");
    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
    gtk_widget_show (button);

    sprintf (padstr, "%d);", padding);

    button = gtk_button_new_with_label (padstr);
    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);
    gtk_widget_show (button);

    return box;
}

int main( int   argc,
          char *argv[]) 
{
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *box1;
    GtkWidget *box2;
    GtkWidget *separator;
    GtkWidget *label;
    GtkWidget *quitbox;
    int which;

    /* 初始化,不要忘記這個!:) */
    gtk_init (&argc, &argv);

    if (argc != 2) {
	fprintf (stderr, "usage: packbox num, where num is 1, 2, or 3.n");
	/* 這個在對 GTK 進行收尾處理後以退出狀態為 1 退出。 */
	exit (1);
    }

    which = atoi (argv[1]);

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

   /* 你應該總是記住連接 delete_event 信號到主視窗。這對適當的直覺行為很重要 */
    g_signal_connect (window, "delete-event",
		      G_CALLBACK (delete_event), NULL);
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);

    /* 我們創建一個縱向盒(vbox)把橫向盒封裝進來。
     * 這使我們可以將填滿按鈕的橫向盒一個個堆疊到這個縱向盒裡。 */
    box1 = gtk_vbox_new (FALSE, 0);

    /* 顯示哪個範例。這些對應於上面的圖片。 */
    switch (which) {
    case 1:
	/* 創建一個新標籤。 */
	label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");

	/* 使標籤靠左排列。我們將在元件屬性部分討論這個函式和其它的函式。 */
	gtk_misc_set_alignment (GTK_MISC (label), 0, 0);

	/* 將標籤封裝到縱向盒(vbox box1)裡。記住加到縱向盒裡的   
         * 元件將依次一個放在另一個上面地封裝。 */
	gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);

	/* 顯示標籤 */
	gtk_widget_show (label);

	/* 呼叫我們產生盒的函式 - homogeneous = FALSE, spacing = 0,   
         * expand = FALSE, fill = FALSE, padding = 0 */
	box2 = make_box (FALSE, 0, FALSE, FALSE, 0);
	gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
	gtk_widget_show (box2);

	/* 呼叫我們產生盒的函式 - homogeneous = FALSE, spacing = 0,   
         * expand = TRUE, fill = FALSE, padding = 0 */
	box2 = make_box (FALSE, 0, TRUE, FALSE, 0);
	gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
	gtk_widget_show (box2);

	/* 參數是: homogeneous, spacing, expand, fill, padding */
	box2 = make_box (FALSE, 0, TRUE, TRUE, 0);
	gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
	gtk_widget_show (box2);

	/* 創建一個分隔線,以後我們會更詳細地學習這些,但它們確實很簡單。 */
	separator = gtk_hseparator_new ();

        /* 封裝分隔線到縱向盒。記住這些元件每個都被封裝進
           了一個縱向盒,所以它們被垂直地堆疊。 */
	gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
	gtk_widget_show (separator);

	/* 創建另一個新標籤,並顯示它。 */
	label = gtk_label_new ("gtk_hbox_new (TRUE, 0);");
	gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
	gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
	gtk_widget_show (label);

	/* 參數是: homogeneous, spacing, expand, fill, padding */
	box2 = make_box (TRUE, 0, TRUE, FALSE, 0);
	gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
	gtk_widget_show (box2);

	/* 參數是: homogeneous, spacing, expand, fill, padding */
	box2 = make_box (TRUE, 0, TRUE, TRUE, 0);
	gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
	gtk_widget_show (box2);

	/* 另一個新分隔線。 */
	separator = gtk_hseparator_new ();
	/* gtk_box_pack_start的最後三個參數是:expand, fill, padding. */
	gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
	gtk_widget_show (separator);

	break;

    case 2:

	/* 創建一個新標籤,記住 box1 是一個縱向盒,它在 main() 前面部分創建 */
	label = gtk_label_new ("gtk_hbox_new (FALSE, 10);");
	gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
	gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
	gtk_widget_show (label);

	/* 參數是: homogeneous, spacing, expand, fill, padding */
	box2 = make_box (FALSE, 10, TRUE, FALSE, 0);
	gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
	gtk_widget_show (box2);

	/* 參數是: homogeneous, spacing, expand, fill, padding */
	box2 = make_box (FALSE, 10, TRUE, TRUE, 0);
	gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
	gtk_widget_show (box2);

	separator = gtk_hseparator_new ();
	 /* gtk_box_pack_start的最後三個參數是:expand, fill, padding. */
	gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
	gtk_widget_show (separator);

	label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");
	gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
	gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
	gtk_widget_show (label);

	/* 參數是: homogeneous, spacing, expand, fill, padding */
	box2 = make_box (FALSE, 0, TRUE, FALSE, 10);
	gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
	gtk_widget_show (box2);

	/* 參數是: homogeneous, spacing, expand, fill, padding */
	box2 = make_box (FALSE, 0, TRUE, TRUE, 10);
	gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
	gtk_widget_show (box2);

	separator = gtk_hseparator_new ();
	/* gtk_box_pack_start的最後三個參數是: expand, fill, padding。 */
	gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
	gtk_widget_show (separator);
	break;

    case 3:

        /* 這個範例了用 gtk_box_pack_end() 來右對齊元   
         * 件的能力。首先,我們像前面一樣創建一個新盒。 */
	box2 = make_box (FALSE, 0, FALSE, FALSE, 0);

	/* 創建將放在末端的標籤。 */
	label = gtk_label_new ("end");
	 /* 用 gtk_box_pack_end()封裝它,這樣它被放到   
          * 在make_box()呼叫裡創建的橫向盒的右端。 */
	gtk_box_pack_end (GTK_BOX (box2), label, FALSE, FALSE, 0);
	/* 顯示標籤。 */
	gtk_widget_show (label);

	/* 將 box2 封裝進 box1 (vbox記得嗎? :) */
	gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
	gtk_widget_show (box2);

	/* 放在底部的分隔線。 */
	separator = gtk_hseparator_new ();
	/* 這個明確地設置分隔線的寬度為400像素點和5像素點高。這樣我們創建   
         * 的橫向盒也將為400像素點寬,並且"end"標籤將和橫向盒裡其它的標籤   
         * 分開。否則,橫向盒裡的所有元件將儘量緊密地封裝在一起。 */
	gtk_widget_set_size_request (separator, 400, 5);
	/* 將分隔線封裝到在main()前面部分創建的縱向盒(box1)裡。 */
	gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
	gtk_widget_show (separator);    
    }

    /* 創建另一個新的橫向盒.. 記住我們要用多少就能用多少! */
    quitbox = gtk_hbox_new (FALSE, 0);

   /* 退出按鈕。 */
    button = gtk_button_new_with_label ("Quit");

   /* 設置這個信號以在按鈕被點擊時終止程式 */
    g_signal_connect_swapped (button, "clicked",
			      G_CALLBACK (gtk_main_quit),
			      window);
    /* 將按鈕封裝進quitbox。   
     * gtk_box_pack_start的最後三個參數是:expand, fill, padding. */
    gtk_box_pack_start (GTK_BOX (quitbox), button, TRUE, FALSE, 0);
    /* pack the quitbox into the vbox (box1) */
    gtk_box_pack_start (GTK_BOX (box1), quitbox, FALSE, FALSE, 0);

    /* 將現在包含了我們所有元件的縱向盒(box1)封裝進主視窗。 */
    gtk_container_add (GTK_CONTAINER (window), box1);

    /* 並顯示剩下的所有東西 */
    gtk_widget_show (button);
    gtk_widget_show (quitbox);

    gtk_widget_show (box1);
     /* 最後顯示視窗,這樣所有東西可以立刻出現。 */
    gtk_widget_show (window);

    /* 當然,還有我們的主函式。 */
    gtk_main ();

    /* 當 gtk_main_quit() 被呼叫時控制權(Control)返回到   
     * 這裡,但當exit()被使用時並不會。 */

    return 0;
}
« 
單元首頁
 »

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

點我分享到Facebook

1 則留言


發佈留言

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