讓我們來看一下稍微改進了的 helloworld,它對回呼作了更好的示範。這也會將我們帶入下一個主題,封裝元件。
#include <gtk/gtk.h>/* 我們新改進的回呼函式。傳遞到該函數的資料將列印到標準輸出(stdout)。*/
static void callback( GtkWidget *widget, gpointer data ) { g_print ("Hello again - %s was pressedn", (gchar *) data); }/* 另一個回呼函式 */
static gboolean 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 設置了一個處理函式來立即退出 GTK。*/
g_signal_connect (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");/* 當按鈕被按下時,我們呼叫 "callback" 函式,並將一個指向 "button 1" 的 * 指標作為它的參數。*/
g_signal_connect (button, "clicked", G_CALLBACK (callback), (gpointer) "button 1");/* 代替 gtk_container_add,我們把按鈕放入不可見的封裝盒,該封裝盒已經封 * 裝進窗口中了。*/
gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);/* 總是記住這一步,它告訴 GTK 我們為這個按鈕做的準備工作已經完成了,現 * 在可以顯示它了。*/
gtk_widget_show (button);/* 同樣創建第二個按鈕。*/
button = gtk_button_new_with_label ("Button 2");/* 以不同的參數呼叫相同的回呼函式,用指向 "button 2" 的指標代替。*/
g_signal_connect (button, "clicked", G_CALLBACK (callback), (gpointer) "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; }
用和我們第一個範例相同的連結參數來編譯這個程式,你會發現這次程式不能退出,你不得不使用視窗管理員或命令列去殺死它。插入第三個”Quit”按鈕來退出程式對讀者來說是一個好的練習。你也可能想在讀下一章時用這個程式測試 gtk_box_pack_start() 的各種選項。試試改變視窗的大小,並觀察其行為。
1 則留言