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ù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

10、)”。滾動(dòng)條構(gòu)件 一般只用于滾動(dòng)其它的構(gòu)件,比如列表、文本構(gòu)件,或視角構(gòu)件。滾動(dòng)條構(gòu)件創(chuàng)建函數(shù) GtkWidget *gtk_hscrollbar_new( GtkAdjustment *adjustment ); GtkWidget *gtk_vscrollbar_new( GtkAdjustment *adjustment );adjustment參數(shù)可以是一個(gè)指向已有調(diào)整對(duì)象的指針或 NULL,當(dāng)為NULL時(shí)會(huì)自動(dòng)創(chuàng)建一個(gè)。 14構(gòu)件范圍構(gòu)件比例構(gòu)件比例構(gòu)件(Scale widgets)一般用于允許用戶在一個(gè)指定的取值范圍你可視地選擇和操縱一個(gè)值。比例構(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)建菜單欄和子菜單時(shí)要用到三種構(gòu)件:一個(gè)菜單項(xiàng)(menu item),就是用戶要選擇的東西,比如,Save“GtkWidget *gtk_menu_item_new( void ); 一個(gè)菜單(menu),作為菜單項(xiàng)的容器GtkWidget *gtk_menu_new( void ); 一個(gè)菜單欄(menubar),是各個(gè)單獨(dú)菜單的容器。GtkWidget *gtk_menu_bar_new( void

13、 );代碼:menu.c其他:gtk_menu_bar_append 信號(hào)處理:activate 1.gtk_menu_item_right_justify 16構(gòu)件菜單構(gòu)件 使用套件gtk_item_factory 示例代碼17構(gòu)件雜項(xiàng)構(gòu)件標(biāo)簽 Labels 箭頭 Arrows 工具提示對(duì)象 The Tooltips Object 進(jìn)度條 Progress Bars 對(duì)話框 Dialogs 標(biāo)尺 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 對(duì)齊構(gòu)件 The Alignment widget 固定容器 Fixed Container 布局容器 Layout Container 框架 Frames 比例框架 Aspect Frames 分欄窗口構(gòu)件 Paned Window Widgets 視角 Viewports 滾動(dòng)窗口 Scrolled Windows 按鈕盒 Button Boxes 工具欄 Toolbar 筆記本 Notebooks19GTK培訓(xùn)教程 GTK簡介 GTK開始例子 信號(hào)和回調(diào)函數(shù) GTK構(gòu)件 GTK高級(jí)應(yīng)

15、用 Anjuta20高級(jí)事件和信號(hào)處理 連接和斷開信號(hào)處理函數(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 );阻塞和反阻塞信號(hào)處理函數(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高級(jí)事件和信號(hào)處理 發(fā)出和停止信號(hào)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高級(jí)事件和信號(hào)處理 事件 (如button_press_event) 的處理過程是:從事件發(fā)生的構(gòu)件開始。發(fā)出通常的 event 信號(hào)。如果信號(hào)處理函數(shù)返回 TRUE 值,停止所有的處理。否則,發(fā)出一個(gè)指定的,button_press_event 信號(hào)。如果它返回 TRUE,停止所有的處理。否則,轉(zhuǎn)到父構(gòu)件,重復(fù)前兩步。繼續(xù)直到某些信號(hào)處理函數(shù)返回 TRUE,或者直到達(dá)到了最頂層的構(gòu)件。上述問題的一些重點(diǎn)是: 如果信號(hào)有一個(gè)默認(rèn)的處理函數(shù),那么你的處理函數(shù)返回的值不起作用,除非你用

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

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

22、int gdk_input_add( gint source, GdkInputCondition condition, GdkInputFunction function, gpointer data ); 第一個(gè)參數(shù)是你想監(jiān)控的文件描述符。第二個(gè)參數(shù)指定你想讓 GDK 尋找什么。它可以是:GDK_INPUT_READ - 當(dāng)文件描述符有數(shù)據(jù)可供讀取時(shí)調(diào)用你的函數(shù)。GDK_INPUT_WRITE - 當(dāng)文件描述符做好寫的準(zhǔn)備時(shí)調(diào)用你的函數(shù)。第三個(gè)參數(shù)是當(dāng)滿足上述條件時(shí)你想要調(diào)用的函數(shù),第四個(gè)參數(shù)是傳遞給該函數(shù)的參數(shù)。 停止對(duì)文件描述符的監(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超時(shí)、IO 和 Idle 函數(shù) Idle 函數(shù) gint gtk_idle_add( GtkFunction function, gpointer data );第一個(gè)參數(shù)指向的函數(shù)會(huì)在任何機(jī)會(huì)出現(xiàn)時(shí)被調(diào)用。和其它函數(shù)一樣,返回 FALSE 停止調(diào)用 idle 函數(shù)。 或者通過以下函數(shù)停止:void gtk_idle_remove( gint tag );26GTK與多線程 在線程里并不能像主進(jìn)程一樣直接對(duì)GTK界面進(jìn)行操作,而是要進(jìn)行一定的保護(hù),以避免線程和主進(jìn)程之間的沖突。主要包括以下幾個(gè)方便的工作:在gtk_init()之前加上g_thread_init() /initialize the thread system gdk_threads_init() /Initializes GDK

溫馨提示

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

評(píng)論

0/150

提交評(píng)論