改進了的 Hello World
讓我們來看一下稍微改進了的helloworld和更好的回調函數示例。這裏也要介紹下
一個話題,組裝構件。
#include <gtk/gtk.h>
/* 我們新改進的回調函數。向標準輸出(stdout)打印傳遞給該函數的數據。*/
void callback( GtkWidget *widget,
gpointer data )
{
g_print ("Hello again - %s was pressed/n", (gchar *) data);
}
/* 另一個回調函數 */
gint 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設置了一個處理函數。*/
g_signal_connect (G_OBJECT (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");
/* 設置回調函數。*/
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (callback), "button 1");
/* 我們把按鈕放入不可見的組裝盒,該組合盒已經被放入窗口中。*/
gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);
/* 我們爲這個按鈕做的準備工作完成了,可以顯示它了。*/
gtk_widget_show (button);
/* 同樣創建第二個按鈕。*/
button = gtk_button_new_with_label ("Button 2");
/* 以不同的參數調用相同的回調函數,用指向"button 2"的指針代替。*/
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (callback), "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;
}
編譯這個程序,你會發現這次程序不能退出,你不得不使用窗口管理器或命令行去
殺死它。插入一個退出程序的按鈕對讀者來說是一個好的練習。