天天看點

GTK+圖形化應用程式開發學習筆記(五)—組裝盒、組合表、固定容器構件

GTK+圖形化應用程式開發學習筆記(五)—組裝盒、組合表、固定容器構件

一、組裝盒

       組裝盒(GtkBox)也稱為組合構件。使用組裝盒可以将多個構件放在一個容器中。容器可以把組裝盒看作是一個構件。不像按鈕構件,組裝盒在螢幕上時看不見的。事實上,它們是同時跟蹤若幹子構件的不可見容器。組裝盒分為縱向組裝盒和橫向組裝盒。縱向組裝盒在垂直方向堆積構件,橫向組裝盒沿水準方向堆積構件。

       使用gtk_vbox_new函數建立縱向組裝盒,使用gtk_hbox_new函數建立橫向組裝盒。在建立組裝盒以後,可以使用gtk_box_pack_start函數或gtk_box_pack_end函數将構件放到組裝盒中。

為了顯示構件,必須将構件放入組裝盒中,并将組裝盒放在容器内。這等效于使容器具有容納多個構件的能力。雖然組裝盒沒有任何可視的部分,但是必須使容器群組裝盒成為可視。因為可視性影響加到容器内的構件。

2.

<col>

名稱::

gtk_hbox_new

gtk_vbox_new

功能:

建立一個橫向組裝盒(gtk_hbox_new)

建立一個縱向組裝盒(gtk_vbox_new)

頭檔案:

#include &lt;gtk/gtk.h&gt;

函數原形:

GtkWidget *gtk_hbox_new(gboolean homogeneous,gint spacing);

GtkWidget *gtk_vbox_new(gboolean homogeneous,gint spacing);

參數:

homogeneous 子構件是否具有同樣的大小

spacing      子構件間的距離

傳回值:

新的組裝盒

 建立組裝盒的函數取兩個參數,用來确定組裝盒在螢幕上的外觀。

第一個參數稱為homogeneous.用這一參數來确定所有增加的構件具有同樣的大小。例如,在一個橫向組裝盒中建立5個按鈕,分别帶有标号:fred、joe、sue、karen和Bartholomew the Great。如果homogeneous參數為FALSE,組裝盒建立5個不同大小的按鈕,正好在按鈕上容納各自的标号的正文。如果homogeneous參數為TRUE,組裝盒計算最大的構件大小,然後按照最大的構件的大小對所有按鈕配置設定同樣大小的空間。

       第二個參數稱為spacing。用它來确定插入組裝盒的構件之間的空間。将spacing參數設定為0表示在插入的構件之間不留白間。

3.

gtk_box_pack_start

gtk_box_pack_end

将構件放到組裝盒中

void gtk_box_pack_start(GtkBox *box,GtkWidget *child,gboolean expend,gboolean fill,guint padding);

void gtk_box_pack_end(GtkBox *box,GtkWidget *child,gboolean expend,gboolean fill,guint padding);

box         組裝盒的名稱

child         子構件的名稱

expend      構件周圍是否還有可擴充的空間

fill         構件是否需要充分利用構件周圍空間

padding     構件周圍要保留多少個填充的像元

