2007年3月6日星期二

Table 布局


Table 是 GTK+ 的另一种布局, 其使用方式类似于使用 jxl 构建 excel 文件的方式. 创建一个表格很简单.

GtkWidget * gtk_table_new ( gint rows, gint columns, gboolean homegenous );
rows 是行数.
columns 是列数.
homegenous 和 Box 的含义相同, 均匀分布而且元素居中.

将小部件添加到表格中也很方便.
void gtk_table_attach_defaults ( GtkTable * table, GtkWidget * widget,
gint left_attach, gint right_attach, gint top_attach, gint bottom_attach );
table 是布局容器.
widget 是想要添加到容器中的小部件.
left_attach 是小部件左边接触的网格线.
right_attach 是小部件右边接触的网格线.
top_attach 是小部件上边接触的网格线.
bottom_attach 是小部件下边接触的网格线.
假如一个小部件占据了第 2 行第 5 列的格子, 那么
gtk_table_attach_defaults ( table, widget, 4, 5, 1, 2 );
下面用 Table 布局来实现 Box 布局中实现的登录界面.
/**
* Table 布局
*/

#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 ), "Table" );
gtk_signal_connect ( GTK_OBJECT ( window ),
"destroy",
GTK_SIGNAL_FUNC ( CloseTheApp ),
NULL );

return window;
}

// 创建一个表格里面的标签
GtkWidget * CreateLabelInTable ( GtkWidget * table, gchar * caption,
gint left, gint right, gint top, gint bottom ) {
GtkWidget * label; // 标签
label = gtk_label_new ( caption ); // 初始化
// 添加到表格中
gtk_table_attach_defaults ( GTK_TABLE ( table ), label,
left, right, top, bottom );

return label;
}

// 创建一个表格里面的文本域
GtkWidget * CreateEntryInTable ( GtkWidget * table, gboolean visibility,
gint left, gint right, gint top, gint bottom ) {
GtkWidget * entry; // 文本域
entry = gtk_entry_new (); // 初始化
gtk_entry_set_visibility ( GTK_ENTRY ( entry ), visibility ); // 内容是否可视
// 添加到表格中
gtk_table_attach_defaults ( GTK_TABLE ( table ), entry,
left, right, top, bottom );

return entry;
}

// 创建一个表格里面的按钮
GtkWidget * CreateButtonInTable ( GtkWidget * table, gchar * caption, gpointer clickedFunc,
gint left, gint right, gint top, gint bottom ) {
GtkWidget * button; // 文本域
button = gtk_button_new_with_label ( caption ); // 初始化
gtk_signal_connect ( GTK_OBJECT ( button ),
"clicked",
GTK_SIGNAL_FUNC ( clickedFunc ),
NULL );
// 添加到表格中
gtk_table_attach_defaults ( GTK_TABLE ( table ), button,
left, right, top, bottom );

return button;
}

gint main ( gint argc, gchar * argv[] ) {
GtkWidget * window;
GtkWidget * table;

gtk_init ( &argc, &argv );

window = MakeWindow ();

table = gtk_table_new ( 3, 3, FALSE ); // 初始化为 3 行 3 列的表格, 网格大小不均而且内容不居中
gtk_table_set_row_spacings ( GTK_TABLE ( table ), 5 );
gtk_table_set_col_spacings ( GTK_TABLE ( table ), 5 );
gtk_container_add ( GTK_CONTAINER ( window ), table );

CreateLabelInTable ( table, "Username: ", 0, 1, 0, 1 );
CreateLabelInTable ( table, "Password: ", 0, 1, 1, 2 );
CreateEntryInTable ( table, TRUE, 1, 3, 0, 1 );
CreateEntryInTable ( table, FALSE, 1, 3, 1, 2 );
CreateButtonInTable ( table, "OK", Login, 2, 3, 2, 3 );
CreateButtonInTable ( table, "Cancel", CloseTheApp, 1, 2, 2, 3 );

gtk_widget_show_all ( window );
gtk_main ();
return 0;
}

2 条评论:

米兰 说...

呵呵~来踩踩~
模版好棒~能分享一下不?CSS不会弄啊~

mg12 说...

我将代码发送到你的 Gmail 邮箱了.