GTK培訓(xùn)教程(課堂PPT)_第1頁
GTK培訓(xùn)教程(課堂PPT)_第2頁
GTK培訓(xùn)教程(課堂PPT)_第3頁
GTK培訓(xùn)教程(課堂PPT)_第4頁
GTK培訓(xùn)教程(課堂PPT)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1GTK培訓(xùn)教程2GTK培訓(xùn)教程 GTK簡介 GTK開始例子 信號和回調(diào)函數(shù) GTK構(gòu)件 GTK高級應(yīng)用 Anjuta3GTK簡介 GTK(GIMP Tool Kit)是一套用于創(chuàng)建圖形用戶界面的工具包。它遵循 LGPL許可證,可以用它來開發(fā)開源軟件、自由軟件,甚至是封閉源代碼的商業(yè)軟件,而不用花費任何錢來購買許可證和使用權(quán)。 GTK 實質(zhì)上是一個面向?qū)ο蟮膽?yīng)用程序接口 (API)。盡管完全用 C 寫成的,但它是基于類和回調(diào)函數(shù) (指向函數(shù)的指針) 的思想實現(xiàn)的。 要了解GTK的更多信息,可參閱網(wǎng)上的網(wǎng)上教程和包括在標準GTK發(fā)表版本中examples目錄下的例程。 GTK項目的web站點(h

2、ttp:/)4GTK培訓(xùn)教程 GTK簡介 GTK開始例子 信號和回調(diào)函數(shù) GTK構(gòu)件 GTK高級應(yīng)用 Anjuta5GTK開始例子Hello World 例子代碼:base.c 編譯: gcc base.c -o base pkg-config -cflags -libs gtk+-2.0 運行結(jié)果: 說明: gtk_init,任何gtk程序開始時,都需調(diào)用該函數(shù) gtk_window_new,創(chuàng)建一個窗口 gtk_widget_show,顯示窗口1. gtk_main(),進入 GTK 主處理循環(huán),是另一個可以在每個 GTK 程序中見到的函數(shù)調(diào)用。當(dāng)程序運行到這里,GT

3、K 會“睡著”等待 X 事件 (如按鈕或鍵盤按下)、超時(timeouts)或文件 IO 通知發(fā)生。6GTK培訓(xùn)教程 GTK簡介 GTK開始例子 信號和回調(diào)函數(shù) GTK構(gòu)件 GTK高級應(yīng)用 Anjuta7信號和回調(diào)函數(shù) GTK 是一個事件驅(qū)動的工具包,意味著它會等在 gtk_main() 那里,直到下一個事件發(fā)生,才把控制權(quán)傳給適當(dāng)?shù)暮瘮?shù)。控制權(quán)的傳遞是使用“信號”的辦法來完成的。當(dāng)一個事件發(fā)生時,如按一下鼠標鍵,所按的構(gòu)件會“發(fā)出”適當(dāng)?shù)男盘?。這就是 GTK 的工作機制。 要使一個按鈕執(zhí)行一個動作,我們需設(shè)置信號和信號處理函數(shù)之間的連接,g_signal_connect實現(xiàn)這樣的設(shè)置。gul

4、ong g_signal_connect( gpointer *object, const gchar *name, GCallback func, gpointer func_data )第一個參數(shù)是要發(fā)出信號的構(gòu)件,第二個參數(shù)是你想要連接的信號的名稱,第三個參數(shù)是信號被捕獲時所要調(diào)用的函數(shù),第四個參數(shù)是你想傳遞給這個函數(shù)的數(shù)據(jù)。第三個參數(shù)指定的函數(shù)叫做回調(diào)函數(shù),一般為下面的形式: void callback_func( GtkWidget *widget, gpointer callback_data ); 例子代碼:signal.c運行:8GTK培訓(xùn)教程 GTK簡介 GTK開始例子 信號

