Ubuntu 下的哈囉!GTK+!

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script> 由於GTK基本上主要以C語言來撰寫,您必須有C編譯器,Ubuntu預設安裝好後就有gcc了,不過缺少必要的Header file,您可以在文字模式下,安裝 build-essential套件,例如:
sudo apt-get install build-essential

安裝完成後,可以寫個基本的C語言程式:
  • hello.c
#include <stdio.h>

int main(void) {
printf("Hello! World!\n");
printf("哈囉!C語言!\n");
return 0;
}

編譯並執行看看:

$ gcc -o hello hello.c
$./hello
Hello! World!
哈囉!C語言!

再來安裝GTK開發套件 libgtk2.0-dev
sudo apt-get install libgtk2.0-dev

安裝完成後,可以使用pkg-config查看一下GTK的相關編譯環境資訊:
pkg-config --cflags --libs gtk+-2.0

pkg-config會讀取GTK附帶的.pc檔來取得相關編譯資訊,--cflags會列出include目錄,--libs列出所連結的函式庫及其所在目錄,以我的電腦為例:
$ pkg-config --cflags --libs gtk+-2.0
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pixman-1 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0

可以分開執行比較清楚,例如:
$ pkg-config --cflags gtk+-2.0
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pixman-1
$ pkg-config --libs gtk+-2.0
-lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0

所連結的函式庫包括了(擷取翻譯自 Compiling Hello World):
  • GTK(-lgtk):基於 GDK 的 widget 函式庫。
  • GDK(-lgdk):Xlib 包裏(Wrapper)。.
  • gdk-pixbuf(-lgdk_pixbuf):影像處理函式庫。
  • Pango(-lpango):國際化文字。
  • gobject(-lgobject):GTK 用以為基礎的型態系統。
  • gmodule(-lgmodule):用來載入執行時期的擴充。
  • GLib(-lglib):包括各種函式,GTK 基於 GLib,所以您會需要這個函式庫。
  • Xlib(-lX11):被 GDK 所使用。
  • Xext(-lXext):包括共享記憶體 pixmaps(shared memory pixmaps)與其它 X 擴充。
  • math(-lm):因各種目的而被 GTK 所使用的數學函式庫。

不可免俗的,從最簡單的基本視窗產生開始介紹,視窗標題就叫作「哈囉!GTK+!」好了,請使用任一編輯器來編輯一個helloGtk.c的檔案,內容如下:

  • helloGtk.c
#include <gtk/gtk.h>

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

gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "哈囉!GTK+!");
gtk_widget_show(window);
gtk_main();

return 0;
}

首先include必要的GTK標頭檔案,接著先看到gtk_init(),這個函式會先初始化函式庫,設定預設信號處理,並讓GTK有機會處理傳遞給程式的命令列引數,GTK會檢查是否有以下的引數並處理:
  • –gtk-module
  • –g-fatal-warnings
  • –gtk-debug
  • –gtk-no-debug
  • –gdk-debug
  • –gdk-no-debug
  • –display
  • –sync
  • –name
  • –class

這些引數會從引數列中移除,剩下的部份留待您自己的程式邏輯來處理。

GTK雖然使用C來撰寫,但是透過GObject函式庫,可以支援物件導向的物件封裝、繼承觀念,透過巨集還可以支援多型的觀念,一個GTK物件階層範例如下所示:
GObject
+-- GInitiallyUnowned
+-- GtkObject
+-- GtkWidget
+-- GtkContainer
+-- GtkBin
+-- GtkWindow

gtk_window_new()會建立一個GtkWindow,這是一個基本的視窗物件,GtkWindow繼承自GtkBin,GtkBin繼承自 GtkContainer,GtkContainer可以容納其它widget,所以在GtkWindow中可以置放其它的widget,而它們全都是 GtkWidget的後代。

在函式庫的組織上,GTK+的參考手冊 中,若要查詢與GtkWindow設定的相關函式,也就是gtk_window開頭的函式名稱,則直接查詢 GtkWindow 的說明文件

在範例中,您使用gtk_window_new()在記憶體中產生一個GtkWindow(但還不是真正出現在螢幕畫面中),參數設定為GtkWindowType,有兩個可用的設定:
  • GTK_WINDOW_TOPLEVEL:一個有外框的標準GTK視窗。
  • GTK_WINDOW_POPUP:一個蹦現視窗,像是對話方塊、蹦現選單或提示文字。

若要設定GtkWindow標題文字,則使用gtk_window_set_title(),GTK_WINDOW巨集用以將window物件轉型為GtkWindow型態。

gtk_window_new()只是在記憶體中產生一個GtkWindow,若要真正在螢幕畫面中顯示GTK的widget,則使用 gtk_widget_show(),最後呼叫gtk_main(),這會將程式的控制權交給GTK,由GTK來等待鍵盤、按鈕等事件或是檔案IO通知。

您可以使用以下的指令來進行編譯與執行:
$ gcc helloGtk.c -o helloGtk `pkg-config --cflags --libs gtk+-2.0`
$ ./helloGtk

pkg-config會先取得GTK的標頭檔位置與函式庫資訊,然後再供給gcc進行編譯,一個程式的執行畫面如下所示:



由於gtk_main()會將控制權交給了GTK,直到呼叫gtk_main_quit()之前都不會返回,這個範例目前還沒有實作這個部份(之後還會介紹如何實作),因此這個視窗您按下右上 X 鈕也不會真正關閉,而必須在文字模式下先使用Ctrl+C強制中斷程式。

你可能感兴趣的:(C++,c,ubuntu,C#,gcc)