《Linux C從入門到精通》.明日科技.第17章.界面構件開發(fā)_第1頁
《Linux C從入門到精通》.明日科技.第17章.界面構件開發(fā)_第2頁
《Linux C從入門到精通》.明日科技.第17章.界面構件開發(fā)_第3頁
《Linux C從入門到精通》.明日科技.第17章.界面構件開發(fā)_第4頁
《Linux C從入門到精通》.明日科技.第17章.界面構件開發(fā)_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、窗體本講大綱:初始化初始化建立窗口建立窗口結結束束應應用程序用程序回回調調函函數數其其它它窗體函窗體函數數初始化 無論寫哪一個無論寫哪一個GTK+GTK+程序需要調用程序需要調用gtk_initgtk_init函數對函數對GTK+GTK+庫函數進行初始化。庫函數進行初始化。gtk_initgtk_init() ()函數的具體介紹如函數的具體介紹如下表下表18.118.1所示:所示: 名稱::gtk_init功能:初始化GTK+庫頭文件:#include函數原形:voidgtk_init(int*argc,char*argv);參數:argc指向主函數argc的指針argv指向主函數argv的指

2、針返回值:無建立窗口名稱::gtk_window_new功能:建立窗口頭文件:#include函數原形:GtkWidget*gtk_window_new(參數:無返回值:無名稱::gtk_widget_show功能:顯示窗口頭文件:#include函數原形:gtk_widget_show(GtkWidget*window)參數:無返回值:無GTK+GTK+的的構構件是件是GUIGUI的的組組成部分。窗口、成部分。窗口、檢查檢查框、按框、按鈕鈕和和編輯編輯字段都字段都屬屬于于構構件。通常件。通常將構將構件和窗口定件和窗口定義為義為指向指向GtkWidgetGtkWidget結構結構的指的指針針。

3、在。在GTK+GTK+中,中,GtkWidgetGtkWidget是用于所有是用于所有構構件和窗口的通用件和窗口的通用數數據據類類型。型。GTK+GTK+庫進庫進行初始化后,大多行初始化后,大多數應數應用建立一用建立一個個主窗口。在主窗口。在GTK+GTK+中,主窗口常常被中,主窗口常常被稱為頂層稱為頂層窗口。窗口。頂層頂層窗口不窗口不被包含在任何其他窗口被包含在任何其他窗口內內,所以,所以它沒它沒有上有上層層窗口。在窗口。在GTK+GTK+中,中,構構件具有父子件具有父子關關系,其中父系,其中父構構件是容器,而子件是容器,而子構構件件則則是包含在容器中的是包含在容器中的構構件。件。頂層頂層窗

4、口窗口沒沒有父窗口,但可能成有父窗口,但可能成為為其他其他構構件的容器。件的容器。在在GTK+GTK+中建立中建立構構件分件分兩兩步:建立步:建立構構件,然后使件,然后使它它可以看得可以看得見見。gtk_window_newgtk_window_new() ()函函數負責數負責建立窗口。如表建立窗口。如表18.318.3所示,所示,gtk_widget_showgtk_widget_show() ()函函數負責數負責使使它它成成為為可可見見的窗體,如表的窗體,如表18.418.4所示。所示。名稱::gtk_main功能:等待事件的發(fā)生頭文件:#include函數原形:voidgtk_main(

5、void);參數:無返回值:無結束應用程序 窗體程序在創(chuàng)建之后需要進行推出,而窗體程序在創(chuàng)建之后需要進行推出,而gtk_main_quitgtk_main_quit() ()函數可以結束程序,它通常函數可以結束程序,它通常在回調函數中被調用。函數具體內容如表在回調函數中被調用。函數具體內容如表18.618.6所示:所示:名稱::gtk_main_quit功能:結束應用程序頭文件:#include函數原形:voidgtk_main_quit(void);參數:無返回值:無回調函數由于程序必須能夠對用戶的操作做出相應,在基于由于程序必須能夠對用戶的操作做出相應,在基于GUIGUI的程序設計中信號是

6、必要的。移動鼠標,按下按鈕,敲入的程序設計中信號是必要的。移動鼠標,按下按鈕,敲入正文或者關閉窗口,將給應用軟件的回呼函數提供信號。信號可能需要應用軟件來加以處理。如:字處理軟件有正文或者關閉窗口,將給應用軟件的回呼函數提供信號。信號可能需要應用軟件來加以處理。如:字處理軟件有使字體變黑的按鈕。如果用戶按下了按鈕,就需要調用使字體變黑的程序。與此類型,如果用戶關閉了主窗口,使字體變黑的按鈕。如果用戶按下了按鈕,就需要調用使字體變黑的程序。與此類型,如果用戶關閉了主窗口,在實際關閉窗口以前要進行某些處理(如保存文件,清除等)。在實際關閉窗口以前要進行某些處理(如保存文件,清除等)。在在GTK+G