5、和回調(diào)函數(shù) GTK構(gòu)件 GTK高級應(yīng)用 Anjuta9組裝構(gòu)件組裝構(gòu)件介紹創(chuàng)建一個應(yīng)用軟件的時候,你可能希望在窗口里放置超過一個以上的構(gòu)件。當(dāng)我們僅用了一個構(gòu)件時,可以簡單地使用 gtk_container_add()來“組裝”這個構(gòu)件到窗口中。但當(dāng)你想要放置更多的構(gòu)件到一個窗口中時,這時就要用到組裝(Packing)了。組裝盒的原理 多數(shù)組裝是通過創(chuàng)建一些“盒(boxes)”來達成的,這是些不可見的構(gòu)件容器,它們有兩種形式:一種是橫向盒(horizontal box),一種是縱向盒(vertical box)。當(dāng)我們組裝構(gòu)件到橫向盒里時,這些構(gòu)件就依著我們調(diào)用的順序由左至右或從右到左水平地插

6、入進去。在縱向盒里,則從頂部到底部或相反地組裝構(gòu)件,你可以使用任意的盒組合,比如盒套盒或者盒挨著盒,用以產(chǎn)生你想要的效果。10組裝構(gòu)件 組裝 常用方法gtk_box_pack_start() 和 gtk_box_pack_end() 函數(shù)用來將對象組裝到這些容器中。gtk_box_pack_start() 將對象從上到下組裝到縱向盒中,或者從左到右組裝到橫向盒中。gtk_box_pack_end() 則相反,從下到上組裝到縱向盒中,或者從右到左組裝到橫向盒中。使用這些函數(shù)允許我們調(diào)整自己的構(gòu)件向左或向右對齊,同時也可以混入一些其它的方法來達到我們想要的設(shè)計效果。 另一種組裝的方法 - 表表 g

7、tk_table_new gtk_table_attach 11構(gòu)件概述 在 GTK 中創(chuàng)建一個構(gòu)件的一般步驟是: gtk_*_new() - 創(chuàng)建各種構(gòu)件的函數(shù)。 把所有想連接的信號都連接到對應(yīng)的信號處理函數(shù)。 設(shè)定構(gòu)件的屬性。 用 gtk_container_add() or gtk_box_pack_start()等適當(dāng)?shù)暮瘮?shù)把構(gòu)件放置到一個容器構(gòu)件中。 gtk_widget_show() 顯示構(gòu)件。1. gtk_widget_show() 讓 GTK 知道我們已經(jīng)完成設(shè)定構(gòu)件屬性的工作,并且能夠讓它顯示出來了。你也可以用 gtk_widget_hide 使構(gòu)件再次隱藏起來。各個構(gòu)件顯示

8、的順序并不重要,不過建議在最后顯示窗口,這樣整個窗口就可以一次彈出來,而不是讓用戶看著窗口里的構(gòu)件一個個生成并顯示出來。在窗口(也是一個構(gòu)件)用 gtk_widget_show() 函數(shù)顯示出來之前,它的子構(gòu)件并不會被顯示。12構(gòu)件按鈕構(gòu)件 一般按鈕gtk_button_new_with_label、gtk_button_new_with_mnemonic創(chuàng)建一個帶標簽的按鈕gtk_button_new_from_stock從一個原料(stock)項創(chuàng)建一個包含圖像和文本的按鈕gtk_button_new() 創(chuàng)建一個空白按鈕 開關(guān)按鈕(toggle) 復(fù)選按鈕(check) 單選按鈕(rad

9、io) 事件pressed - 當(dāng)鼠標鍵在按鈕構(gòu)件里按下時發(fā)出released - 當(dāng)鼠標鍵在按鈕構(gòu)件里釋放時發(fā)出clicked - 當(dāng)鼠標鍵在按鈕構(gòu)件里按下并接著在按鈕構(gòu)件里釋放時發(fā)出enter - 當(dāng)鼠標光標進入按鈕構(gòu)件時發(fā)出1.leave - 當(dāng)鼠標光標離開按鈕構(gòu)件時發(fā)出13構(gòu)件范圍構(gòu)件概述范圍構(gòu)件(Range Widgets)是一大類構(gòu)件,包含常見的滾動條構(gòu)件(Scrollbar Widgets)和較少見的“比例”構(gòu)件(Scale Widgets)。盡管這兩種構(gòu)件是用于不同的目的,它們在功能和實現(xiàn)上都是非常相似的。所有范圍構(gòu)件都包含一個“滑槽(trough)”和一個“滑塊(slider

10、)”。滾動條構(gòu)件 一般只用于滾動其它的構(gòu)件,比如列表、文本構(gòu)件,或視角構(gòu)件。滾動條構(gòu)件創(chuàng)建函數(shù) GtkWidget *gtk_hscrollbar_new( GtkAdjustment *adjustment ); GtkWidget *gtk_vscrollbar_new( GtkAdjustment *adjustment );adjustment參數(shù)可以是一個指向已有調(diào)整對象的指針或 NULL,當(dāng)為NULL時會自動創(chuàng)建一個。 14構(gòu)件范圍構(gòu)件比例構(gòu)件比例構(gòu)件(Scale widgets)一般用于允許用戶在一個指定的取值范圍你可視地選擇和操縱一個值。比例構(gòu)件創(chuàng)建函數(shù) GtkWidget *

