### 下面來介紹GTK編程入門,你的第一個程序hellowoeld。直接通過程序來講解吧。
~~~
/*File:helloworld.c
*Date:2013-11-23
*Author:sjin
*Mail:413977243@qq.com
*/
/*my first test program*/
#include <gtk/gtk.h>
/* 這是一個回調函數。data 參數在本示例中被忽略。
* 后面有更多的回調函數示例。*/
void hello( GtkWidget *widget,gpointer data )
{
g_print ("Hello World\n");
}
gint delete_event( GtkWidget *widget,GdkEvent *event,gpointer data )
{
/* 如果你的 "delete_event" 信號處理函數返回 FALSE,GTK 會發出 "destroy" 信號。
* 返回 TRUE,你不希望關閉窗口。
* 當你想彈出“你確定要退出嗎?”對話框時它很有用。*/
g_print ("delete event occurred\n");
/* 改 TRUE 為 FALSE 程序會關閉,關閉時調用destroy()。*/
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);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"My first program helloworld!");
/* 當窗口收到 "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), 150);
/* 創建一個標簽為 "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;
}
~~~
編譯 gcc test.c `pkg-config --cflags --libs gtk+-2.0`(以后編譯都參照這個樣子,以后將不再具體說明)
運行程序將出現下面的窗口,單擊button窗口將被關閉

下面是改進版的helloworld
~~~
/*File:helloworld2.c
*Date:2013-11-17
*Author:sjin
*Mail:413977243@qq.com
*/
#include <gtk/gtk.h>
/*改進的回調函數,傳遞到該函數的數據將會被打印到標準輸出*/
void callback(GtkWidget *widget,gpointer data)
{
g_print("Hello again-%s was pressed\n",(gchar*) data);
}
/*關閉窗口的函數*/
void destroy(GtkWidget *widget,gpointer data)
{
g_print("退出hello world!\n");
gtk_main_quit();
}
int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *box1;
/*函數gtk_init()會在每個GTK的應用程序中調用。
* 該函數設定默認的視頻和顏色默認參數,接下來會調用函數
* gdk_init()該函數初始化要使用的庫,設定默認的信號處理
*檢查傳遞到程序的命令行參數
* */
gtk_init(&argc,&argv);
//下面兩行創建并顯示窗口。創建一個200*200的窗口。
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"Helloworld2.c test!");
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(destroy),NULL);
/*設置窗口邊框的寬度*/
gtk_container_set_border_width(GTK_CONTAINER(window),80);
/*創建一個組裝盒
*我們看不見它,用來排列構建的工具
* */
box1 = gtk_hbox_new(FALSE,0);
/*把組裝盒box1放到主窗口中*/
gtk_container_add(GTK_CONTAINER(window),box1);
/*創建一個標簽為“歡迎”的按鈕*/
button = gtk_button_new_with_label("歡迎");
/*當按下歡迎按鈕時,我們調用 callback函數,會打印出我們傳遞的參數*/
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(callback),"歡迎大家來到我的博客學習!");
/*我們將button 按鈕放入組裝盒中*/
gtk_box_pack_start(GTK_BOX(box1),button,TRUE,TRUE,0);
/*歡迎按鈕設置成功,別忘了寫下個函數來顯示它*/
gtk_widget_show(button);
/*創建第二個按鈕*/
button = gtk_button_new_with_label("說明");
g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(callback),"GTK編程入門學習!");
gtk_box_pack_start(GTK_BOX(box1),button,TRUE,TRUE,0);
gtk_widget_show(button);
/*創建一個退出按鈕*/
button = gtk_button_new_with_label("退出");
/*當點擊退出按鈕時,會觸發gtk_widet_destroy來關閉窗口,destroy信號從這里發出
* 會觸發destroy函數。*/
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(destroy),NULL);
g_signal_connect_swapped(G_OBJECT(button),"clicked",G_CALLBACK(gtk_widget_destroy),window);
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;
}
~~~
### 運行程序,會彈出下面的窗口

### 依次點擊歡迎、說明、退出按鈕,會打印下面的信息
~~~
Hello again-歡迎大家來到我的博客學習! was pressed
Hello again-GTK編程入門學習! was pressed
退出hello world!
~~~
退出方式有2種,一種是點擊窗口上的關閉窗,另一種就是點擊按鈕退出
參考資料:
[http://download.csdn.net/detail/jsh13417/6567043](http://download.csdn.net/detail/jsh13417/6567043)
[GTK+2.0 中的容器控件與布局技巧](http://www.ibm.com/developerworks/cn/linux/l-gtk/part1/index.html)
[GTK+中的插件](http://www.ibm.com/developerworks/cn/linux/l-gtkplgin/index.html)