激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

GTK圖形編程

時(shí)間:2024-09-08 02:23:41 計算機應用畢業(yè)論文 我要投稿
  • 相關(guān)推薦

GTK圖形編程

【摘要】 本文介紹了Linux平臺下的Xwindow圖形窗口編程工具GTK,并給出了用GTK編程的基本要素和步驟。 【關(guān)鍵詞】GTK,回調函數,消息處理器,調節器 GTK(GIMP Toolkit)是一個(gè)圖形用戶(hù)編程的接口工具。它注冊完全免費,所以用來(lái)開(kāi)發(fā)自由軟件或商業(yè)軟件都不需要花費什么,F在很多Linux集成系統都已經(jīng)將GTK1.2版本打包進(jìn)去了。包括RedHat Linux 6.0以上版本,還有中文化的Turbo Linux等等。它也越來(lái)越被普遍的于UNIX系統編程。 還有一個(gè)組件叫Glib,它包含了一些標準應用的新擴展用來(lái)提高GTK的兼容性。用于Linux系統的某些函數可能不適合標準的UNIX系統,例如g_strerror()函數等等。某些函數也擴展了GNUC的一般功能,例如g_malloc函數就有自己加強的調試功能。 GTK可以與多種語(yǔ)言綁定,包括C++, Guile, Perl, Python, Ton, Ada95, Objective C, Free Pascal, Eiffel。用標準C開(kāi)發(fā)的程序,編譯軟件可用GNU并附帶上GTK選項即可。想用除了標準C以外的其它語(yǔ)言來(lái)開(kāi)發(fā)Xwindow圖形用戶(hù)程序,則需要先一下有關(guān)綁定軟件的(HTTP:// )。 如果用C++語(yǔ)言來(lái)調用GTK進(jìn)行開(kāi)發(fā),可以用已經(jīng)和C++綁定的軟件叫GTK--軟件,來(lái)提供一個(gè)比GTK更好的C++編譯環(huán)境。 已經(jīng)開(kāi)發(fā)出來(lái)GTK的增強版GTK+。GTK+是將GTK,GDK,GLIB集成在一起的開(kāi)發(fā)包,可以工作在許多類(lèi)似于UNIX的系統上,沒(méi)有GTK的平臺限制。 1.GTK的消息處理機制 下面我們先看一個(gè)基本的例子,該例子產(chǎn)生一個(gè)200×200像素的窗口。它不能自己退出,只能通過(guò)shell來(lái)殺死進(jìn)程(調用kill命令)。 /*例子 base.c */ #include <gtk/gtk.h> int main( int argc,char *argv[ ] ){ GtkWidget *window; gtk_init (&argc, &argv); /* 初始化顯示環(huán)境 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* 創(chuàng )建一個(gè)新的窗口*/ gtk_widget_show (window); /*顯示窗口*/ gtk_main (); /*進(jìn)入睡眠狀態(tài),等待事件激活*/ return(0); } 從上面的程序可以看出,GTK是一個(gè)事件驅動(dòng)工具包,當它運行到gtk_main()函數時(shí)會(huì )自動(dòng)睡眠,直到有事件發(fā)生,控制權轉讓給相應的函數調用,在該函數中可以用標準C寫(xiě)出相應的事物邏輯。這與windows 上的程序處理是一樣的。 對窗口對象上發(fā)生的事件(如按下鼠標,激活鍵盤(pán)等),GTK也有相應的消息信號產(chǎn)生。這時(shí)就需要程序員創(chuàng )建一個(gè)信號處理器來(lái)捕獲該信號,并告訴GTK程序事件發(fā)生后調用哪個(gè)回調函數。信號處理器的創(chuàng )建函數定義如下: gint gtk_signal_connect( GtkObject *object, gchar *name,GtkSignalFunc callback_func, gpointer func_data ); 返回值是一個(gè)區分同一對象中的事件與不同回調函數的關(guān)聯(lián)標簽。這樣可以做到一個(gè)對象的一個(gè)信號就有任意多個(gè)回調函數,并且每一個(gè)都會(huì )按照聲明的順序執行。函數調用的第一個(gè)參數是產(chǎn)生信號的widget組件(即按鈕等窗口構件),而name則是希望捕獲的信號或事件的名稱(chēng),callback_func則是事件發(fā)生后所調用的回調函數名稱(chēng),而第四個(gè)參數func_data則是傳遞給回調函數的參數。 回調函數要定義在主程序的前面,它們的一般格式都如下所示: void callback_func( GtkWidget *widget, gpointer func_data ); 調用下面這個(gè)將允許你將回調函數與事件的關(guān)聯(lián)斷開(kāi): void gtk_signal_disconnect( GtkObject *object, gint id ); 該函數的第二個(gè)參數就是上述gtk_signal_connect()函數的返回值,即關(guān)聯(lián)標簽。第一個(gè)參數指向了去除關(guān)聯(lián)的對象名稱(chēng)。這樣可以做到斷開(kāi)事件與回調函數的關(guān)聯(lián),使得事件發(fā)生后,不會(huì )調用相關(guān)的回調函數。 布局格式 2.1打包盒子 對GTK顯示格式的控制是通常通過(guò)打包盒子來(lái)完成的。widget組件打包可以采用兩種方式,水平盒子和垂直盒子。若將widget組件打包進(jìn)平行盒子,組件就被依次水平的插入窗口;若是垂直盒子,則組件排列是垂直的。產(chǎn)生新的水平盒子的函數為 GtkWidget *gtk_hbox_new (gint homogeneous, gint spacing); 參數homogeneous是用來(lái)控制是否盒子中的每個(gè)組件都有同樣的大。ɡ缢胶凶又械目丶型瑯拥膶挾,垂直盒子中的控件有同樣的高度)。Spacing參數是組件之間的間隔。 垂直盒子的創(chuàng )建函數是gtk_vbox_new(),定義與水平盒子一致。 gtk_box_pack_start()和gtk_box_pack_end()函數是用來(lái)將打包對象放入這些盒子中的。 void gtk_box_pack_start( GtkBox *box, GtkWidget *child,gint expand, gint fill, gint padding ); 第一個(gè)參數是你將組件打進(jìn)去的盒子指針,第二個(gè)參數是你將要打進(jìn)去的組件指針。Expand參數是用來(lái)控制是否允許組件擴展至分配給盒子空間的大。ㄟxTRUE),還是盒子的大小收縮到組件那么大(選FALSE)。函數中的fill參數是用來(lái)控制是否將多余的空間分配給組件,即將組件擴展到盒子的大。ㄟxTRUE),或者多余的空間不變,保留作為盒子和打包組件間的間隔。該參數只有在expand參數取TRUE時(shí)才有效。Padding參數是指組件四周與盒子的間隔大小。 注意fill取FALSE值,expand取TRUE值時(shí)與expand取FALSE值,fill值無(wú)效的區別。前者的盒子仍是原來(lái)創(chuàng )建盒子時(shí)指定的大小,而后者的盒子已經(jīng)縮小到打包組件的大小了。 gtk_box_pack_end()函數的參數與上面描述的一致。只是排列順序分別是從下到上
,從右到左。 最后將所有的盒子或組件打包到一個(gè)大盒子中,用gtk_container_add()函數將盒子加入窗口即可。
2.2表格打包 我們可以產(chǎn)生一個(gè)表格,將widget組件一一放入。Widget組件將占據所有分配給它的空間。創(chuàng )建表格是用下面的函數: GtkWidget *gtk_table_new( gint rows, gint columns,gint homogeneous ); 第一個(gè)參數,顯而易見(jiàn),是表格的行數。后面的參數則是表格的列數。homogeneous參數則是用來(lái)安排表格間隔大小。如果它取TRUE,則表格中每個(gè)小格的大小用表格中最大組件的大小來(lái)設置的,所有的小格大小都是一樣的。如果homogeneous參數取FALSE的,每個(gè)小格的大小都用同行中最高組件的高度,同列中最寬組件的寬度。 將一個(gè)widget組件放入一個(gè)表格,用下面的函數: void gtk_table_attach( GtkTable *table, GtkWidget *child, gint left_attach, gint right_attach, gint top_attach, gint bottom_attach, gint xoptions, gint yoptions, gint xpadding, gint ypadding ); left_attach參數和right_attach參數將指出在哪兒放置組件,以及用了多少盒子。如果你想在兩行兩列的表格中的右下小格中加入一個(gè)按鈕,并且想讓按鈕充滿(mǎn)那個(gè)小格,則參數可以選擇left_attach = 1, right_attach = 2, top_attach = 1, bottom_attach = 2。其實(shí)left_attach也就是組件所在小格的左邊框是表格的第幾條邊數,其它依此類(lèi)推。 參數xoptions和yoptions是用來(lái)確定打包選項的,可以用OR來(lái)選擇多個(gè)選項。 調節器
GTK有很多組件可以用鼠標或鍵盤(pán)來(lái)調整,例如范圍組件(Range Widget)。還有一些組件在整個(gè)數據區域的一部分是可調整的,例如文本組件(Text Widget)和視口組件(Viewport Widget)。 很明顯,程序是要能夠對可調整組件所產(chǎn)生的變化進(jìn)行處理。一種解決辦法是讓可調整組件在釋放自己的信號時(shí),將調整數據值傳遞信號處理器;蛘哂昧硗庖环N解決將調整數據值放入一個(gè)數據結構,由程序訪(fǎng)問(wèn)該結構來(lái)獲得改變的參數值。有時(shí)候你可能需要將幾個(gè)可調整組件的調節相關(guān)聯(lián),調整一個(gè)也會(huì )導致另一個(gè)的變化。最明顯的例子就是滾動(dòng)條與文本編輯框組件的處理。如果這些相關(guān)聯(lián)的組件分別有自己處理調整數據的方法,則程序員必須自己寫(xiě)一個(gè)信號處理器,將一個(gè)組件的調整數據轉換成另一個(gè)組件的調整數據,并調用調整設置函數將該值設置進(jìn)去。 GTK調用了調節器成功的解決了這個(gè)。調節器不是組件,而是存儲和傳遞調整數據的結構。最典型的調整器是存儲配置參數和范圍組件的值。不同的是調整器也是從對象(Object)繼承而來(lái)的,它有許多不同于數據結構的特性。最重要的是,它也會(huì )釋放信號,并且這些信號不僅可以被程序捕獲來(lái)響應用戶(hù)的調整和編輯,還可以在可調整組件中透明的傳播調整數據。 一般調節器會(huì )創(chuàng )建組件時(shí)自動(dòng)創(chuàng )建。例如讓文本組件和滾動(dòng)條組件用同一個(gè)調節器如下所示: text = gtk_text_new (NULL, NULL); /* 將剛創(chuàng )建的調節器用于垂直滾動(dòng)條 */ vscrollbar = gtk_vscrollbar_new (GTK_TEXT(text)->vadj); 調節器是從對象Object繼承下來(lái)的。所以它與其它的組件對象一樣,能夠產(chǎn)生信號。當好幾個(gè)組件共享一個(gè)調節器時(shí),它們都會(huì )和一個(gè)信號處理器相關(guān)聯(lián)。這個(gè)信號處理器是用來(lái)處理“value_changed”信號的,跟程序中處理信號是一樣。下面是在GtkAdjustmentClass結構中該信號的定義: void (* value_changed) (GtkAdjustment *adjustment); 不同的可調整組件都用一個(gè)調節器時(shí),任何一個(gè)組件發(fā)生調整變化都會(huì )產(chǎn)生該信號。有兩種情況會(huì )導致這個(gè)現象的發(fā)生。第一種情況是用戶(hù)在用鼠標或鍵盤(pán)調整該組件(例如拉滾動(dòng)條),或者直接在程序中用gtk_adjustment_set_value()函數來(lái)改變調節器中的value值。 當調節器的upper參數和lower參數被重新配置時(shí),就象用戶(hù)需要給一個(gè)文本編輯框加入了更多的文本后,調節器就會(huì )釋放出“changed”信號。它的定義如下: void (* changed) (GtkAdjustment *adjustment); 范圍組件將該信號與一個(gè)信號處理器相關(guān)聯(lián),并隨時(shí)在面板上反映參數的變化。舉個(gè)例子,滾動(dòng)條中滑動(dòng)鍵的大小與調節器中upper,lower值之差正好成反比。一旦前者有任何改變,面板上的顯示也會(huì )相應產(chǎn)生變化。 不需要在程序中將一個(gè)信號處理器與該信號相關(guān)聯(lián),一切都是GTK完成的。如果你直接設置了調節器的這些參數,則需要在程序中調用下面的語(yǔ)句來(lái)釋放信號: gtk_signal_emit_by_name (GTK_OBJECT (adjustment), "changed"); 創(chuàng )建組件小結
從上面可看出,創(chuàng )建一個(gè)widget組件可以用以下幾個(gè)步驟完成: gtk_*_new()—調用一個(gè)非常有用的函數來(lái)產(chǎn)生一個(gè)新的widget組件。 4.2用gtk_box_pack_start()函數連接所有的信號和事件,產(chǎn)生相應的事件處理器來(lái)調用回調函數。 4.3設置widget組件以及調節器的特性。 4.4用合適的函數將widget組件打包到一個(gè)容器(盒子或表格)中,例如gtk_box_container_start()函數或者gtk_container_add()函數等。 4.5用gtk_widget_show()函數來(lái)顯示組件。 用上述方法可創(chuàng )建出程序員所需要的任意窗口構件,再將容器打入窗口并顯示窗口之后,程序便進(jìn)入主循環(huán)睡眠狀態(tài),主程序編制也就結束了。事件的處理邏輯放到回調函數中編制。 編譯程序用下面的命令: gcc my_prog.c –o my_prog.o –lgtk –lgdk ↙ 完成后在Xwindow環(huán)境下運行my_prog.o程序即可。 X窗口(Xwindow)和GNU編譯系統已成為應用linux或unix操作系統的機工作站和大型計算機上最主要的圖形用戶(hù)界面系統,在微機上也有廣 泛應用。而GTK正是兩者結合的編程開(kāi)發(fā)包。它比以往用的Xwindow/Motif編程更為簡(jiǎn)單方便,功能也很強大,有著(zhù)較好的應用前景。目前網(wǎng)上已經(jīng)有很多利用該軟件包開(kāi)發(fā)出來(lái)的自由發(fā)布軟件,極大的豐富了Linux平臺的應用。 [] 1.《GTK Turtoil》 Peter Mattis, Spencer Kimball, Josh MacDonald著(zhù)http://www.gtk.org 2.《linux系統管理指南》 M.F.Komarinski,C.Collet著(zhù) 曉冬 馬丁譯 1999,清華大學(xué)出版社 3.《UNIX編程》 W.Richard Stevens著(zhù) 1998,清華大學(xué)出版

【GTK圖形編程】相關(guān)文章:

Linux下的GTK圖形界面編程07-23

探索結對編程09-16

深入Windows通信編程07-12

系統托盤(pán)的編程05-05

LabVIEW與MATLAB混合編程10-25

Visual C#的Excel編程07-12

DOS下DSP播音的編程06-06

ASP 3.0高級編程(二)10-22

ASP 3.0高級編程(一)07-29

JDBC數據庫編程的研究10-18

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频