11、gtk_vscale_new( GtkAdjustment *adjustment ); GtkWidget *gtk_vscale_new_with_range( gdouble min, gdouble max, gdouble step ); GtkWidget *gtk_hscale_new( GtkAdjustment *adjustment ); GtkWidget *gtk_hscale_new_with_range( gdouble min, gdouble max, gdouble step ); 函數(shù) gtk_scale_set_draw_value/滑槽的旁邊是否以數(shù)字形

12、式顯示其當(dāng)前值 gtk_scale_set_digits /設(shè)置要顯示的小數(shù)位數(shù) gtk_scale_set_value_pos/顯示的值可放在滑槽附近的不同位置 15構(gòu)件菜單構(gòu)件 手工創(chuàng)建菜單創(chuàng)建菜單欄和子菜單時要用到三種構(gòu)件:一個菜單項(menu item),就是用戶要選擇的東西,比如,Save“GtkWidget *gtk_menu_item_new( void ); 一個菜單(menu),作為菜單項的容器GtkWidget *gtk_menu_new( void ); 一個菜單欄(menubar),是各個單獨菜單的容器。GtkWidget *gtk_menu_bar_new( void

13、 );代碼:menu.c其他:gtk_menu_bar_append 信號處理:activate 1.gtk_menu_item_right_justify 16構(gòu)件菜單構(gòu)件 使用套件gtk_item_factory 示例代碼17構(gòu)件雜項構(gòu)件標簽 Labels 箭頭 Arrows 工具提示對象 The Tooltips Object 進度條 Progress Bars 對話框 Dialogs 標尺 Rulers 狀態(tài)欄 Statusbars 文本輸入構(gòu)件 Text Entries 微調(diào)按鈕 Spin Buttons 組合框 Combo Box 日歷 Calendar 顏色選擇 Color Se

14、lection 文件選擇 File Selections18構(gòu)件容器構(gòu)件事件盒 The EventBox 對齊構(gòu)件 The Alignment widget 固定容器 Fixed Container 布局容器 Layout Container 框架 Frames 比例框架 Aspect Frames 分欄窗口構(gòu)件 Paned Window Widgets 視角 Viewports 滾動窗口 Scrolled Windows 按鈕盒 Button Boxes 工具欄 Toolbar 筆記本 Notebooks19GTK培訓(xùn)教程 GTK簡介 GTK開始例子 信號和回調(diào)函數(shù) GTK構(gòu)件 GTK高級應(yīng)

15、用 Anjuta20高級事件和信號處理 連接和斷開信號處理函數(shù)gulong g_signal_connect( GObject *object, const gchar *name, GCallback func, gpointer func_data ); gulong g_signal_connect_after( GObject *object, const gchar *name, GCallback func, gpointer func_data ); gulong g_signal_connect_swapped( GObject *object, const gchar *na

16、me, GCallback func, GObject *slot_object ); void g_signal_handler_disconnect( GObject *object, gulong handler_id ); void g_signal_handlers_disconnect_by_func( GObject *object, GCallback func, gpointer data );阻塞和反阻塞信號處理函數(shù)void g_signal_handler_block( GObject *object, gulong handler_id); void g_signal_

17、handlers_block_by_func( GObject *object, GCallback func, gpointer data ); void g_signal_handler_unblock( GObject *object, gulong handler_id ); void g_signal_handler_unblock_by_func( GObject *object, GCallback func, gpointer data );21高級事件和信號處理 發(fā)出和停止信號void g_signal_emit( GObject *object, guint signal_

18、id, . );void g_signal_emit_by_name( GObject *object, const gchar *name, . ); void g_signal_emitv( const GValue *instance_and_params, guint signal_id, GQuark detail, GValue *return_value ); void g_signal_stop_emission( GObject *object, guint signal_id, GQuark detail ); void g_signal_stop_emission_by_

