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 <gtk/gtk.h>
函數原形:
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(&argc,&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 <getk/gtk.h>
int main(int argc,char *argv[])
GtkWidget *table; /*定義組合表*/
GtkWidget *button; /*定義按鈕*/
gtk_init(&argc,&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(&argc,&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毫秒便會擴大一次。