1.GTK簡介
GTK(GIMP Toolkit)是一套源碼以LGPL許可協議分發、跨平臺的圖形工具包。最初是為GIMP寫的,已成為一個功能強大、設計靈活的一個通用圖形庫,是GNU/Linux下開發圖形界面的應用程序的主流開發工具之一。當然,GTK也是支持跨平臺的,支持Unix類的系統、Windows,甚至手機平臺。
GTK是使用C語言寫的,所以其原生API都是面向C的,同時GTK的一大特點是,在C語言層面實現了面向對象的特性。GTK是完全免費的,而且基于LGPL協議,這可以保證私有軟件通過鏈接使用GTK可以不把軟件源代碼開放,對商業應用較友好,這跟GPL協議是不一樣的。也正是LGPL協議,使得早些年Gnome(基于GTK編寫)風頭勝過KDE(基于QT編寫)。
GTK+ 從目前的發展趨勢來看,越來越成為 Linux 和 GNOME 的 native toolkit,對于跨平臺的考慮越來越少了。GNOME 目前仍是 Linux 平臺最主流的桌面系統,而像 Pantheon、Cinnamon 等桌面也只是 GNOME 換了個殼,底層也是 GNOME 技術棧,所以 GTK+ 在這方面仍會大有發展。
2.GTK和GTK+
上面只是說了gtk,但我要學習的是gtk+。它們之間有什么關系呢?gtk+的作者之一PerterMattis說他原來開發的gtk包含了三套函數庫, libglib、libgdk,和 libgtk,這些庫沒有采用面向對象機制,因而無法實現構件的復用,而且消息機制是使用標準的回調機制實現的,而非現在的gtk+所提供的信號機制。“+”是用來區分原始版本和新版本的。gtk+依然是完全使用C語言開發的,但在設計上靈活運用了面向對象設計(OOD)思想(誰說只有C++、java、C#這樣的語言可以OOD 呢)。
3.Linux下第一個GTK程序
3.1 查看系統是否安裝了GTK
??pkg-config命令可查看安裝庫的詳細信息。
$ pkg-config --list-all | grep gtk
gtk-sharp-3.0 Gtk - Gtk
gtk+-unix-print-2.0 GTK+ - GTK+ Unix print support
gtk+-x11-2.0 GTK+ - GTK+ Graphical UI Library (x11 target)
gtk+-2.0 GTK+ - GTK+ Graphical UI Library (x11 target)
若沒有gtk,則在線安裝
sudo apt-get install libgtk2.0-dev
3.2 第一個GTK程序示例
#include
int main(int argc,char *argv[])
{
/* GtkWidget 是構件的存儲類型 */
GtkWidget *window;
/*每一個GTK程序都要調用*/
gtk_init(&argc, &argv);
/*創建一個新的窗口*/
window= gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"GTK Hello");
/*設置窗口大小*/
gtk_widget_set_usize(window, 200, 200);
/*顯示窗口*/
gtk_widget_show_all (window);
/*所有的 GTK 程序必須有一個 gtk_main() 函數。
程序運行停在這里等待事件 (如鍵盤事件或鼠標事件) 的發生。 */
gtk_main();
return 0;
}
- 程序編譯:
gcc main.c `pkg-config --cflags --libs gtk+-2.0`
編譯參數:
pkg-config --cflags gtk±2.0 列出include 目錄,pkg-config --libs gtk±2.0列出編譯連接庫,也可以合在一起,像這樣:pkg-config --cflags --libs gtk±2.0。
這里使用了“命令替換”。 命令替換(commandsubstitution)使得可以捕獲一個命令的輸出而在另一個命令中替換它。這個單引號不是回車鍵左邊的那個,而是 ESC 鍵下面的那個。
- 連接時常用的庫:
? GTK 庫(-lgtk),構件庫,基于GDK。
? GDK 庫(-lgdk),Xlib庫的封裝(wrapper)。
? gdk-pixbuf 庫(-lgdk_pixbuf),圖像處理庫。
? Pango 庫(-lpango),處理國際化文本。
? gobject 庫(-lgobject),包含作為 GTK 基礎的類型系統。
? gmodule 庫(-lgmodule),動態運行庫。
? GLib 庫(-lglib),包含各種函數; GTK是基于 GLib 的,因此你總需要這個庫。
? Xlib 庫(-lX11),GDK 要使用。
? Xext 庫(-lXext),包含共享內存位圖和其它 X 擴展。
? math 庫(-lm),數學庫,這個被 GTK 因各種目的而使用。
3.3相關函數接口介紹
- gtk初始化gtk_init
void gtk_init (int *argc, char ***argv)
函數功能: gtk初始化,會在每個gtk程序中調用。該函數設定了默認的視頻(visual)和顏色映射模式(color map)。
2.gkt主處理循環gtk_main
void gtk_main (void)
函數功能: 當程序運行到這里,GTK 會“睡著”等待 X 事件 (如按鈕或鍵盤按下)、超時(timeouts)或文件 IO 通知發生。
但是在調用gtk_main_quit函數以前,對gtk_main函數的調用并不返回,即使你關閉了窗口,程序仍然在運行(上述示例演示了此效果),
在這種情況下,我們在調用gtk_main函數之前應該先建立回呼函數,而且設置GTK+使得在出現某些信號時轉而執行應用軟件,由應用軟件接著進行處理。
審核編輯:湯梓紅
-
Linux
+關注
關注
87文章
11304瀏覽量
209483 -
C語言
+關注
關注
180文章
7604瀏覽量
136813
發布評論請先 登錄
相關推薦
評論