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