大家一起用gtk编程5(窗口布局初探)
转载请注明出处: http://lvjinhua.cublog.cn
作者:lvjinhua at gmail dot com
2006.09.24
- 7、窗口布局初探
运行效果图:
hello_box.c |
/* 本例的主要目的是在主窗口中旋转一个box控件,再在box控件中 * 放置一个单行编辑框和一个按钮 * 并且单击按钮退出程序 */ #include<gtk/gtk.h> //按钮“button”的回调函数 void cb_button(GtkWidget *widget, gpointer data) {//cb = call back g_print("你单击了按钮/n"); gtk_main_quit(); } int main(int argc, char *argv[]) { GtkWidget *main_window; //主窗口对象 GtkWidget *hbox, *button, *editor; gtk_init(&argc, &argv); main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_window_set_title(GTK_WINDOW(main_window), "Hello,Dubuntu2!"); gtk_window_set_default_size(GTK_WINDOW(main_window), 200,50); button = gtk_button_new_with_label("退出程序"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_button),NULL); editor = gtk_entry_new(); hbox = gtk_hbox_new(FALSE, 10); gtk_box_pack_start(GTK_BOX(hbox), editor, TRUE, TRUE, 10); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 10); gtk_container_add(GTK_CONTAINER(main_window), hbox); gtk_widget_show_all(main_window); gtk_main(); return 0; |
编程程序:gcc -o hello_box hello_box.c `pkg-config --cflags gtk+-2.0` -g -Wall 运行程序:./hello_box |
组件之间的关系:
1)几个新增函数:
- g_print("你单击了按钮/n"); :这是 glib 库提供的面向控制台的输出函数,其功能同标准C的 printf() 差不多,但在gtk程序中使用g_print()更具可移值性。
- gtk_entry_new():构造一个“单行文本输入框” 对象并返回此对象的指针。
- gtk_hbox_new():构造一个“水平”的盒子,用来装 单行输入框和按钮“
- gtk_box_pack_start():往盒子中”装“东西(这里是 enter 和 button)
- gtk_widget_show_all(main_window):显示 main_window 中的所有对象。
小道消息:在gtk中,所有创建对象的函数都是 ”gtk_对象名_new()“ 的形式 |
box是一种不可视(就是看不见)的对象,为什么会有box呢?
Gtk 在对待控件大小这点上,同 VC/VB/Delphi/PB/Qt 等都是不一样的,在前边这几个语言中,一般情况下,界面设计好后,其所有对象的大小都是固定的,也就是说不会因为屏幕分辨率或窗口大小发生变化而自动适应 这些变化(要实现自适应的功能也很麻烦)。而在 gtk 或者 Java 中,控件在窗口中的位置是个相对值,程序将根据当前环境自动调整控件的新位置,具体的调整方法是可以通过程序预设的。
box是一种”长条 形“的盒子,有”垂直”和“水平”两种,分别使用 gtk_hbox_new() 和 gtk_vbox_new() 来创建,可以往“盒子”里面放入一个或多个其它的控件,这是使用gtk_box_pack_start()函数实现的,当然,“盒子”里面也可以放入其它 的“盒子”,这就是gtk界面布局的关键,一般的gtk程序都是这样盒子套盒子再套盒子,在各个盒子中放入按钮,输入框,菜单等控件,这样就构成了一个复 杂的界面。
当然,界面布局也可以使用 table ,但用得最多的还是 box。
3)gtk_hbox_new()
GtkWidget* gtk_hbox_new (gboolean homogeneous, |
4)gtk_box_pack_start()
void gtk_box_pack_start (GtkBox*box,参数: box:就是往这个“box”中放入新的控件 child:就是放入这个控件 expand 和 fill:笔者始终认为这两个参数只可意会,不可言传 padding:指示同 "child" 控件相邻控件之间的间距(单位为像素 pixel) |
5)GTK_BOX(object) 宏
这个宏用来将 object 参数强制转换为 GtkBox 对象(当然,也进行类型检查),gtk中所有的对象都有相似的宏,比如GtkWindow对象有GTK_WINDOW()宏,GtkButton对象有GTK_BUTTON()宏等。
好了,今天的内容就到这里,读者可以自己修改 "gtk_hbox_new 和 gtk_box_pack_start“中的各个参数的值,然后重新编译运行程序,根据运行效果来体会各个参数的关系吧。
推荐: devhelp 帮助,在编程中有不清楚的gtk函数或宏,可随时通过它查询。
入 门部分结束,笔者的文笔是很烂的,也不知道前边的内容写得怎么样,希望大家能够看明白;在接下来的日子里,我们会分别详细地介绍各个 gtk 控件(可视的与不可视的),并且尽可能写些小示例来演示一些控件或接口函数的功能; 在介绍完控件后,还有 glib 专题,”国际化/本地华“专题, glade 专题,解析 hypersrc 这个源代码浏览软件。