Box 布局

Box 是 GTK+ 的布局之一, 一般不直接使用 Box, 而是使用其派生类 HBox 和 VBox.HBox 以水平方式排列小部件, 而 VBox 则以垂直方式排列它们.
GtkWidget * gtk_hbox_new ( gboolean homegenous, gint spacing );homegenous 为 TRUE 时, 每个小部件分得相等大小的空间, 并居中.
GtkWidget * gtk_vbox_new ( gboolean homegenous, gint spacing );
spacing 为小部件周围的空白大小.
要将小部件加到 Box 之内也有两种方式.
void gtk_box_pack_start ( GtkBox * box, GtkWidget * child, gboolean expand, gboolean fill, gint padding );start 方式对于 HBox 来说是从左到右添加小部件, 对于 VBox 来说是自顶向下添加小部件; end 方式则反之.
void gtk_box_pack_end ( GtkBox * box, GtkWidget * child, gboolean expand, gboolean fill, gint padding );
box 是 Box 小部件.
child 是想要放入布局容器中的小部件.
expand 是..., 我还不太清楚.
padding 是 Box 内部的空白边距.
/**
* Box 布局
*/
#include <gtk/gtk.h>
// 关闭程序
void CloseTheApp ( GtkWidget * widget, gpointer data ) {
gtk_main_quit ();
}
// 确认登录
void Login ( GtkWidget * widget, gpointer data ) {
g_print ( "you clicked \'OK\'.\n" );
}
// 创建一个窗口
GtkWidget * MakeWindow () {
GtkWidget * window;
window = gtk_window_new ( GTK_WINDOW_TOPLEVEL );
gtk_container_set_border_width ( GTK_CONTAINER ( window ), 10 );
gtk_window_set_title ( GTK_WINDOW ( window ), "Box" );
gtk_signal_connect ( GTK_OBJECT ( window ),
"destroy",
GTK_SIGNAL_FUNC ( CloseTheApp ),
NULL );
return window;
}
// 创建一个输入面板
// caption 指向标签上显示的字符串
// visibility 指示文本域的输入是否可见, 如不可见则显示为星号
GtkWidget * MakeEntryBox ( gchar * caption, gboolean visibility ) {
GtkWidget * box; // 输入面板
GtkWidget * label; // 标签
GtkWidget * entry; // 文本域
// 初始化面板为水平分布, 紧凑分配空间, 间隙为 5
box = gtk_hbox_new ( FALSE, 5 );
// 标签, 加到输入面板中
label = gtk_label_new ( caption );
gtk_box_pack_start ( GTK_BOX ( box ), label, TRUE, FALSE, 0 ); // 从左到右添加小部件
// 文本域, 加到输入面板中
entry = gtk_entry_new ();
gtk_entry_set_visibility ( GTK_ENTRY ( entry ), visibility );
gtk_box_pack_start ( GTK_BOX ( box ), entry, FALSE, FALSE, 0 ); // 从左到右添加小部件
return box;
}
// 创建一个按钮面板
GtkWidget * MakeButtonBox () {
GtkWidget * box; // 按钮面板
GtkWidget * okButton; // 确认按钮
GtkWidget * cancelButton; // 取消按钮
// 初始化面板为水平分布, 均匀分配空间, 间隙为 5
box = gtk_hbox_new ( TRUE, 5 );
// 确认按钮, 加到按钮面板中
okButton = gtk_button_new ();
gtk_button_set_label ( GTK_BUTTON ( okButton ), "OK" );
gtk_signal_connect ( GTK_OBJECT ( okButton ),
"clicked",
GTK_SIGNAL_FUNC ( Login ),
NULL );
gtk_box_pack_end ( GTK_BOX ( box ), okButton, FALSE, TRUE, 0 ); // 从右到左添加小部件
// 取消按钮, 加到按钮面板中
cancelButton = gtk_button_new ();
gtk_button_set_label ( GTK_BUTTON ( cancelButton ), "Cancel" );
gtk_signal_connect ( GTK_OBJECT ( cancelButton ),
"clicked",
GTK_SIGNAL_FUNC ( CloseTheApp ),
NULL );
gtk_box_pack_end ( GTK_BOX ( box ), cancelButton, FALSE, TRUE, 0 ); // 从右到左添加小部件
return box;
}
gint main ( gint argc, gchar * argv[] ) {
GtkWidget * window;
GtkWidget * mainbox;
GtkWidget * usernamebox;
GtkWidget * passwordbox;
GtkWidget * buttonbox;
gtk_init ( &argc, &argv );
window = MakeWindow ();
usernamebox = MakeEntryBox ( "Username: ", TRUE );
passwordbox = MakeEntryBox ( "Password: ", FALSE );
buttonbox = MakeButtonBox ();
mainbox = gtk_vbox_new ( FALSE, 10 ); // 初始化主面板为垂直分布, 紧凑分配空间, 间隙为 10
gtk_box_pack_start ( GTK_BOX ( mainbox ), usernamebox, FALSE, FALSE, 0 ); // 从上到下添加小部件
gtk_box_pack_start ( GTK_BOX ( mainbox ), passwordbox, FALSE, FALSE, 0 ); // 从上到下添加小部件
gtk_box_pack_start ( GTK_BOX ( mainbox ), buttonbox, FALSE, FALSE, 0 ); // 从上到下添加小部件
gtk_container_add ( GTK_CONTAINER ( window ), mainbox ); // 将主面板添加到窗口上
gtk_widget_show_all ( window );
gtk_main ();
return 0;
}
没有评论:
发表评论