用Gtk+開發Linux上的GUI應用軟體(轉)

post0發表於2007-08-11
用Gtk+開發Linux上的GUI應用軟體(轉)[@more@]

  一般一個容器構件只能容納一個構件,如果要在一個容器構件中安排多個子構件,可先將多個子構件放入一個組合框或組合表構件內,再將這個組合框或組合表構件放入該容器構件。

  一、如何建立Gtk+應用

  1.基本概念

  在Linux上開發GUI應用軟體,我們通常利用Gtk+庫。為了深入瞭解Gtk+的應用,我們首先要明確幾個概念。

  (1) 構件(widget)的概念

  在Gtk+庫裡的視窗、選單和按鈕等應用實體,我們稱之為構件(widget)。構件具有物件導向的特徵,其具體結構由Gtk+庫定義,它對運用構件的程式設計師來說是透明的,除非你想建立自己的構件。在對構件進行安排時,我們只需要關心構件的處理函式,這樣做的目的就是要對應用程式設計師遮蔽構件的細節,使程式設計師將更多的精力集中在應用功能上。

  (2) 容器(container)的概念

  構件主要分為兩大類,即容器類(container)和雜類(miscellaneous)。大多數構件屬容器類,它們可以像容器一樣容納其它的構件。在安排構件時常常要遵循一個規則:除了組合框(box)和組合表(table)這兩種構件外,其它的容器類構件都只能容納一個構件。雜類構件比容器類構件簡單,但它不能容納其它構件。

  (3) 訊息及回呼函式的概念

  程式必須能對使用者的操作作出反應,在基於GUI的程式設計中,“訊息”或“訊號”是必要的。使用者點選選單、各種按鈕、輸入使用者資料、查詢執行結果和拖放,都會產生訊息或訊號。訊號可能需要由軟體來加以處理,這時程式設計師就需要編寫訊息回呼函式。訊息或訊號的概念類似於Windows中的事件。在Gtk+ 中經常產生各種訊號,使用者產生的大多數訊號被忽略,只有程式關心的訊號,程式中才有相應的處理函式被呼叫。程式設計師要登記訊號與處理函式之間的關係,告訴 Gtk+哪些訊號或事件是程式所關心的。

  2. 構件(widget)的運用

  在呼叫Gtk+的構件時,一般進行如下操作步驟:

  (1) 包含所呼叫構件的標頭檔案

  標頭檔案通常存放在/usr/include/gtk/目錄下,該檔案裡有對構件的定義及對構件的操作函式,在我們使用構件時,可以經常在這個目錄下查閱構件函式的呼叫格式或引數。我們不必讓所有構件包含標頭檔案,因為構件的標頭檔案已包含在該目錄下一個名為gtk.h的檔案裡,包含這個檔案就包含了所有構件的標頭檔案。一般系統將編譯的包含目錄指定為/usr/include,所以我們只需寫明 include 即可。

  (2) 宣告構件

  宣告構件的過程是為了符合C語言中先宣告後使用的原則。一般在程式開始要宣告構件結構的指標,這就為構件分配了地址。

  (3) 構件指標的初始化

  呼叫構件的建立函式,對構件的屬性進行調整(大小、位置和狀態等),接著顯示構件,這一點不能忽略,如果只建立了構件卻忘了顯示(gtk_widget_show),在應用時,使用者就不能看到構件,也就無法對構件進行操作了。

  (4) 安排構件的位置與層次關係

  構件之間往往是容納與被容納的關係,也就是說容器內還有容器,層層巢狀。要記住一般一個容器構件只能容納一個構件,如果要在一個容器構件中安排多個子構件,可先將多個子構件放入一個組合框或組合表構件內,再將這個組合框或組合表構件放入該容器構件。注意父容器構件要先於子容器構件建立,父容器構件的顯示要在子容器構件的顯示之後。

  (5) 編寫事件處理函式

  構件的標頭檔案中定義了構件能響應的事件(訊息),但並非所有的訊息在應用中都是程式所關心的,對於程式應當響應的事件,程式設計師要寫出事件處理函式。

  二、應用舉例

  為了對Gtk+庫的應用有一個具體的認識,讓我們來看一個簡單的應用例項。

  1. 初始化Gtk+

  寫Gtk+程式需要呼叫gtk_init函式對Gtk+庫進行初始化。我們首先將應用程式的變數argc和argv傳遞給gtk_init函式,並檢查主要用於除錯的Gtk+選項。如果在變數列表中出現任何這樣的Gtk+引數,就將它移去。在執行gtk_init函式後,它們不應該出現在應用程式中。初始化Gtk+的程式碼如下:

  gtk_init(&&argc,&&argv);

  2. 建立構件

  首先要建立的構件是視窗,它是應用程式的頂層構件,其它構件一般安排在頂層視窗中。視窗是GUI程式的基本框架,在視窗裡我們可以為使用者安排各種方便的應用。一個應用可以有若干個視窗,這些視窗之間既相互獨立,又有層次的關係。視窗有相對固定的風格,前景色、背景色、字型和字號等,我們應當保持定製的風格,確保不使應用軟體雜亂。

  按照上面提出的構件運用步驟,我們建立一個程式主視窗:

  /?宣告構件指標?/

  GtkWidget ?window;

  /?建立視窗,初始化視窗指標,建立一個頂層視窗?/

  window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

  /?顯示構件?/

  gtk_widget_show(window);

  /?登記訊息與訊息處理函式的關係?/

  gtk_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(close_window),NULL);

  3. 構件型別的轉換

  由於建立的構件是通用構件,需要將它轉換為具體的型別以適合呼叫更為專用的函式。比如建立按鈕構件函式會返回GtkWidget 指標,但是專用的按鈕子程式要求返回GtkButton指標,所以在呼叫專用的按鈕函式以前,需要使用GTK_BUTTON宏將通用的GtkWidget 指標轉換為GtkButton指標。通常,構件是由其它構件派生的,視窗構件(GtkWindow)是由容器構件GtkContainer派生的,而容器構件是由通用構件派生的。在Gtk+中可以將構件指標轉換為其父類、祖先類構件的任意型別,然後再呼叫父類或祖先類構件的函式。

  4. Gtk+的事件迴圈

  對Gtk+進行初始化並將視窗等構件安排在螢幕上之後,應用軟體需要使用Gtk+開始執行事件的迴圈函式gtk_main(),沒有這個函式,應用程式執行時就會一閃即逝。但是在呼叫gtk_main_quit()函式之前對gtk_main()函式的呼叫並不返回,也就是說只有 gtk_main_quit()函式才能停止Gtk+的執行,從而最終退出應用程式。我們把gtk_main_quit()函式放在訊息處理函式 close_window()之中,這樣,當使用者點選了視窗的關閉按鈕,Gtk+收到“delelte_event”訊息,然後呼叫 close_window(),執行gtk_main_quit()函式,整個程式即可退出。

  5. 例項原始碼

  現在建立一個顯示“hello”字樣的簡單視窗程式。整個程式實現程式碼如下:

  //hello.c

  include

  /?關閉主視窗中的訊息處理函式?/

  close_window(GtkWidget ?window,gpointer data)

  {

  /?中止gtk事件迴圈?/

  gtk_main_quit();

  }

  /?主函式?/

  main(int argc,char ?argv)

  {/?宣告視窗和標籤兩個構件?/

  GtkWidget ?window;

  GtkWidget ?label;

  /?初始化Gtk+庫?/

  gtk_init(&&argc,&&argv);

  /?初始化window構件?/

  window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

  /?初始化label構件?/

  label=gtk_label_new("hello!");

  /?將標籤放入視窗內,函式內用GTK_CONTAINER宏將視窗構?/

  /?件的指標型別轉換為其父類容器構件的指標型別?/

  gtk_container_add(GTK_CONTAINER(window),label);

  /?顯示label構件?/

  gtk_widget_show(label);

  /?顯示window構件?/

  gtk_widget_show(window);

  /?當視窗獲得'delete_event'訊息時呼叫close_windw函式?/

  gtk_signal_connect(GTK_OBJECT(window),"delete_event",

  GTK_SIGNAL_FUNC(close_window),NULL);

  /?gtk事件迴圈?/

  gtk_main();

  }

  6. 編譯原始碼及執行程式

  最後談一下Gtk+在程式編譯和執行時有哪些特別之處。在Linux系統下的C編譯器,如gcc,要求編譯時在編譯命令後加上各種引數,如果引數太複雜,最好把命令寫入makefile檔案。

  前面我們講過在應用程式檔案中用到Gtk+函式或定義的每一部分必須包含gtk/gtk.h檔案,它是Gtk+的主要包含檔案。此外,還必須連線若干庫。Gtk+的開發人員為我們提供了方便。使用gtk-config程式可以簡化這些工作。編譯hello.c原始檔成為可執行檔案hello的命令如下:

  gcc hello.c -o hello `gtk-config -cflags``gtk-config -libs`

  注意,程式中一定是反引號(在鍵盤上位於字元1的左邊)。`gtk-config`實際執行了gtk-config程式;引數-cflags輸出編譯標誌,並將它們插入命令列;引數-libs輸出連線標誌並插入命令列。在Gtk+ 1.2以上版本中包含gtk-config程式。在Linux的命令列提示符後敲入`gtk-config -cflags`和`gtk-config -libs`表示給gcc 傳遞引數的正確方法。

  用shell命令“chmod -777 hello”將檔案hello設定為所有使用者都可執行的檔案,再用shell命令“./hello”執行這個檔案。

  三、小結

  本文僅提供了對Gtk+庫應用的基本思路,對於想利用Gtk+開發Linux應用的C程式設計師來說是入門的一課,深入的應用和開發技巧需要讀者在今後不斷的實踐中獲得

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-945003/,如需轉載,請註明出處,否則將追究法律責任。

相關文章