7、TK+中經常產生各種信號,多數情況下信號被忽略。以按鈕構件為例,應用軟件有專門用于按鈕的信號。當中經常產生各種信號,多數情況下信號被忽略。以按鈕構件為例,應用軟件有專門用于按鈕的信號。當用戶按下鼠標或釋放鼠標按鈕時,當用戶電機鼠標時,或者當鼠標移過按鈕或離開按鈕時都產生各自的信號。應用戶按下鼠標或釋放鼠標按鈕時,當用戶電機鼠標時,或者當鼠標移過按鈕或離開按鈕時都產生各自的信號。應用程序可以忽略掉一些信號,只對感興趣的事件加以處理。用程序可以忽略掉一些信號,只對感興趣的事件加以處理。當需要對信號進行處理時,需要用當需要對信號進行處理時,需要用GTK+GTK+登記回調函數,并將它和構件聯(lián)系在一起。

8、構件可以登記回調函數,回登記回調函數,并將它和構件聯(lián)系在一起。構件可以登記回調函數,回調函數可與多個構件聯(lián)系在一起。調函數可與多個構件聯(lián)系在一起。g_signal_connectg_signal_connect() ()函數用于登記一個函數用于登記一個GTK+GTK+信號,其功能有點像普通信號登記函數信號,其功能有點像普通信號登記函數signal.signal.當某個空間發(fā)出信號當某個空間發(fā)出信號,程序就會去執(zhí)行由,程序就會去執(zhí)行由g_signal_connectg_signal_connect登記的回調函數。函數內容如表登記的回調函數。函數內容如表18.718.7所示所示名稱::g_sign

9、al_connect功能:信號登記函數頭文件:#include函數原形:gulongg_signal_connect(gpointer*object,constgchar*name,GCallbackfunc,gpointerdata);參數:object發(fā)出信號的控件name信號名稱func回調函數(對信號要采取的動作)data傳給回調函數的數據返回值:其它窗體函數gtk_window_set_titlegtk_window_set_title() ()函函數數可以修改程序的可以修改程序的標題標題。窗口的。窗口的標題會標題會出出現(xiàn)現(xiàn)在在標題欄標題欄中。在中。在X X窗體系窗體系統(tǒng)統(tǒng)中,中,標

10、題欄標題欄被窗體管理器管理,被窗體管理器管理,并并由程序由程序員員指定。指定。標題應該幫標題應該幫助用助用戶區(qū)戶區(qū)分分當當前窗體前窗體與與其其它它窗體。窗體。gtk_window_set_title(GTK_WINDOW(window),”MainWindowgtk_window_set_title(GTK_WINDOW(window),”MainWindow”);”);gtk_window_get_resizablegtk_window_get_resizable() ()函函數數可以可以獲獲得窗體的伸得窗體的伸縮屬縮屬性,系性,系統(tǒng)統(tǒng)默默認認窗體是可伸窗體是可伸縮縮的。的。gtk_wind

11、ow_get_resizablegtk_window_get_resizable() ()函函數數有一有一個個返回返回值值,如果可以伸,如果可以伸縮為縮為TRUETRUE,如果不可以伸,如果不可以伸縮為縮為FALSEFALSE。gtk_window_set_resizablegtk_window_set_resizable() ()函函數數可以修改窗體的伸可以修改窗體的伸縮屬縮屬性,由第二性,由第二參數參數指定。以上指定。以上兩個兩個函函數數的具體的具體內內容如表容如表18.1018.10所示:所示:gtk_window_set_resizable(GTK_WINDOW(window),FAL

12、SEgtk_window_set_resizable(GTK_WINDOW(window),FALSE); );標題組裝盒構件本講大綱:組組裝盒的原理裝盒的原理盒的盒的細節(jié)細節(jié)組組裝盒程序裝盒程序用表用表組組裝裝表表組組裝程序裝程序組裝盒的原理但當你想要放置更多的構件到一個窗口中時,如何控制各個構件的定位呢?這時就要用到組裝但當你想要放置更多的構件到一個窗口中時,如何控制各個構件的定位呢?這時就要用到組裝(Packing)(Packing)了。了。 組裝盒的原理多數組裝是通過創(chuàng)建一些多數組裝是通過創(chuàng)建一些“盒盒(boxes)”(boxes)”來達成的,這是些不可見的構件容器,它們有兩種形式:來

13、達成的,這是些不可見的構件容器,它們有兩種形式:一種是橫向盒一種是橫向盒( (horizontalboxhorizontalbox) ),一種是縱向盒,一種是縱向盒( (verticalboxverticalbox) )。當我們組裝構件到橫向盒里時,。當我們組裝構件到橫向盒里時,這些構件就依著我們調用的順序左至右或右到左水平地插入進去。在縱向盒里,則頂部到底部或這些構件就依著我們調用的順序左至右或右到左水平地插入進去。在縱向盒里,則頂部到底部或相反地組裝構件,你可以使用任意的盒組合,比如盒套盒或者盒挨著盒,用以產生你想要的效果相反地組裝構件,你可以使用任意的盒組合,比如盒套盒或者盒挨著盒,用以

