日韩欧美视频一区-日韩欧美三区-日韩欧美群交P内射捆绑-日韩欧美精品有码在线播放免费-成人免费一区二区无码视频-成人免费一级毛片在线播放视频

樹人論文網一個專業的學術咨詢網站!!!
樹人論文網

GTK圖形編程省級論文發表網

來源: 樹人論文網發表時間:2013-08-27
簡要:本文介紹了Linux平臺下的Xwindow圖形窗口編程工具GTK,并給出了用GTK編程的基本要素和步驟。

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

  【關鍵詞】GTK,回調函數,消息處理器,調節器

  GTK(GIMP Toolkit)是一個圖形用戶編程的接口工具。它注冊完全免費,所以用來開發自由軟件或商業軟件都不需要花費什么。現在很多Linux集成系統都已經將GTK1.2版本打包進去了。包括RedHat Linux 6.0以上版本,還有中文化的Turbo Linux等等。它也越來越被普遍的應用于UNIX系統編程。

  還有一個組件叫Glib,它包含了一些標準應用的新擴展用來提高GTK的兼容性。用于Linux系統的某些函數可能不適合標準的UNIX系統,例如g_strerror()函數等等。某些函數也擴展了GNUC的一般功能,例如g_malloc函數就有自己加強的調試功能。

  GTK可以與多種語言綁定,包括C++, Guile, Perl, Python, Ton, Ada95, Objective C, Free Pascal, Eiffel。用標準C開發的程序,編譯軟件可用GNU并附帶上GTK選項即可。想用除了標準C以外的其它語言來開發Xwindow圖形用戶程序,則需要先參考一下有關綁定軟件的內容(HTTP:// www.gtk.org)。 如果用C++語言來調用GTK進行開發,可以用已經和C++綁定的軟件叫GTK--軟件,來提供一個比GTK更好的C++編譯環境。

  目前已經開發出來GTK的增強版GTK+。GTK+是將GTK,GDK,GLIB集成在一起的開發包,可以工作在許多類似于UNIX的系統上,沒有GTK的平臺限制。

  1.GTK的消息處理機制

  下面我們先看一個基本的例子,該例子產生一個200×200像素的窗口。它不能自己退出,只能通過shell來殺死進程(調用kill命令)。

  /*例子 base.c */

  #include

  int main( int argc,char *argv[ ] ){

  GtkWidget *window;

  gtk_init (&argc, &argv); /* 初始化顯示環境 */

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* 創建一個新的窗口*/

  gtk_widget_show (window); /*顯示窗口*/

  gtk_main (); /*進入睡眠狀態,等待事件激活*/

  return(0);

  }

  從上面的程序可以看出,GTK是一個事件驅動工具包,當它運行到gtk_main()函數時會自動睡眠,直到有事件發生,控制權申請給相應的函數調用,在該函數中可以用標準C寫出相應的事物邏輯。這與windows 上的程序處理是一樣的。

  對窗口對象上發生的事件(如按下鼠標,激活鍵盤等),GTK也有相應的消息信號產生。這時就需要程序員創建一個信號處理器來捕獲該信號,并告訴GTK程序事件發生后調用哪個回調函數。信號處理器的創建函數定義如下:

  gint gtk_signal_connect( GtkObject *object, gchar *name,GtkSignalFunc callback_func, gpointer func_data );

  返回值是一個區分同一對象中的事件與不同回調函數的關聯標簽。這樣可以做到一個對象的一個信號就有任意多個回調函數,并且每一個都會按照聲明的順序執行。函數調用的第一個參數是產生信號的widget組件(即按鈕等窗口構件),而name則是希望捕獲的信號或事件的名稱,callback_func則是事件發生后所調用的回調函數名稱,而第四個參數func_data則是傳遞給回調函數的參數。

  回調函數要定義在主程序的前面,它們的一般格式都如下所示:

  void callback_func( GtkWidget *widget, gpointer func_data );

  調用下面這個方法將允許你將回調函數與事件的關聯斷開:

  void gtk_signal_disconnect( GtkObject *object, gint id );

  該函數的第二個參數就是上述gtk_signal_connect()函數的返回值,即關聯標簽。第一個參數指向了去除關聯的對象名稱。這樣可以做到斷開事件與回調函數的關聯,使得事件發生后,不會調用相關的回調函數。

  布局格式

  2.1打包盒子

  對GTK顯示格式的控制是通常通過打包盒子來完成的。widget組件打包可以采用兩種方式,水平盒子和垂直盒子。若將widget組件打包進平行盒子,組件就被依次水平的插入窗口;若是垂直盒子,則組件排列是垂直的。產生新的水平盒子的函數為

  GtkWidget *gtk_hbox_new (gint homogeneous, gint spacing);

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

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

  gtk_box_pack_start()和gtk_box_pack_end()函數是用來將打包對象放入這些盒子中的。

  void gtk_box_pack_start( GtkBox *box, GtkWidget *child,gint expand, gint fill, gint padding );

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

  注意fill取FALSE值,expand取TRUE值時與expand取FALSE值,fill值無效的區別。前者的盒子仍是原來創建盒子時指定的大小,而后者的盒子已經縮小到打包組件的大小了。

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

  ,從右到左。

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

  2.2表格打包

  我們可以產生一個表格,將widget組件一一放入。Widget組件將占據所有分配給它的空間。創建表格是用下面的函數:

  GtkWidget *gtk_table_new( gint rows, gint columns,gint homogeneous );

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

  將一個widget組件放入一個表格,用下面的函數:

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

  參數xoptions和yoptions是用來確定打包選項的,可以用OR來選擇多個選項。

  調節器

  GTK有很多組件可以用鼠標或鍵盤來調整,例如范圍組件(Range Widget)。還有一些組件在整個數據區域的一部分是可調整的,例如文本組件(Text Widget)和視口組件(Viewport Widget)。

  很明顯,程序是要能夠對可調整組件所產生的變化進行處理。一種解決辦法是讓可調整組件在釋放自己的信號時,將調整數據值傳遞信號處理器。或者用另外一種解決方法將調整數據值放入一個數據結構,由程序訪問該結構來獲得改變的參數值。有時候你可能需要將幾個可調整組件的調節相關聯,調整一個也會導致另一個的變化。最明顯的例子就是滾動條與文本編輯框組件的處理。如果這些相關聯的組件分別有自己處理調整數據的方法,則程序員必須自己寫一個信號處理器,將一個組件的調整數據轉換成另一個組件的調整數據,并調用調整設置函數將該值設置進去。

  GTK調用了調節器成功的解決了這個問題。調節器不是組件,而是存儲和傳遞調整數據的結構。最典型的調整器應用是存儲配置參數和范圍組件的值。不同的是調整器也是從對象(Object)繼承而來的,它有許多不同于數據結構的特性。最重要的是,它也會釋放信號,并且這些信號不僅可以被程序捕獲來響應用戶的調整和編輯,還可以在可調整組件中透明的傳播調整數據。

  一般調節器會創建組件時自動創建。例如讓文本組件和滾動條組件用同一個調節器如下所示:

  text = gtk_text_new (NULL, NULL);

  /* 將剛創建的調節器用于垂直滾動條 */

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

  調節器是從對象Object繼承下來的。所以它與其它的組件對象一樣,能夠產生信號。當好幾個組件共享一個調節器時,它們都會和一個信號處理器相關聯。這個信號處理器是用來處理“value_changed”信號的,跟程序中處理信號是一樣。下面是在GtkAdjustmentClass結構中該信號的定義:

  void (* value_changed) (GtkAdjustment *adjustment);

  不同的可調整組件都用一個調節器時,任何一個組件發生調整變化都會產生該信號。有兩種情況會導致這個現象的發生。第一種情況是用戶在用鼠標或鍵盤調整該組件(例如拉滾動條),或者直接在程序中用gtk_adjustment_set_value()函數來改變調節器中的value值。

  當調節器的upper參數和lower參數被重新配置時,就象用戶需要給一個文本編輯框加入了更多的文本后,調節器就會釋放出“changed”信號。它的定義如下:

  void (* changed) (GtkAdjustment *adjustment);

  范圍組件將該信號與一個信號處理器相關聯,并隨時在面板上反映參數的變化。舉個例子,滾動條中滑動鍵的大小與調節器中upper,lower值之差正好成反比。一旦前者有任何改變,面板上的顯示也會相應產生變化。

  不需要在程序中將一個信號處理器與該信號相關聯,一切都是GTK完成的。如果你直接設置了調節器的這些參數,則需要在程序中調用下面的語句來釋放信號:

  gtk_signal_emit_by_name (GTK_OBJECT (adjustment), changed);

  創建組件小結

  從上面可看出,創建一個widget組件可以用以下幾個步驟完成:

  gtk_*_new()—調用一個非常有用的函數來產生一個新的widget組件。

  4.2用gtk_box_pack_start()函數連接所有的信號和事件,產生相應的事件處理器來調用回調函數。

  4.3設置widget組件以及調節器的特性。

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

  4.5用gtk_widget_show()函數來顯示組件。

  用上述方法可創建出程序員所需要的任意窗口構件,再將容器打入窗口并顯示窗口之后,程序便進入主循環睡眠狀態,主程序編制也就結束了。事件的處理邏輯放到回調函數中編制。

  編譯程序用下面的命令:

  gcc my_prog.c –o my_prog.o –lgtk –lgdk ↙

  完成后在Xwindow環境下運行my_prog.o程序即可。

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

  泛應用。而GTK正是兩者結合的編程開發包。它比以往用的Xwindow/Motif編程更為簡單方便,功能也很強大,有著較好的應用前景。目前網上已經有很多利用該軟件包開發出來的自由發布軟件,極大的豐富了Linux平臺的應用。

  [參考文獻]

  1.《GTK Turtoil》 Peter Mattis, Spencer Kimball, Josh MacDonald著http://www.gtk.org

  2.《linux系統管理指南》 M.F.Komarinski,C.Collet著 曉冬 馬丁譯 1999,清華大學出版社

  3.《UNIX網絡編程》 W.Richard Stevens著 1998,清華大學出版

主站蜘蛛池模板: 2017最新伦理伦理片67 | 久久精品视频在线看 | 国产无遮挡无码视频在线观看不卡 | 国产色综合色产在线视频 | 国产日韩成人内射视频 | 亚洲免费在线播放 | 亚洲黄色在线播放 | 国产一区免费在线观看 | 依人在线观看 | 日韩做A爰片久久毛片A片毛茸茸 | 欧美一区二区日韩一区二区 | 国产精品久久久久久人妻香蕉 | 国产福利视频一区二区 | 在线 | 果冻国产传媒61国产免费 | 东京热无码中文字幕av专区 | 永久免费看A片无码网站四虎 | 在线视频一区二区三区在线播放 | 午夜福利院电影 | 国产曰批试看免费视频播放免费 | 影音先锋色小姐 | 综合人妻久久一区二区精品 | 动漫美女被h动态图 | 2019在秋霞理论 | 麻豆影视在线直播观看免费 | 久久精品视频16 | 拔萝卜视频免费看高清 | 嫩B人妻精品一区二区三区 内射一区二区精品视频在线观看 | 大陆女人内谢69XXXORG | 国产国产人免费观看在线视频 | 亚洲欧洲自拍偷拍 | 99久久99| 国产SUV精品一区二区883 | 久久re视频精品538在线 | 日本午夜精品理论片A级APP发布 | yellow片在线观看免费观看动漫 | 妹妹好色网| 日韩大胆视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 丰满艳妇亲伦 | 饥渴难耐的浪荡艳妇在线观看 | 牛牛在线国产精品 |