Pages

2008年5月6日 星期二

Gtk+-2.0 初步

OS:Ubuntu 8.04 Hardy Heron
IDE: Code::Blocks svn build rev 5020 with Gtk+-2.0
/etc/apt/sources.list 中加入以下網址:
# Code::Blocks
deb http://apt.wxwidgets.org/ gutsy-wx main
deb http://archive.ubuntu.com/ubuntu/ gutsy multiverse restricted universe main
deb http://lgp203.free.fr/ubuntu/ gutsy universe
linly-desktop:$ wget -q http://apt.wxwidgets.org/key.asc -O- | sudo apt-key add -
linly-desktop:$ wget -q http://lgp203.free.fr/public.key -O- | sudo apt-key add -
linly-desktop:$ sudo apt-get update
linly-desktop:$ sudo apt-get install libgtk2.0-dev
linly-desktop:$ sudo apt-get install codeblocks
準備工作完成後,接著開始我的第一支 Gtk+ 程式...

首先開啟 Code::Blocks,選擇一個 console application,接著在以下兩處作設定:
  1. Code::Blocks 的 Setting->Compiler and debugger->Compiler settings->Other options 加入`pkg-config --cflags gtk+-2.0`
  2. Code::Blocks 的 Setting->Compiler and debugger->Linker settings->Other linker options 加入`pkg-config --libs gtk+-2.0`
這樣 Code::Blocks 在編譯你的 Gtk+ 程式才有辦法找到 Gtk+ 相關的 include files 以及 library files。另外,以上的設定會套用在所有使用 Code::Blocks 開發的 Projects 中,,假如只想套用在某一個特定的 Project 中,就去 Project->Build options 作設定即可。底下是簡單範例:

#include<gtk/gtk.h>

gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) {
    g_print ("delete event occurred\n");
    return(TRUE);
} 

void destroy(GtkWidget *widget, gpointer data) {
    gtk_main_quit();
}

int main(int argc, char *argv[]) {
    GtkWidget *window;
    GtkWidget *button;
    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    // connect signal
    gtk_signal_connect(GTK_OBJECT(window),
                       "delete_event",
                       GTK_SIGNAL_FUNC(delete_event),
                       NULL);
    gtk_signal_connect(GTK_OBJECT (window),
                       "destroy",
                       GTK_SIGNAL_FUNC (destroy),
                       NULL);

    gtk_container_set_border_width(GTK_CONTAINER (window), 10);

    button = gtk_button_new_with_label("Hello Ubuntu!");

    gtk_signal_connect_object(GTK_OBJECT(button),
                              "clicked",
                              GTK_SIGNAL_FUNC(gtk_widget_destroy),
                              GTK_OBJECT(window));

    // 把 button 加入 window 中
    gtk_container_add(GTK_CONTAINER (window), button);

    gtk_widget_show(button);
    gtk_widget_show(window);
    gtk_main();
    return(0);
}

2 則留言:

Eric 提到...

GTK_SIGNAL_FUNC這個巨集是將事件(or訊號)處理函式轉型成GtkSignalFunc,而該函式指標的原型為 void (*GtkSignalFunc) (); so amazing!!

Eric 提到...

在自訂的delete_event中,回傳值為TRUE,就不會在後續去執行預設的處理函式,所以也不會發出destroy的信號。

 
Blogger Templates