14、產生你想要的效果。要創(chuàng)建一個新的橫向盒,調用要創(chuàng)建一個新的橫向盒,調用gtk_hbox_newgtk_hbox_new() (),對于縱向盒,用,對于縱向盒,用gtk_vbox_newgtk_vbox_new() ()。gtk_box_pack_startgtk_box_pack_start() ()和和gtk_box_pack_endgtk_box_pack_end() ()函數用來將對象組裝到這些容器中。函數用來將對象組裝到這些容器中。gtk_box_pack_startgtk_box_pack_start() ()將對象從上到下組裝到縱向盒中,或者左到右組裝到橫向盒中。將對象從上到下組裝

15、到縱向盒中,或者左到右組裝到橫向盒中。gtk_box_pack_endgtk_box_pack_end() ()則相反,下到上組裝到縱向盒中,或者右到左組裝到橫向盒中。使用這些則相反,下到上組裝到縱向盒中,或者右到左組裝到橫向盒中。使用這些函數允許我們調整自己的構件向左或向右對齊,同時也可以混入一些其它的方法來達到我們想要函數允許我們調整自己的構件向左或向右對齊,同時也可以混入一些其它的方法來達到我們想要的設計效果。在我們的示例中多數使用的設計效果。在我們的示例中多數使用gtk_box_pack_startgtk_box_pack_start() ()。被組裝的對象可以是另一個容器。被組裝的對

16、象可以是另一個容器或構件。事實上,許多構件本身就是容器,包括按鈕,只不過我們通常在按鈕中只放入一個標簽或構件。事實上,許多構件本身就是容器,包括按鈕,只不過我們通常在按鈕中只放入一個標簽。通過使用這些調用,通過使用這些調用,GTKGTK就會知道要把構件放到哪里去,并且會自動做調整大小及其它美化的事就會知道要把構件放到哪里去,并且會自動做調整大小及其它美化的事情。至于如何組裝你的構件這里還有一些選項。正如你能想到的,在放置和創(chuàng)建構件時,這些方情。至于如何組裝你的構件這里還有一些選項。正如你能想到的,在放置和創(chuàng)建構件時,這些方法給了我們很多的彈性。法給了我們很多的彈性。盒的細節(jié)由于存在這樣的彈性,

17、所以在一開始使用由于存在這樣的彈性,所以在一開始使用GTKGTK中的組裝盒中的組裝盒( (packingboxpackingbox) )的時候會有點讓人迷惑。這里有許多選項的時候會有點讓人迷惑。這里有許多選項,并且它們不容易一眼看出是如何組合在一起的。然而到最后,這里基本上只有五種不同的風格。,并且它們不容易一眼看出是如何組合在一起的。然而到最后,這里基本上只有五種不同的風格。每一行包含一個帶有若干按鈕的橫向盒。每一行包含一個帶有若干按鈕的橫向盒。gtk_box_packgtk_box_pack是組裝每個按鈕到橫向盒是組裝每個按鈕到橫向盒( (hboxhbox) )的簡寫。每個按鈕都是以的簡寫

18、。每個按鈕都是以同樣的方式組裝到橫向盒里的(例如,以同樣參數調用同樣的方式組裝到橫向盒里的(例如,以同樣參數調用gtk_box_pack_startgtk_box_pack_start() ()函數)。函數)。這是這是gtk_box_pack_startgtk_box_pack_start() ()函數的聲明。函數的聲明。voidgtk_box_pack_start(GtkBoxvoidgtk_box_pack_start(GtkBox* *box,box,GtkWidgetGtkWidget* *child,child,gbooleanexpandgbooleanexpand, ,gbool

19、eanfillgbooleanfill, ,guintpaddingguintpadding); );第一個參數是你要把對象組裝進去的盒,第二個就是該對象。目前這些對象將都是按鈕,即我們要將這些按鈕組裝第一個參數是你要把對象組裝進去的盒,第二個就是該對象。目前這些對象將都是按鈕,即我們要將這些按鈕組裝到盒中。到盒中。gtk_box_pack_startgtk_box_pack_start() ()和和gtk_box_pack_endgtk_box_pack_end() ()中的中的expandexpand參數是用來控制構件在盒中是充滿所有多余空間這樣參數是用來控制構件在盒中是充滿所有多余空間這

20、樣盒會擴展到充滿所有分配給它的空間(盒會擴展到充滿所有分配給它的空間(TURETURE);還是盒收縮到僅僅符合構件的大小();還是盒收縮到僅僅符合構件的大小(FALSEFALSE)。設置)。設置expandexpand為為FALSEFALSE將允許你向左或向右對齊你的構件。否則,它們會在盒中展開,同樣的效果只要用將允許你向左或向右對齊你的構件。否則,它們會在盒中展開,同樣的效果只要用gkt_box_pack_startgkt_box_pack_start() ()或或gtk_box_pack_endgtk_box_pack_end() ()之一就能實現(xiàn)。之一就能實現(xiàn)。fillfill參數在參數

