GTK+ 示例/入門
在本章中,我們將研究一些非常簡單的 GTK+ 示例,從經典的“Hello, world!” 開始。
- 您會發現,透過動手編寫程式碼,您可以更有效地學習。
- 在繼續學習下一章之前,請確保您理解自己正在做什麼。本書中的章節被設計為獨立的單元,但假設您已經瞭解了前幾章的背景知識。
- 您可以複製貼上程式碼來獲得快速結果,但手動輸入將幫助您熟悉 GTK+ 的編碼風格,因此建議您這樣做。
- 慢慢來,告訴自己,每個示例都能執行,真是太棒了。
- 修改程式碼,犯錯誤,讓事情出錯,享受樂趣!
編譯這些示例程式時,您可能需要向命令列傳遞其他資訊以啟用 GTK+ 視窗庫。
在 Linux 上,您需要確保安裝了 pkg-config 程式。
gcc -Wall -g helloworld.c -o helloworld `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
更多資訊請訪問:https://developer.gnome.org/gtk-tutorial/stable/x111.html
在這個示例中,我們建立了一個視窗,設定了它的標題和大小,並連線了一個事件,允許應用程式關閉。
#include <gtk/gtk.h>
int
main (int argc,
char *argv[])
{
GtkWidget *window;
/* Initialise GTK+ passing to it all command line arguments */
gtk_init (&argc, &argv);
/* create a new window, set values */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Hello GTK+ World");
/* set the size of the window */
gtk_widget_set_size_request (GTK_WIDGET (window), 200, 200);
/* connect the windows "destroy" event */
g_signal_connect (G_OBJECT (window), "destroy",
G_CALLBACK (gtk_main_quit), NULL);
/* set the window as visible */
gtk_widget_show (window);
/* run the GTK+ main loop */
gtk_main ();
return 0;
}
恭喜您,您建立了第一個 GTK+ 視窗。您可能還沒有完全理解自己編寫的程式碼。沒關係,在本節結束之前,建立視窗將變得很容易。GTK+ 是面向物件的。由於 C 語言並非為面嚮物件語言而設計,因此您必須顯式地強制轉換物件,這在傳遞給函式的引數中最為常見。當您編寫 GTK_WINDOW(window) 時,您首先將 window 從 GtkWidget 強制轉換為 GtkWindow。如果您不理解這個示例,請在完成兩個小挑戰後隨意繼續。您可能很容易猜到如何完成它們,但不要被騙。即使是完成小任務也能幫助您專注於解決大問題。
- 挑戰:將視窗名稱更改為您的名字。
- 挑戰:將視窗大小更改為 400 * 400 畫素,目前是 200 * 200 畫素。
在本節結束時,我們將解釋這個示例中的所有內容,但現在讓我們關注兩行程式碼。
gtk_init (&argc, &argv);
- gtk_init() 在所有 GTK+ 應用程式的開頭呼叫,它初始化 gtk+ 庫。&argc 和 &argv 被傳遞給 gtk_init(),它們是傳遞給應用程式的命令列引數。gtk_init() 獲取這些引數,因為它有一組它可以接受的命令列引數。
gtk_main ();
- gtk_main() 在應用程式設定完成後呼叫,一旦呼叫,您就必須等到 gtk_main_quit() 被呼叫才能繼續執行應用程式。我們已經連線了該事件,並在後面的練習中進行解釋。
這個示例與上一個示例略有不同,我們添加了一個按鈕,並且注意到我們沒有呼叫 gtk_widget_set_size_request()。
#include <gtk/gtk.h>
int
main (int argc,
char *argv[])
{
GtkWidget *window;
GtkWidget *button;
/* Initialise GTK+ passing to it all command line arguments */
gtk_init (&argc, &argv);
/* create a new window, set values */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Hello Button");
/* connect the windows "destroy" event */
g_signal_connect (G_OBJECT (window), "destroy",
G_CALLBACK (gtk_main_quit), NULL);
button = gtk_button_new_with_label ("Hello Window");
gtk_container_add (GTK_CONTAINER (window), button);
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (gtk_main_quit), NULL);
/* set the window as visible */
gtk_widget_show_all (window);
/* run the GTK+ main loop */
gtk_main ();
return 0;
}
幹得好,又完成了一個。還沒完,和我一樣,繼續。當您單擊按鈕時,它會關閉視窗,這是一個多麼惱人的應用程式?它正在試圖讓你注意到它是如何做到的。注意這次我們沒有呼叫 gtk_widget_set_size_request(),這是因為 GTK+ 會自動為您調整視窗和小部件的大小,在大多數情況下,您不應該自己設定小部件或視窗的大小;上一個示例之所以不同,是因為視窗中沒有任何內容。顧名思義,size_request 表示您要求的大小可能不是分配給小部件的大小,這將在本書後面的內容中進一步解釋,現在只要理解它是請求就足夠了。
- 挑戰:使按鈕在您單擊時沒有任何反應,沒錯,什麼也不做。
- 挑戰:刪除以“button =”開頭的行,然後從命令列執行您的程式,看看會發生什麼。
我們現在還沒有解釋所有內容,那樣會讓您失去樂趣。無論如何,您完成挑戰了嗎?我敢肯定您做得很好。讓我們再看兩行程式碼
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_new() 建立一個新的視窗,它有兩種型別:GTK_WINDOW_TOPLEVEL 和 GTK_WINDOW_POPUP。不要讓 GTK_WINDOW_POPUP 這個名字迷惑您,它並非用於彈出對話方塊,彈出對話方塊和 GTK_WINDOW_POPUP 都將在後面的章節中解釋。
button = gtk_button_new_with_label ("Hello Window");
- button_new_with_label() 是一個便捷函式,在這種情況下,它意味著它會為您建立一個按鈕和一個標籤,並將標籤插入按鈕中。GTK+ 中的按鈕是一個容器,當單擊時可能會導致一段程式碼執行。按鈕可以包含您插入其中的任何內容,但僅僅為了好玩而將某些東西放在按鈕中會真正讓人困惑,因此我們建議您插入標籤或影像,如果您是一個很棒的人,您將學會以您現在的速度插入影像和標籤,您很快就會統治世界。