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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

8、的順序并不重要,不過建議在最后顯示窗口,這樣整個窗口就可以一次彈出來,而不是讓用戶看著窗口里的構件一個個生成并顯示出來。在窗口(也是一個構件)用 gtk_widget_show() 函數(shù)顯示出來之前,它的子構件并不會被顯示。12構件按鈕構件 一般按鈕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)建一個空白按鈕 開關按鈕(toggle) 復選按鈕(check) 單選按鈕(rad

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

10、)”。滾動條構件 一般只用于滾動其它的構件,比如列表、文本構件,或視角構件。滾動條構件創(chuàng)建函數(shù) GtkWidget *gtk_hscrollbar_new( GtkAdjustment *adjustment ); GtkWidget *gtk_vscrollbar_new( GtkAdjustment *adjustment );adjustment參數(shù)可以是一個指向已有調整對象的指針或 NULL,當為NULL時會自動創(chuàng)建一個。 14構件范圍構件比例構件比例構件(Scale widgets)一般用于允許用戶在一個指定的取值范圍你可視地選擇和操縱一個值。比例構件創(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、式顯示其當前值 gtk_scale_set_digits /設置要顯示的小數(shù)位數(shù) gtk_scale_set_value_pos/顯示的值可放在滑槽附近的不同位置 15構件菜單構件 手工創(chuàng)建菜單創(chuàng)建菜單欄和子菜單時要用到三種構件:一個菜單項(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構件菜單構件 使用套件gtk_item_factory 示例代碼17構件雜項構件標簽 Labels 箭頭 Arrows 工具提示對象 The Tooltips Object 進度條 Progress Bars 對話框 Dialogs 標尺 Rulers 狀態(tài)欄 Statusbars 文本輸入構件 Text Entries 微調按鈕 Spin Buttons 組合框 Combo Box 日歷 Calendar 顏色選擇 Color Se

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

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ā)生的構件開始。發(fā)出通常的 event 信號。如果信號處理函數(shù)返回 TRUE 值,停止所有的處理。否則,發(fā)出一個指定的,button_press_event 信號。如果它返回 TRUE,停止所有的處理。否則,轉到父構件,重復前兩步。繼續(xù)直到某些信號處理函數(shù)返回 TRUE,或者直到達到了最頂層的構件。上述問題的一些重點是: 如果信號有一個默認的處理函數(shù),那么你的處理函數(shù)返回的值不起作用,除非你用

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

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

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

23、nt tag )回調函數(shù)應該聲明為: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)時被調用。和其它函數(shù)一樣,返回 FALSE 停止調用 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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論