21、在gtk_box_packgtk_box_pack中控制多余空間是分配給對象本身(中控制多余空間是分配給對象本身(TRUETRUE),還是讓多余空間圍繞在這些對象周圍分布),還是讓多余空間圍繞在這些對象周圍分布(FALSEFALSE)。它只有在)。它只有在expandexpand參數也為參數也為TRUETRUE時才會生效。時才會生效。組裝盒程序用表組裝讓我們看看另一種組裝的方法讓我們看看另一種組裝的方法- -表表(Tables)(Tables)。在某些情況下這是極其有用的。使用表的時候,我們建立格來放入構件。在某些情況下這是極其有用的。使用表的時候,我們建立格來放入構件。構件可以占滿我們所指定

22、的所有空間,第一個要看的,當然是。構件可以占滿我們所指定的所有空間,第一個要看的,當然是gtk_table_newgtk_table_new() ()這個函數:這個函數:GtkWidgetGtkWidget* *gtk_table_new(guintrowsgtk_table_new(guintrows, ,guintguint columns, columns,gbooleangboolean homogeneous); homogeneous);第一個參數是表中要安排的行的數量,而第二個,顯然,就是列的數量。第一個參數是表中要安排的行的數量,而第二個,顯然,就是列的數量。homogeneo

23、ushomogeneous參數跟表格框參數跟表格框( (tablesboxestablesboxes) )的大小處理有關。如果的大小處理有關。如果homogeneoushomogeneous是是TRUETRUE,所有表格框的大小都,所有表格框的大小都將調整為表中最大構件的大小。如果將調整為表中最大構件的大小。如果homogeneoushomogeneous為為FALSEFALSE,每個表格框將會按照同行中最高的構件,與同列中最,每個表格框將會按照同行中最高的構件,與同列中最寬的構件來定自身的大小。行與列為寬的構件來定自身的大小。行與列為0 0到到n n編號,而編號,而n n是我們在調用是我們在

24、調用gtk_table_newgtk_table_new時所指定的值。時所指定的值。注意坐標系統(tǒng)開始于左上角。要向框中放置一個構件,使用下面的函數:注意坐標系統(tǒng)開始于左上角。要向框中放置一個構件,使用下面的函數:voidgtk_table_attach(GtkTablevoidgtk_table_attach(GtkTable* *table, table, GtkWidgetGtkWidget * *child,child,guintguint left_attachleft_attach, ,guintguint right_attachright_attach, ,guintguint

25、top_attachtop_attach, ,guintguint bottom_attachbottom_attach, ,GtkAttachOptionsGtkAttachOptions xoptionsxoptions, ,GtkAttachOptionsGtkAttachOptions yoptionsyoptions, ,guintxpaddingguintxpadding, ,guintypaddingguintypadding); );第一個參數(第一個參數(tabletable)是你已經創(chuàng)建的表,第二個參數()是你已經創(chuàng)建的表,第二個參數(childchild)是你想放進表里的

26、構件。)是你想放進表里的構件。left_attachleft_attach和和right_attachright_attach參數指定構件放置的位置,并使用多少框來放。如果你想在參數指定構件放置的位置,并使用多少框來放。如果你想在2x22x2的表中的右下表項的表中的右下表項( (tableentrytableentry) )處放入一個按鈕,并且想讓它只充滿這個項,則處放入一個按鈕,并且想讓它只充滿這個項,則left_attachleft_attach應該為應該為=1,right_attach=2,top_attach=1,bottom_attach=2=1,right_attach=2,top

27、_attach=1,bottom_attach=2。現(xiàn)在,如果想讓一個構件占據我們這個現(xiàn)在,如果想讓一個構件占據我們這個2x22x2表的整個頂行,你就用表的整個頂行,你就用left_attachleft_attach=0,right_attach=2,top_attach=0,bottom_attach=1=0,right_attach=2,top_attach=0,bottom_attach=1。表組裝程序這里創(chuàng)建一個包含一個這里創(chuàng)建一個包含一個2x22x2表的窗口,表中放入三個按鈕。前兩個按表的窗口,表中放入三個按鈕。前兩個按鈕將放在上面那行里。而第三個,鈕將放在上面那行里。而第三個,qu

28、itquit按鈕,放在下面那行,并占據按鈕,放在下面那行,并占據了兩列。運行效果如圖了兩列。運行效果如圖18.318.3所示:所示:容器本講大綱:事件盒事件盒對齊構對齊構件件固定容器固定容器布局容器布局容器框架框架分分欄欄窗口窗口構構件件視視角角滾動滾動窗口窗口按按鈕鈕盒盒工具工具欄欄筆記筆記本本事件盒 初一看,事件盒構件好像完全沒有什么用。它在屏幕上什么初一看,事件盒構件好像完全沒有什么用。它在屏幕上什么也不畫,并且對事件也不做響應。但是,它有一個功能:為它也不畫,并且對事件也不做響應。但是,它有一個功能:為它的子構件提供一個的子構件提供一個X X窗口。因為許多窗口。因為許多GTKGTK構件