19、name( GObject *object, const gchar *detailed_signal );22高級事件和信號處理 事件 (如button_press_event) 的處理過程是:從事件發(fā)生的構(gòu)件開始。發(fā)出通常的 event 信號。如果信號處理函數(shù)返回 TRUE 值,停止所有的處理。否則,發(fā)出一個指定的,button_press_event 信號。如果它返回 TRUE,停止所有的處理。否則,轉(zhuǎn)到父構(gòu)件,重復(fù)前兩步。繼續(xù)直到某些信號處理函數(shù)返回 TRUE,或者直到達到了最頂層的構(gòu)件。上述問題的一些重點是: 如果信號有一個默認的處理函數(shù),那么你的處理函數(shù)返回的值不起作用,除非你用

20、gtk_signal_connect_after() 設(shè)置連接。1.為了阻止默認的信號處理函數(shù)運行,你需要用 gtk_signal_connect() 設(shè)置連接,并使用 gtk_signal_emit_stop_by_name() - 返回值只影響信號是否傳播,不影響當(dāng)前信號的發(fā)射。23超時、IO 和 Idle 函數(shù) 超時 Timeouts gint gtk_timeout_add( guint32 interval, GtkFunction function, gpointer data ); 第一個參數(shù)是以毫秒為單位的你的函數(shù)被調(diào)用的時間間隔。第二個參數(shù)是你想調(diào)用的函數(shù)。第三個參數(shù)是傳遞給

21、回調(diào)函數(shù)的數(shù)據(jù)。返回值是一個整型的標記,該標記可以用于停止超時,用函數(shù):void gtk_timeout_remove( gint tag );也可以通過從回調(diào)函數(shù)返回零或 FALSE 來停止超時函數(shù)。很顯然,如果你想讓你的函數(shù)繼續(xù)被調(diào)用,應(yīng)該返回一個非零值,如 TRUE。 回調(diào)函數(shù)應(yīng)該聲明為:gint timeout_callback( gpointer data ); 24超時、IO 和 Idle 函數(shù) 監(jiān)控IO GDK ( GTK 的底層庫) 的一個極好的特性是能讓它檢查文件描述符 (如 open(2) 或 socket(2) 返回的) 上的數(shù)據(jù)。這對網(wǎng)絡(luò)應(yīng)用程序尤其有用。這個函數(shù): g

22、int gdk_input_add( gint source, GdkInputCondition condition, GdkInputFunction function, gpointer data ); 第一個參數(shù)是你想監(jiān)控的文件描述符。第二個參數(shù)指定你想讓 GDK 尋找什么。它可以是:GDK_INPUT_READ - 當(dāng)文件描述符有數(shù)據(jù)可供讀取時調(diào)用你的函數(shù)。GDK_INPUT_WRITE - 當(dāng)文件描述符做好寫的準備時調(diào)用你的函數(shù)。第三個參數(shù)是當(dāng)滿足上述條件時你想要調(diào)用的函數(shù),第四個參數(shù)是傳遞給該函數(shù)的參數(shù)。 停止對文件描述符的監(jiān)控:void gdk_input_remove( gi

23、nt tag )回調(diào)函數(shù)應(yīng)該聲明為:void input_callback( gpointer data, gint source, GdkInputCondition condition );25超時、IO 和 Idle 函數(shù) Idle 函數(shù) gint gtk_idle_add( GtkFunction function, gpointer data );第一個參數(shù)指向的函數(shù)會在任何機會出現(xiàn)時被調(diào)用。和其它函數(shù)一樣,返回 FALSE 停止調(diào)用 idle 函數(shù)。 或者通過以下函數(shù)停止:void gtk_idle_remove( gint tag );26GTK與多線程 在線程里并不能像主進程一樣直接對GTK界面進行操作,而是要進行一定的保護,以避免線程和主進程之間的沖突。主要包括以下幾個方便的工作:在gtk_init()之前加上g_thread_init() /initialize the thread system gdk_threads_init() /Initializes GDK

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論