函數gtk_box_pack_start将構件放在頂部(對于縱向組裝盒)或左邊(對于橫向組裝盒。函數gtk_box_pack_end将構件放在底部(對于縱向組裝盒)或右邊(對于橫向組裝盒)。

       gtk_box_paxk_start和gtk_box_pack_end有5個參數,其中3個參數用來确定如何将構件放在組裝盒内。

expand參數表示在所有構件加入組裝盒以後,構件周圍是否還有可擴充的空間。如果用homogenous格式建立組裝盒,則忽略這一參數。因為homegeneous參數表示構件在組裝盒内使用同樣大小的空間。

fill參數表示構件是否需要充分利用構件周圍空間。将此參數設定為TRUE允許構件稍稍擴大一點,以充分利用組裝盒配置設定給它的空間。将此參數設定為FALSE強制構件隻使用它需要的空間。多餘的空間圍繞構件的周圍分布。

padding參數表示在構件周圍要保留多少個填充的像元。多數情況下将它的值設定為0。

void PackNewButton(Gtk Widget *box,char *szLabel);

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

{

GtkWidget *window; /*定義窗體*/

GtkWidget *box;    /*定義組裝盒*/

gtk_init(&amp;argc,&amp;argv); /*初始化GTK+庫*/

window=gtk_window_new(GTK_WINDOW_TOPLEVEL); /*建立窗體*/

gtk_signal_connect(GTK_OBJECT(window),”destroy”,G_CALLBACK(gtk_main_quit),NULL); /*登記destroy信号,調用退出函數*/

box=gtk_vbox_new(FALSE,0); /*建立組裝盒*/

PackNewButton(box,”Button1”); /*調用建立按鈕函數*/

PackNewButton(box,”Button2”);

PackNewButton(box,”Button3”);

PackNewButton(box,”Button4”);

PackNewButton(box,”Button5”);

gtk_container_add(GTK_CONTAINER(window),box); /*把組裝盒放入窗體*/

gtk_widget_show(box); /*使組裝盒可視*/

gtk_widget_show(window); /*使窗體可視*/

gtk_main(); /*等待使用者操作*/

}

void PackNewButton(GtkWidget *box,char *szLabel)

GtkWidget *button;/*定義按鈕*/

button=gtk_button_new_with_label(szLabel); /*建立帶标号的按鈕*/

gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0); /*把按鈕加入組裝盒*/

gtk_widget_show(button); /*使按鈕可視*/

下面我們來編譯它:

$gcc –o box box.c `pkg-config –cflags –libs gtk+-2.0`

$./box

程式運作後會出現下面的圖形:

本例涉及到了按鈕的建立,大家暫時不必關注,我會在下面的章節介紹。

二、組合表

       組合表允許将多個構件放入一個視窗内,這一點類似于組裝盒。但是,組裝盒在放置構件時隻允許縱向或橫向的二維控制。組合表則類似于HTML表;允許用行和列控制構件的放置,并且對象可以取多行或多列。

4.

gtk_table_new

建立組合表

GtkWidget* gtk_table_new(guint rows,guint columns,gboolean homogeneous);

rows           表的行數

columns        表的列數

homogeneous    子構件是否具有同樣的大小

新的組合表

rows 和columns表示建表所用的行數和列數。homogeneous的效果和在組裝盒中homogeneous的使用效果相同。如果在建立組合表時它被設定為TRUE,表内的表框用最大構件的外框。如果它被設定為FALSE,則将每一列的寬度設定為本例中最大構件的寬度,每一行的高度設定為行中最大構件的高度。

行的排列從0~rows-1,列的排列從0~columns-1.當增加構件時,每個構件提供開始列、結束列、開始行和結束行。如果構件将被放在表的左上角,列的範圍從0到1。行的範圍從0到1。

5.

gtk_table_attach

gtk_table_attch_defaults

将控件加到表中

void gtk_table_attach(GtkTable *table,GtkWidget * child,guint left_attach,guint right_attach,guint top_attach,guint  botton_attach, GtkAttachOptions xoptions,GtkAttachOptions yoptions,guint xpadding,guint ypadding);

void gtk_table_attach_defaults( GtkTable *table,GtkWidget * child,guint left_attach,guint right_attach,guint top_attach,guint  botton_attach);

table           組合表名

child           子構件名

left_attach      橫向起始位置

right_attach     橫向結束位置

top_attach      縱向起始位置

botton_attach    縱向結束位置

xoptions        橫向選項

yoptions        縱向選項

xpadding       橫向填充像元

ypadding       縱向填充像元

兩個函數都可以将構件加到表中。

table為表的名字,child和widget為構件的名字。

left_attach、right_attach、top_attach和botton_attach表示控件在表中的位置。

xoptions和yoptions可以用GTK_FILL、GTK_SHRINK和GTK_EXPAND,或者用3者的任意組合。其中GTK_FILL選項表示構件充分利用配置設定給它的空間進行擴充。GTK_SHRINK選項允許構件縮小到比原來配置設定的空間還小的空間。GTK_EXPAND選項使表擴充填滿它插入的所有空間。

xpadding和ypadding表示圍繞構件填充的像元數。