29、并沒有相關聯(lián)的構件并沒有相關聯(lián)的X X窗口,所以這一點很重要。雖然沒有窗口,所以這一點很重要。雖然沒有X X窗口會節(jié)省內存,提高系窗口會節(jié)省內存,提高系統(tǒng)性能,但它也有一些弱點。沒有統(tǒng)性能,但它也有一些弱點。沒有X X窗口的構件不能接收事件,窗口的構件不能接收事件,并且對它的任何內容不能實施剪裁。雖然事件盒構件的名稱事并且對它的任何內容不能實施剪裁。雖然事件盒構件的名稱事件盒強調了它的事件處理功能,它也能用于剪裁構件件盒強調了它的事件處理功能,它也能用于剪裁構件( (更多的信更多的信息請看下面的示例息請看下面的示例) )。用以下函數創(chuàng)建一個新的事件盒構件:。用以下函數創(chuàng)建一個新的事件盒構件:G

30、tkWidgetGtkWidget* *gtk_event_box_new(voidgtk_event_box_new(void); );然后子構件就可以添加到這個事件盒里面:然后子構件就可以添加到這個事件盒里面:gtk_container_add(GTK_CONTAINER(event_box),child_wigtk_container_add(GTK_CONTAINER(event_box),child_widgetdget); );對齊構件對齊對齊(alignment)(alignment)構件允許將一個構件放在相對于對齊構件窗口的某個位置和尺寸上。例如構件允許將一個構件放在相對于對齊

31、構件窗口的某個位置和尺寸上。例如將一個構件放在窗口的正中間時,就要使用對齊構件。只有如下兩個函數與對齊構件相關,將一個構件放在窗口的正中間時,就要使用對齊構件。只有如下兩個函數與對齊構件相關,第一個函數用指定的參數創(chuàng)建新的對齊構件。第二個函數用于改變對齊構件的參數。第一個函數用指定的參數創(chuàng)建新的對齊構件。第二個函數用于改變對齊構件的參數。GtkWidgetGtkWidget* *gtk_alignment_new(gfloatxaligngtk_alignment_new(gfloatxalign, ,gfloatyaligngfloatyalign, ,gfloatxscalegfloatx

32、scale, ,gfloatyscalegfloatyscale); );voidgtk_alignment_set(GtkAlignmentvoidgtk_alignment_set(GtkAlignment* *alignment,alignment,gfloatxaligngfloatxalign, ,gfloatyaligngfloatyalign, ,gfloatxscalegfloatxscale, ,gfloatyscalegfloatyscale); );上面函數的所有四個參數都是介于上面函數的所有四個參數都是介于0.00.0與與1.01.0間的浮點數。間的浮點數。xalign

33、xalign和和yalignyalign參數影響放在對齊參數影響放在對齊構件里的構件的位置。構件里的構件的位置。xscalexscale和和yscaleyscale參數影響分配給構件的空間總數。參數影響分配給構件的空間總數。可以用下面的函數將子構件添加到對齊構件中:可以用下面的函數將子構件添加到對齊構件中:gtk_container_add(GTK_CONTAINER(alignment),child_widgetgtk_container_add(GTK_CONTAINER(alignment),child_widget); );固定容器固定容器固定容器( (TheFixedcontaine

34、rTheFixedcontainer) )允許將構件放在窗口的固定位置,這允許將構件放在窗口的固定位置,這個位置是相對于固定容器的左上角的。構件的位置可以動態(tài)改變。只個位置是相對于固定容器的左上角的。構件的位置可以動態(tài)改變。只有少數幾個與固定容器構件相關的函數:有少數幾個與固定容器構件相關的函數:gtk_fixed_newgtk_fixed_new() ()函函數數用于用于創(chuàng)創(chuàng)建新的固定容器。建新的固定容器。gtk_fixed_putgtk_fixed_put() ()函函數將數將widgetwidget放在放在fixedfixed的的x x和和y y指定的位置。指定的位置。gtk_fixed

35、_movegtk_fixed_move() ()函函數將數將指定指定構構件移件移動動到新位置。到新位置。voidgtk_fixed_set_has_window(GtkFixedvoidgtk_fixed_set_has_window(GtkFixed* *fixed,gbooleanhas_fixed,gbooleanhas_windowwindow); );gbooleangtk_fixed_get_has_window(GtkFixedgbooleangtk_fixed_get_has_window(GtkFixed* *fixed);fixed);通常,固定容器沒有它們自己的通常,固定

