GTK+ 2.0 教學-從這裡開始

你首先做的第一件事,當然是下載 GTK 原始碼,並安裝它。你總是能從 ftp.gtk.org 得到最新版本。你也可以在 http://www.gtk.org/ 上查看其它 GTK 原始碼的訊息。GTK 使用 GNU autoconf 配置。解壓縮後,輸入 ./configure –help 查看選項列表

GTK 原始碼的發行套件中包含教學中所有範例的原始碼,每個範例中包含有 Makefiles 文件,用以方便編譯。

一開始介紹 GTK,我們會盡可能從簡單的程式開始。這個程式創建 200×200 大小的視窗,沒有辦法退出,除非你從 shell 中將它殺掉。

#include <gtk/gtk.h>
int main( int argc,char *argv[]){ 

   GtkWidget *window; 

   gtk_init (&argc, &argv); 

   window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 

   gtk_widget_show  (window); 

   gtk_main (); 

   return 0; 

}

你可以用 gcc 編譯上面的程式:

gcc base.c -o base `pkg-config –cflags –libs gtk+-2.0`

不常用的編譯參數在下面編譯 Hello World 程式中解釋。

所有程式應該包含 gtk/gtk.h,其中聲明了變數、函式以及結構等,這些東西會在你的程式中使用。

下一行:

gtk_init (&argc, &argv);

這個函式 gtk_init(gint *argc, gchar ***argv) 會在每個 GTK 應用程式中呼叫。該函式設定了預設的視頻(visual)和顏色映射模式(color map),接著會呼叫函式 gdk_init(gint *argc, gchar ***argv)。該函式初始化要使用的函式庫,設定預設的信號處理,並檢查傳遞給你的程式的命令列參數,尋找下列之一:

  • –gtk-module
  • –g-fatal-warnings
  • –gtk-debug
  • –gtk-no-debug
  • –gdk-debug
  • –gdk-no-debug
  • –display
  • –sync
  • –name
  • –class

這些參數將會從參數表中刪除,你的程式不會去解析或忽略這些參數。這就創建了可以被所有 GTK 程式接受的一組標準參數。

下面兩行程式會創建並顯示一個視窗

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);  gtk_widget_show (window);

GTK_WINDOW_TOPLEVEL 參數指定了我們承習視窗管理程式的外觀。這裡不會創建一個0x0 大小的視窗,而是一個沒有子元件的視窗預設大小設置為 200×200,這樣你仍然能操作它。

gtk_widget_show() 函式讓 GTK 知道,我們已經設置完元件的屬性,可以顯示它了。

最後一行進入 GTK 主處理迴圈。

  gtk_main ();

gtk_main() 是另一個可以在每個 GTK 程式中見到的函式呼叫。當程式執行到這裡,GTK 會「睡著」等待 X 事件 (如按鈕或鍵盤按下)、逾時(timeouts)或文件 IO 通知發生。在我們的範例中,事件被忽略。
好,現在來寫一個只有一個按鈕元件的程式,這是一個標準的 GTK Hello World。

用 GTK 來寫 Hello World

#include <gtk/gtk.h>
/* 這是一個回呼函式。data 參數在本範例中被忽略。   * 後面有更多的回呼函式範例。*/
void hello( GtkWidget *widget, gpointer   data )
{
   g_print ("Hello Worldn");
}
gint delete_event( GtkWidget *widget, GdkEvent  *event, gpointer   data )
{
/* 如果你的 "delete_event" 信號處理函式傳回 FALSE,GTK 會發出 "destroy" 信號。
 * 傳回 TRUE,你不希望關閉視窗。
 * 當你想彈出「你確定要退出嗎?」對話框時它很有用。*/
g_print ("delete event occurredn");
/* 改 TRUE 為 FALSE 程式會關閉。*/
return TRUE;
}
/* 另一個回呼函式 */
void destroy( GtkWidget *widget, gpointer data )
{
   gtk_main_quit ();
}
int main( int argc,char *argv[] )
{
/* GtkWidget 是元件的存儲型態 */
GtkWidget *window;
GtkWidget *button;
/* 這個函式在所有的 GTK 程式都要呼叫。參數由命令列中解析出來並且送到該程式中*/
gtk_init (&argc, &argv);
/* 創建一個新視窗 */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* 當視窗收到 "delete_event" 信號 (這個信號由視窗管理器發出,通常是「關閉」
 * 選項或是標題欄上的關閉按鈕發出的),我們讓它呼叫在前面定義的 delete_event() 函式。
 * 傳給回呼函式的 data 參數值是 NULL,它會被回呼函式忽略。*/
g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);
/* 在這裡我們連接 "destroy" 事件到一個信號處理函式。
 * 對這個視窗呼叫 gtk_widget_destroy() 函式或在 "delete_event" 回呼函式中傳回 FALSE 值
 * 都會觸發這個事件。*/
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);
/* 設置視窗邊框的寬度。*/
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
/* 創建一個標籤為 "Hello World" 的新按鈕。*/
button = gtk_button_new_with_label ("Hello World");
/* 當按鈕收到 "clicked" 信號時會呼叫 hello() 函式,並將NULL傳給
 * 它作為參數。hello() 函式在前面定義了。*/
g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (hello), NULL);
/* 當點擊按鈕時,會通過呼叫 gtk_widget_destroy(window) 來關閉視窗。
 * "destroy" 信號會從這裡或從視窗管理器發出。*/
g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), window);
/* 把按鈕放入視窗 (一個 gtk 容器) 中。*/
gtk_container_add (GTK_CONTAINER (window), button);
/* 最後一步是顯示新創建的按鈕和視窗 */
gtk_widget_show (button);
gtk_widget_show (window);
/* 所有的 GTK 程式必須有一個 gtk_main() 函式。程式執行停在這裡
 * 等待事件 (如鍵盤事件或滑鼠事件) 的發生。*/
gtk_main ();
return 0;
}

« 

單元首頁

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

點我分享到Facebook

發佈留言

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