gtk_table_attach_defaults函數取比較少的參數,并對gtk_table_attach函數使用的xoptions、yoptions、xpadding和ypadding參數用預設值來代替。對gtk_table_attach_defaults函數來說,xpadding和ypadding的預設值為0;而xoptions和yoptions的卻省值為(GTK_FILL|GTK_EXPAND)。

下面是應用組合表的程式例子:

/*table.c*/

#include &lt;getk/gtk.h&gt;

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

GtkWidget *table; /*定義組合表*/

GtkWidget *button; /*定義按鈕*/

gtk_init(&amp;argc,&amp;argv); /*初始化*/

gtk_signal_connect(GTK_OBJECT(window),”destroy”,G_CALLBACK(gtk_main_quit),NULL); /*登記destroy信号函數*/

table=gtk_table_new(4,4,FALSE); /*建立組合表*/

button=gtk_button_new_with_label(“button1”); /*建立按鈕*/

gtk_table_attach(GTK_TABLE(table),button,0,1,0,1,GTK_FILL,GTK_FILL,0,0);/*把按鈕加入組合表*/

gtk_widget_show(button); /*顯示按鈕*/

button=gtk_button_new_with_label(“button1”);

gtk_table_attach(GTK_TABLE(table),button,1,2,1,2,GTK_FILL,GTK_FILL,0,0);

gtk_widget_show(button);

gtk_table_attach(GTK_TABLE(table),button,2,3,2,3,GTK_FILL,GTK_FILL,0,0);

gtk_container_add(GTK_CONTAINER(window),table); /*把組合表添加到窗體上*/

gtk_widget_show(table); /*顯示組合表*/

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

return FALSE;

$gcc –o table table.c `pkg-config –cflags –libs gtk+-2.0`

$./table

這裡沒有給出參數的所用情況的程式,大家可以把相應的參數換一下,體會各個參數的作用。

三、固定容器構件

       GtkFixed(固定容器構件)允許将構件放在視窗的固定位置,這個位置是相對與視窗的左上角的。構件的位置可以動态改變。

       使用GtkFixed為構件定位,在大多數情況下都是不可取的。因為當使用者調整視窗尺寸時,勾結不能适應視窗的尺寸變化。當然,你可以在視窗尺寸變化的時候采取行動,調整構件的位置和大小。

       gtk_fixed_new函數用于建立新的固定容器構件。

6.

gtk_fixed_new

建立固定容器構件

GtiWidget *gtk_fixed_new(void);

新的固定容器構件

gtk_fixed_put函數将構件放在由x,y指定的位置。

7.

gtk_fixed_put

将構件放入固定容器構件的指定位置

void gtk_fixed_put(GtkFixed *fixed,GtkWidget *widget,gint16 x,gint16 y);

fixed       固定容器容器構件

widget      要放在固定容器構件中的構件

x           放置的橫坐标

y           放置的縱坐标

 gtk_fixed_move函數将指定構件移動到新位置。

8.

gtk_fixed_move

移動固定容器構件裡的構件到指定位子

void gtk_fixed_move(GtkFixed *fixed,GtkWidget *widget,gint16 x,gint16 y);

fixed        固定容器構件

下面是固定構件的程式例子:

GtkWidget *window;/*定義窗體*/

GtkWidget *fixed;/*定義固定容器構件*/

gint function(gpointer data);

gpointer data;

gint sign;

int x=0;

int y=0;

gtk_init(&amp;argc,&amp;argv);/*初始化*/

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);/*建立窗體*/

gtk_signal_connect(GTK_OBJECT(window),”destroy”,G_CALLBACK(gtk_main_quit),NULL);

fixed=gtk_fixed_new();/*建立固定容器構件*/

button=gtk_button_new_with_label(“button”);/*建立按鈕*/

gtk_fixed_put(GTK_FIXED(fixed),button,10,10);/*将按紐放在固定容器構件的指定位置*/

sign=g_timeout_add(600,function,data);/*建立定時器*/

gtk_container_add(GTK_CONTAINER(window),fixed);/*把固定容器構件放入窗體*/

gtk_widget_show(fixed);

gtk_widget_show(window);

gtk_main();

gint function(gpointer data)

gtk_fixed_move(GTK_FIXED(fixed),button,++x,++y);/*移動按紐*/

return TRUE;

       程式運作後得到如下的窗體:

       窗體每隔600毫秒便會擴大一次。