36、容器沒有它們自己的X X窗口。由于這點在早期版本的窗口。由于這點在早期版本的GTKGTK中是不同的中是不同的gtk_fixed_set_has_windowgtk_fixed_set_has_window() ()函數可以使創(chuàng)建的固定容器有它們自函數可以使創(chuàng)建的固定容器有它們自己的窗口。這個必須在構件實例化己的窗口。這個必須在構件實例化(realizing)(realizing)之前調用。下面的來看之前調用。下面的來看一下怎樣使用固定容器。運行效果如圖一下怎樣使用固定容器。運行效果如圖18.418.4所示:所示:布局容器布局容器布局容器( (TheLayoutcontainerTheLayou

37、tcontainer) )與固定容器與固定容器( (theFixedcontainertheFixedcontainer) )類似,不過它可以在一個類似,不過它可以在一個無限的滾動區(qū)域定位構件無限的滾動區(qū)域定位構件 ( (其實也不能大于其實也不能大于232232像素像素) )。在。在X X系統(tǒng)中,窗口的寬度和高度只系統(tǒng)中,窗口的寬度和高度只能限于在能限于在3276732767像素以你。布局容器構件使用一些特殊的技巧像素以你。布局容器構件使用一些特殊的技巧( (doingsomeexoticstuffusingwindowandbitgravitiesdoingsomeexoticstuffus

38、ingwindowandbitgravities) )越過這種限制。所以,即使在滾動越過這種限制。所以,即使在滾動區(qū)域你有很多子構件,也可以平滑地滾動。用以下函數創(chuàng)建布局容器:區(qū)域你有很多子構件,也可以平滑地滾動。用以下函數創(chuàng)建布局容器:GtkWidgetGtkWidget* *gtk_layout_new(GtkAdjustmentgtk_layout_new(GtkAdjustment* *hadjustmenthadjustment, , GtkAdjustmentGtkAdjustment* *vadjustmentvadjustment); );可以看到,你可以有選擇地指定布局容器滾

39、動時要使用的調整對象。可以用下面的兩個函可以看到,你可以有選擇地指定布局容器滾動時要使用的調整對象。可以用下面的兩個函數在布局容器構件你添加和移動構件。數在布局容器構件你添加和移動構件。voidgtk_layout_put(GtkLayoutvoidgtk_layout_put(GtkLayout* *layout, layout, GtkWidgetGtkWidget* *widget, widget, gintxgintx, , gintyginty); ); voidgtk_layout_move(GtkLayoutvoidgtk_layout_move(GtkLayout* *layo

40、ut, layout, GtkWidgetGtkWidget* *widget, widget, gintxgintx, , gintyginty); ); 布局容器構件的尺寸可以用接下來的這個函數指定:布局容器構件的尺寸可以用接下來的這個函數指定:voidgtk_layout_set_size(GtkLayoutvoidgtk_layout_set_size(GtkLayout* *layout, layout, guintwidthguintwidth, , guintheightguintheight); ); 最后最后4 4個函數用于操縱垂直和水平的調整對象。個函數用于操縱垂直和水平的

41、調整對象。 GtkAdjustmentGtkAdjustment* *gtk_layout_get_hadjustment(GtkLayoutgtk_layout_get_hadjustment(GtkLayout* *layout); layout); GtkAdjustmentGtkAdjustment* *gtk_layout_get_vadjustment(GtkLayoutgtk_layout_get_vadjustment(GtkLayout* *layout); layout); voidgtk_layout_set_hadjustment(GtkLayoutvoidgtk_la

42、yout_set_hadjustment(GtkLayout* *layout, layout, GtkAdjustmentGtkAdjustment* *adjustment); adjustment); voidgtk_layout_set_vadjustment(GtkLayoutvoidgtk_layout_set_vadjustment(GtkLayout* *layout, layout, GtkAdjustmentGtkAdjustment* *adjustment);adjustment);框架框架框架(Frames)(Frames)可以用于在盒子中封裝一個或一組構件,框架本身

43、還可以有一個標簽可以用于在盒子中封裝一個或一組構件,框架本身還可以有一個標簽。標簽的位置和盒子的風格可以靈活改變。標簽的位置和盒子的風格可以靈活改變。 框架可以用下面的函數創(chuàng)建:框架可以用下面的函數創(chuàng)建: GtkWidgetGtkWidget* *gtk_frame_new(constgchargtk_frame_new(constgchar* *label); label); 標簽缺省放在框架的左上角。傳標簽缺省放在框架的左上角。傳遞遞NULLNULL值作為值作為labellabel參數時,框架不顯示標簽。標簽文本可以用下面的函數改變。參數時,框架不顯示標簽。標簽文本可以用下面的函數改變。

