美章網(wǎng) 資料文庫(kù) GTK圖形編程范文

    GTK圖形編程范文

    本站小編為你精心準(zhǔn)備了GTK圖形編程參考范文,愿這些范文能點(diǎn)燃您思維的火花,激發(fā)您的寫作靈感。歡迎深入閱讀并收藏。

    GTK圖形編程

    【摘要】本文介紹了Linux平臺(tái)下的Xwindow圖形窗口編程工具gtk,并給出了用GTK編程的基本要素和步驟。

    【關(guān)鍵詞】GTK,回調(diào)函數(shù),消息處理器,調(diào)節(jié)器

    GTK(GIMPToolkit)是一個(gè)圖形用戶編程的接口工具。它注冊(cè)完全免費(fèi),所以用來(lái)開(kāi)發(fā)自由軟件或商業(yè)軟件都不需要花費(fèi)什么。現(xiàn)在很多Linux集成系統(tǒng)都已經(jīng)將GTK1.2版本打包進(jìn)去了。包括RedHatLinux6.0以上版本,還有中文化的TurboLinux等等。它也越來(lái)越被普遍的應(yīng)用于UNIX系統(tǒng)編程。

    還有一個(gè)組件叫Glib,它包含了一些標(biāo)準(zhǔn)應(yīng)用的新擴(kuò)展用來(lái)提高GTK的兼容性。用于Linux系統(tǒng)的某些函數(shù)可能不適合標(biāo)準(zhǔn)的UNIX系統(tǒng),例如g_strerror()函數(shù)等等。某些函數(shù)也擴(kuò)展了GNUC的一般功能,例如g_malloc函數(shù)就有自己加強(qiáng)的調(diào)試功能。

    GTK可以與多種語(yǔ)言綁定,包括C++,Guile,Perl,Python,Ton,Ada95,ObjectiveC,FreePascal,Eiffel。用標(biāo)準(zhǔn)C開(kāi)發(fā)的程序,編譯軟件可用GNU并附帶上GTK選項(xiàng)即可。想用除了標(biāo)準(zhǔn)C以外的其它語(yǔ)言來(lái)開(kāi)發(fā)Xwindow圖形用戶程序,則需要先參考一下有關(guān)綁定軟件的內(nèi)容()。如果用C++語(yǔ)言來(lái)調(diào)用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的增強(qiáng)版GTK+。GTK+是將GTK,GDK,GLIB集成在一起的開(kāi)發(fā)包,可以工作在許多類似于UNIX的系統(tǒng)上,沒(méi)有GTK的平臺(tái)限制。

    1.GTK的消息處理機(jī)制

    下面我們先看一個(gè)基本的例子,該例子產(chǎn)生一個(gè)200×200像素的窗口。它不能自己退出,只能通過(guò)shell來(lái)殺死進(jìn)程(調(diào)用kill命令)。

    /*例子base.c*/

    #include<gtk/gtk.h>

    intmain(intargc,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è)事件驅(qū)動(dòng)工具包,當(dāng)它運(yùn)行到gtk_main()函數(shù)時(shí)會(huì)自動(dòng)睡眠,直到有事件發(fā)生,控制權(quán)轉(zhuǎn)讓給相應(yīng)的函數(shù)調(diào)用,在該函數(shù)中可以用標(biāo)準(zhǔn)C寫出相應(yīng)的事物邏輯。這與windows上的程序處理是一樣的。

    對(duì)窗口對(duì)象上發(fā)生的事件(如按下鼠標(biāo),激活鍵盤等),GTK也有相應(yīng)的消息信號(hào)產(chǎn)生。這時(shí)就需要程序員創(chuàng)建一個(gè)信號(hào)處理器來(lái)捕獲該信號(hào),并告訴GTK程序事件發(fā)生后調(diào)用哪個(gè)回調(diào)函數(shù)。信號(hào)處理器的創(chuàng)建函數(shù)定義如下:

    gintgtk_signal_connect(GtkObject*object,gchar*name,GtkSignalFunccallback_func,gpointerfunc_data);

    返回值是一個(gè)區(qū)分同一對(duì)象中的事件與不同回調(diào)函數(shù)的關(guān)聯(lián)標(biāo)簽。這樣可以做到一個(gè)對(duì)象的一個(gè)信號(hào)就有任意多個(gè)回調(diào)函數(shù),并且每一個(gè)都會(huì)按照聲明的順序執(zhí)行。函數(shù)調(diào)用的第一個(gè)參數(shù)是產(chǎn)生信號(hào)的widget組件(即按鈕等窗口構(gòu)件),而name則是希望捕獲的信號(hào)或事件的名稱,callback_func則是事件發(fā)生后所調(diào)用的回調(diào)函數(shù)名稱,而第四個(gè)參數(shù)func_data則是傳遞給回調(diào)函數(shù)的參數(shù)。

    回調(diào)函數(shù)要定義在主程序的前面,它們的一般格式都如下所示:

    voidcallback_func(GtkWidget*widget,gpointerfunc_data);

    調(diào)用下面這個(gè)方法將允許你將回調(diào)函數(shù)與事件的關(guān)聯(lián)斷開(kāi):

    voidgtk_signal_disconnect(GtkObject*object,gintid);

    該函數(shù)的第二個(gè)參數(shù)就是上述gtk_signal_connect()函數(shù)的返回值,即關(guān)聯(lián)標(biāo)簽。第一個(gè)參數(shù)指向了去除關(guān)聯(lián)的對(duì)象名稱。這樣可以做到斷開(kāi)事件與回調(diào)函數(shù)的關(guān)聯(lián),使得事件發(fā)生后,不會(huì)調(diào)用相關(guān)的回調(diào)函數(shù)。

    布局格式

    2.1打包盒子

    對(duì)GTK顯示格式的控制是通常通過(guò)打包盒子來(lái)完成的。widget組件打包可以采用兩種方式,水平盒子和垂直盒子。若將widget組件打包進(jìn)平行盒子,組件就被依次水平的插入窗口;若是垂直盒子,則組件排列是垂直的。產(chǎn)生新的水平盒子的函數(shù)為

    GtkWidget*gtk_hbox_new(ginthomogeneous,gintspacing);

    參數(shù)homogeneous是用來(lái)控制是否盒子中的每個(gè)組件都有同樣的大小(例如水平盒子中的控件有同樣的寬度,垂直盒子中的控件有同樣的高度)。Spacing參數(shù)是組件之間的間隔。

    垂直盒子的創(chuàng)建函數(shù)是gtk_vbox_new(),定義與水平盒子一致。

    gtk_box_pack_start()和gtk_box_pack_end()函數(shù)是用來(lái)將打包對(duì)象放入這些盒子中的。

    voidgtk_box_pack_start(GtkBox*box,GtkWidget*child,gintexpand,gintfill,gintpadding);

    第一個(gè)參數(shù)是你將組件打進(jìn)去的盒子指針,第二個(gè)參數(shù)是你將要打進(jìn)去的組件指針。Expand參數(shù)是用來(lái)控制是否允許組件擴(kuò)展至分配給盒子空間的大小(選TRUE),還是盒子的大小收縮到組件那么大(選FALSE)。函數(shù)中的fill參數(shù)是用來(lái)控制是否將多余的空間分配給組件,即將組件擴(kuò)展到盒子的大小(選TRUE),或者多余的空間不變,保留作為盒子和打包組件間的間隔。該參數(shù)只有在expand參數(shù)取TRUE時(shí)才有效。Padding參數(shù)是指組件四周與盒子的間隔大小。

    注意fill取FALSE值,expand取TRUE值時(shí)與expand取FALSE值,fill值無(wú)效的區(qū)別。前者的盒子仍是原來(lái)創(chuàng)建盒子時(shí)指定的大小,而后者的盒子已經(jīng)縮小到打包組件的大小了。

    gtk_box_pack_end()函數(shù)的參數(shù)與上面描述的一致。只是排列順序分別是從下到上

    ,從右到左。

    最后將所有的盒子或組件打包到一個(gè)大盒子中,用gtk_container_add()函數(shù)將盒子加入窗口即可。

    2.2表格打包

    我們可以產(chǎn)生一個(gè)表格,將widget組件一一放入。Widget組件將占據(jù)所有分配給它的空間。創(chuàng)建表格是用下面的函數(shù):

    GtkWidget*gtk_br_new(gintrows,gintcolumns,ginthomogeneous);

    第一個(gè)參數(shù),顯而易見(jiàn),是表格的行數(shù)。后面的參數(shù)則是表格的列數(shù)。homogeneous參數(shù)則是用來(lái)安排表格間隔大小。如果它取TRUE,則表格中每個(gè)小格的大小用表格中最大組件的大小來(lái)設(shè)置的,所有的小格大小都是一樣的。如果homogeneous參數(shù)取FALSE的,每個(gè)小格的大小都用同行中最高組件的高度,同列中最寬組件的寬度。

    將一個(gè)widget組件放入一個(gè)表格,用下面的函數(shù):

    voidgtk_br_attach(Gtkbr*br,GtkWidget*child,gintleft_attach,

    gintright_attach,ginttop_attach,gintbottom_attach,

    gintxoptions,gintyoptions,gintxpadding,gintypadding);

    left_attach參數(shù)和right_attach參數(shù)將指出在哪兒放置組件,以及用了多少盒子。如果你想在兩行兩列的表格中的右下小格中加入一個(gè)按鈕,并且想讓按鈕充滿那個(gè)小格,則參數(shù)可以選擇left_attach=1,right_attach=2,top_attach=1,bottom_attach=2。其實(shí)left_attach也就是組件所在小格的左邊框是表格的第幾條邊數(shù),其它依此類推。

    參數(shù)xoptions和yoptions是用來(lái)確定打包選項(xiàng)的,可以用OR來(lái)選擇多個(gè)選項(xiàng)。

    調(diào)節(jié)器

    GTK有很多組件可以用鼠標(biāo)或鍵盤來(lái)調(diào)整,例如范圍組件(RangeWidget)。還有一些組件在整個(gè)數(shù)據(jù)區(qū)域的一部分是可調(diào)整的,例如文本組件(TextWidget)和視口組件(ViewportWidget)。

    很明顯,程序是要能夠?qū)烧{(diào)整組件所產(chǎn)生的變化進(jìn)行處理。一種解決辦法是讓可調(diào)整組件在釋放自己的信號(hào)時(shí),將調(diào)整數(shù)據(jù)值傳遞信號(hào)處理器。或者用另外一種解決方法將調(diào)整數(shù)據(jù)值放入一個(gè)數(shù)據(jù)結(jié)構(gòu),由程序訪問(wèn)該結(jié)構(gòu)來(lái)獲得改變的參數(shù)值。有時(shí)候你可能需要將幾個(gè)可調(diào)整組件的調(diào)節(jié)相關(guān)聯(lián),調(diào)整一個(gè)也會(huì)導(dǎo)致另一個(gè)的變化。最明顯的例子就是滾動(dòng)條與文本編輯框組件的處理。如果這些相關(guān)聯(lián)的組件分別有自己處理調(diào)整數(shù)據(jù)的方法,則程序員必須自己寫一個(gè)信號(hào)處理器,將一個(gè)組件的調(diào)整數(shù)據(jù)轉(zhuǎn)換成另一個(gè)組件的調(diào)整數(shù)據(jù),并調(diào)用調(diào)整設(shè)置函數(shù)將該值設(shè)置進(jìn)去。

    GTK調(diào)用了調(diào)節(jié)器成功的解決了這個(gè)問(wèn)題。調(diào)節(jié)器不是組件,而是存儲(chǔ)和傳遞調(diào)整數(shù)據(jù)的結(jié)構(gòu)。最典型的調(diào)整器應(yīng)用是存儲(chǔ)配置參數(shù)和范圍組件的值。不同的是調(diào)整器也是從對(duì)象(Object)繼承而來(lái)的,它有許多不同于數(shù)據(jù)結(jié)構(gòu)的特性。最重要的是,它也會(huì)釋放信號(hào),并且這些信號(hào)不僅可以被程序捕獲來(lái)響應(yīng)用戶的調(diào)整和編輯,還可以在可調(diào)整組件中透明的傳播調(diào)整數(shù)據(jù)。

    一般調(diào)節(jié)器會(huì)創(chuàng)建組件時(shí)自動(dòng)創(chuàng)建。例如讓文本組件和滾動(dòng)條組件用同一個(gè)調(diào)節(jié)器如下所示:

    text=gtk_text_new(NULL,NULL);

    /*將剛創(chuàng)建的調(diào)節(jié)器用于垂直滾動(dòng)條*/

    vscrollbar=gtk_vscrollbar_new(GTK_TEXT(text)->vadj);

    調(diào)節(jié)器是從對(duì)象Object繼承下來(lái)的。所以它與其它的組件對(duì)象一樣,能夠產(chǎn)生信號(hào)。當(dāng)好幾個(gè)組件共享一個(gè)調(diào)節(jié)器時(shí),它們都會(huì)和一個(gè)信號(hào)處理器相關(guān)聯(lián)。這個(gè)信號(hào)處理器是用來(lái)處理“value_changed”信號(hào)的,跟程序中處理信號(hào)是一樣。下面是在GtkAdjustmentClass結(jié)構(gòu)中該信號(hào)的定義:

    void(*value_changed)(GtkAdjustment*adjustment);

    不同的可調(diào)整組件都用一個(gè)調(diào)節(jié)器時(shí),任何一個(gè)組件發(fā)生調(diào)整變化都會(huì)產(chǎn)生該信號(hào)。有兩種情況會(huì)導(dǎo)致這個(gè)現(xiàn)象的發(fā)生。第一種情況是用戶在用鼠標(biāo)或鍵盤調(diào)整該組件(例如拉滾動(dòng)條),或者直接在程序中用gtk_adjustment_set_value()函數(shù)來(lái)改變調(diào)節(jié)器中的value值。

    當(dāng)調(diào)節(jié)器的upper參數(shù)和lower參數(shù)被重新配置時(shí),就象用戶需要給一個(gè)文本編輯框加入了更多的文本后,調(diào)節(jié)器就會(huì)釋放出“changed”信號(hào)。它的定義如下:

    void(*changed)(GtkAdjustment*adjustment);

    范圍組件將該信號(hào)與一個(gè)信號(hào)處理器相關(guān)聯(lián),并隨時(shí)在面板上反映參數(shù)的變化。舉個(gè)例子,滾動(dòng)條中滑動(dòng)鍵的大小與調(diào)節(jié)器中upper,lower值之差正好成反比。一旦前者有任何改變,面板上的顯示也會(huì)相應(yīng)產(chǎn)生變化。

    不需要在程序中將一個(gè)信號(hào)處理器與該信號(hào)相關(guān)聯(lián),一切都是GTK完成的。如果你直接設(shè)置了調(diào)節(jié)器的這些參數(shù),則需要在程序中調(diào)用下面的語(yǔ)句來(lái)釋放信號(hào):

    gtk_signal_emit_by_name(GTK_OBJECT(adjustment),"changed");

    創(chuàng)建組件小結(jié)

    從上面可看出,創(chuàng)建一個(gè)widget組件可以用以下幾個(gè)步驟完成:

    gtk_*_new()—調(diào)用一個(gè)非常有用的函數(shù)來(lái)產(chǎn)生一個(gè)新的widget組件。

    4.2用gtk_box_pack_start()函數(shù)連接所有的信號(hào)和事件,產(chǎn)生相應(yīng)的事件處理器來(lái)調(diào)用回調(diào)函數(shù)。

    4.3設(shè)置widget組件以及調(diào)節(jié)器的特性。

    4.4用合適的函數(shù)將widget組件打包到一個(gè)容器(盒子或表格)中,例如gtk_box_container_start()函數(shù)或者gtk_container_add()函數(shù)等。

    4.5用gtk_widget_show()函數(shù)來(lái)顯示組件。

    用上述方法可創(chuàng)建出程序員所需要的任意窗口構(gòu)件,再將容器打入窗口并顯示窗口之后,程序便進(jìn)入主循環(huán)睡眠狀態(tài),主程序編制也就結(jié)束了。事件的處理邏輯放到回調(diào)函數(shù)中編制。

    編譯程序用下面的命令:

    gccmy_prog.c–omy_prog.o–lgtk–lgdk↙

    完成后在Xwindow環(huán)境下運(yùn)行my_prog.o程序即可。

    目前X窗口(Xwindow)和GNU編譯系統(tǒng)已成為應(yīng)用linux或unix操作系統(tǒng)的計(jì)算機(jī)工作站和大型計(jì)算機(jī)上最主要的圖形用戶界面系統(tǒng),在微機(jī)上也有廣

    泛應(yīng)用。而GTK正是兩者結(jié)合的編程開(kāi)發(fā)包。它比以往用的Xwindow/Motif編程更為簡(jiǎn)單方便,功能也很強(qiáng)大,有著較好的應(yīng)用前景。目前網(wǎng)上已經(jīng)有很多利用該軟件包開(kāi)發(fā)出來(lái)的自由軟件,極大的豐富了Linux平臺(tái)的應(yīng)用。

    主站蜘蛛池模板: 亚洲日本一区二区一本一道 | 韩国精品一区二区三区无码视频| 精品三级AV无码一区| 无码人妻精品一区二区三区东京热 | 一区二区三区四区在线观看视频| 中文字幕Av一区乱码| 国产视频一区在线播放| 日韩AV无码久久一区二区| 日本韩国黄色一区二区三区 | 亚洲综合无码AV一区二区| 一区免费在线观看| 国产一区二区三区在线观看影院| 亚洲午夜电影一区二区三区 | 精品乱子伦一区二区三区| 在线日韩麻豆一区| 欧美一区内射最近更新| 亚洲丶国产丶欧美一区二区三区| 人妻少妇精品视频一区二区三区| 久久国产午夜精品一区二区三区 | 日本免费一区二区三区四区五六区 | 亚洲色偷偷偷网站色偷一区| 色久综合网精品一区二区| 色狠狠色噜噜Av天堂一区| 国产在线观看一区二区三区精品 | 国产成人一区二区精品非洲| 日韩精品无码视频一区二区蜜桃| 国产一区二区三区91| 亚洲AV本道一区二区三区四区| 四虎成人精品一区二区免费网站| 无码av免费一区二区三区试看| 亚洲一区二区精品视频| 波多野结衣一区二区三区高清av | 亚洲制服丝袜一区二区三区| 国产成人精品一区二区三区| 亚洲欧洲精品一区二区三区| 久久精品一区二区三区日韩| 亚洲乱码一区二区三区在线观看| 国产精品免费视频一区| 成人免费视频一区二区三区| 国产精品成人一区二区三区| 无码中文人妻在线一区|