44、voidgtk_frame_set_label(GtkFramevoidgtk_frame_set_label(GtkFrame* *frame, frame, constgcharconstgchar* *label); label); 標簽的位置可標簽的位置可以用下面的函數改變:以用下面的函數改變: voidgtk_frame_set_label_align(GtkFramevoidgtk_frame_set_label_align(GtkFrame* *frame, frame, gfloatxaligngfloatxalign, , gfloatyaligngfloatyalign);

45、 ); xalignxalign和和yalignyalign參數取值范圍介于參數取值范圍介于0.00.0和和1.01.0之間。之間。xalignxalign指定標簽在框架構件上部水平線上的位置。指定標簽在框架構件上部水平線上的位置。yalignyalign目前還沒有被使用。目前還沒有被使用。xalignxalign的缺省值是的缺省值是0.00.0,它將標簽放在框架構件的最左端。,它將標簽放在框架構件的最左端。下面的函數改變盒子的風格,用于顯示框架的輪廓。下面的函數改變盒子的風格,用于顯示框架的輪廓。voidgtk_frame_set_shadow_type(GtkFramevoidgtk_fr

46、ame_set_shadow_type(GtkFrame* *frame, frame, GtkShadowTypetypeGtkShadowTypetype); ); typetype參數參數可以取以下可以取以下值值之一:之一:GTK_SHADOW_NONE GTK_SHADOW_NONE GTK_SHADOW_IN GTK_SHADOW_IN GTK_SHADOW_OUT GTK_SHADOW_OUT GTK_SHADOW_ETCHED_IN(GTK_SHADOW_ETCHED_IN(缺省缺省值值) ) GTK_SHADOW_ETCHED_OUT GTK_SHADOW_ETCHED_OUT

47、 下面的代碼就是如何構建一個框架。下面的代碼就是如何構建一個框架。分欄窗口構件如果想要將一個窗口分成兩個部分,可以使用分欄窗口構件如果想要將一個窗口分成兩個部分,可以使用分欄窗口構件( (ThepanedwindowwidgetsThepanedwindowwidgets) )。窗口兩部分的尺寸用戶控制,它們。窗口兩部分的尺寸用戶控制,它們之間有一個凹槽,上面有一個手柄,用戶可以拖動此手柄改變兩之間有一個凹槽,上面有一個手柄,用戶可以拖動此手柄改變兩部分的比例。窗口劃分可以是水平部分的比例。窗口劃分可以是水平( (HPanedHPaned) ) 或垂直的或垂直的( (VPanedVPaned)

48、 )。 用以下函數之一創(chuàng)建一個新的分欄窗口:用以下函數之一創(chuàng)建一個新的分欄窗口: GtkWidgetGtkWidget* *gtk_hpaned_new(voidgtk_hpaned_new(void); ); GtkWidgetGtkWidget* *gtk_vpaned_new(voidgtk_vpaned_new(void); ); 創(chuàng)建了分欄窗口構件后,可以在它的兩邊添加子構件。用下面的創(chuàng)建了分欄窗口構件后,可以在它的兩邊添加子構件。用下面的函數完成:函數完成:voidgtk_paned_add1(GtkPanedvoidgtk_paned_add1(GtkPaned* *paned,

49、GtkWidgetpaned,GtkWidget* *child); child); voidgtk_paned_add2(GtkPanedvoidgtk_paned_add2(GtkPaned* *paned,GtkWidgetpaned,GtkWidget* *child); child); gtk_paned_add1()gtk_paned_add1()函函數將數將子子構構件添加到分件添加到分欄欄窗口的左窗口的左邊邊或或頂頂部。部。gtk_paned_add2()gtk_paned_add2()函函數將數將子子構構件添加到分件添加到分欄欄窗口的右窗口的右邊邊或下部。或下部。 視角一般很少

50、直接使用視角一般很少直接使用視角(Viewport)(Viewport)構件。多數情況下是使用滾動窗口構件,它內部使構件。多數情況下是使用滾動窗口構件,它內部使用了視角。視角構件允許在其中放置一個超過自身大小的構件,這樣你可以一次看構用了視角。視角構件允許在其中放置一個超過自身大小的構件,這樣你可以一次看構件的一部分。它用調整對象定義當前顯示的區(qū)域。件的一部分。它用調整對象定義當前顯示的區(qū)域。 用下面的函數創(chuàng)建一個視角。用下面的函數創(chuàng)建一個視角。GtkWidgetGtkWidget* *gtk_viewport_new(GtkAdjustmentgtk_viewport_new(GtkAdju

51、stment* *hadjustmenthadjustment, , GtkAdjustmentGtkAdjustment* *vadjustmentvadjustment); ); 可以看到,創(chuàng)建構件時能夠指定構件使用的水平和垂直調整對象。如果給函數傳遞可以看到,創(chuàng)建構件時能夠指定構件使用的水平和垂直調整對象。如果給函數傳遞NULLNULL參數,構件會自己創(chuàng)建調整對象。參數,構件會自己創(chuàng)建調整對象。 創(chuàng)建構件后,可以用下面四個函數取得和設創(chuàng)建構件后,可以用下面四個函數取得和設置它的調整對象:置它的調整對象: GtkAdjustmentGtkAdjustment* *gtk_viewport_

52、get_hadjustment(GtkViewportgtk_viewport_get_hadjustment(GtkViewport* *viewport); viewport); GtkAdjustmentGtkAdjustment* *gtk_viewport_get_vadjustment(GtkViewportgtk_viewport_get_vadjustment(GtkViewport* *viewport); viewport); voidgtk_viewport_set_hadjustment(GtkViewportvoidgtk_viewport_set_hadjustme

53、nt(GtkViewport* *viewport, viewport, GtkAdjustmentGtkAdjustment* *adjustment); adjustment); voidgtk_viewport_set_vadjustment(GtkViewportvoidgtk_viewport_set_vadjustment(GtkViewport* *viewport, viewport, GtkAdjustmentGtkAdjustment* *adjustment); adjustment); 剩下的這個函數用于改變視角的外觀:剩下的這個函數用于改變視角的外觀:voidgtk_

54、viewport_set_shadow_type(GtkViewportvoidgtk_viewport_set_shadow_type(GtkViewport* *viewport, viewport, GtkShadowTypetypeGtkShadowTypetype); ); typetype參數參數可以取以下可以取以下值值:GTK_SHADOW_NONE, GTK_SHADOW_IN, GTK_SHADOW_NONE, GTK_SHADOW_IN, GTK_SHADOW_OUT, GTK_SHADOW_ETCHED_IN, GTK_SHADOW_ETCHED_OUTGTK_SHADO

55、W_OUT, GTK_SHADOW_ETCHED_IN, GTK_SHADOW_ETCHED_OUT。滾動窗口滾動窗口滾動窗口( (ScrolledwindowsScrolledwindows) )用于創(chuàng)建一個可滾動區(qū)域,并將其它構件放入其中。可用于創(chuàng)建一個可滾動區(qū)域,并將其它構件放入其中。可以在滾動窗口中插入任何其它構件,在其內部的構件不論尺寸大小都可以通過滾動條以在滾動窗口中插入任何其它構件,在其內部的構件不論尺寸大小都可以通過滾動條訪問到。訪問到。 用下面的函數創(chuàng)建新的滾動窗口。用下面的函數創(chuàng)建新的滾動窗口。GtkWidgetGtkWidget* *gtk_scrolled_window

56、_new(GtkAdjustmentgtk_scrolled_window_new(GtkAdjustment* *hadjustmenthadjustment, , GtkAdjustmentGtkAdjustment* *vadjustmentvadjustment); ); 第一個參數是水平方向的調整對象,第二個參數是垂直方向的調整對象。它們一般都第一個參數是水平方向的調整對象,第二個參數是垂直方向的調整對象。它們一般都設置為設置為NULLNULL。voidgtk_scrolled_window_set_policy(GtkScrolledWindowvoidgtk_scrolled_w

57、indow_set_policy(GtkScrolledWindow* *scrolled_window,Gtscrolled_window,GtkPolicyTypehscrollbar_policykPolicyTypehscrollbar_policy, , GtkPolicyTypevscrollbar_policyGtkPolicyTypevscrollbar_policy); ); 這個函數可以設置滾動條出現(xiàn)的方式。第一個參數是要設置的滾動窗口,第二個設置這個函數可以設置滾動條出現(xiàn)的方式。第一個參數是要設置的滾動窗口,第二個設置水平滾動條出現(xiàn)的方式,第三個參數設置垂直滾動條出現(xiàn)的方

58、式。水平滾動條出現(xiàn)的方式,第三個參數設置垂直滾動條出現(xiàn)的方式。 滾動條的方式取值滾動條的方式取值可以為可以為GTK_POLICY_AUTOMATICGTK_POLICY_AUTOMATIC或或GTK_POLICY_ALWAYSGTK_POLICY_ALWAYS。當要求滾動條根據需。當要求滾動條根據需要自動出現(xiàn)時,可設為要自動出現(xiàn)時,可設為GTK_POLICY_AUTOMATICGTK_POLICY_AUTOMATIC;若設為;若設為GTK_POLICY_ALWAYSGTK_POLICY_ALWAYS,滾動條會一直出現(xiàn)在滾動窗口上。,滾動條會一直出現(xiàn)在滾動窗口上。 可以用下面的函數將構件放到滾動

59、窗口里:可以用下面的函數將構件放到滾動窗口里:voidgtk_scrolled_window_add_with_viewport(GtkScrolledWindowvoidgtk_scrolled_window_add_with_viewport(GtkScrolledWindow* *scrolled_wiscrolled_window,GtkWidgetndow,GtkWidget* *child); child); 下面是一個簡單示例:在滾動窗口構件中放置一個表格構件,并在表格中放下面是一個簡單示例:在滾動窗口構件中放置一個表格構件,并在表格中放100100個開個開關按鈕。關按鈕。 按鈕

60、盒按鈕盒按鈕盒( (ButtonBoxesButtonBoxes) )可以很方便地快速布置一組按鈕。它有可以很方便地快速布置一組按鈕。它有水平和垂直兩種樣式。可以用以下函數創(chuàng)建水平或垂直按鈕水平和垂直兩種樣式。可以用以下函數創(chuàng)建水平或垂直按鈕盒:盒:GtkWidgetGtkWidget* *gtk_hbutton_box_new(voidgtk_hbutton_box_new(void); ); GtkWidgetGtkWidget* *gtk_vbutton_box_new(voidgtk_vbutton_box_new(void); ); 將按鈕添加到按鈕盒中可以用下面這個通常的函數:將按

溫馨提示

  • 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

提交評論