Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1971581
  • 博文数量: 185
  • 博客积分: 10707
  • 博客等级: 上将
  • 技术积分: 1777
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-19 17:31
文章分类

全部博文(185)

文章存档

2014年(1)

2012年(6)

2011年(27)

2010年(13)

2009年(75)

2008年(63)

分类:

2009-02-27 10:14:32

  • 7、窗口布局初探
上回说到如何使用gdb来调试我们的程序,这回简单地介绍下如何有效地进行窗口布局,这也将是gtk编程基础入门的最后一部分;在接下来的日子里,笔者将针对gtk中的所有内容分专题,对每一部分都进行详细并且深入的描述,好了,进入今天的主题。

运行效果图:


hello_box.c 
/* 本例的主要目的是在主窗口中旋转一个box控件,再在box控件中
 * 放置一个单行编辑框和一个按钮
 * 并且单击按钮退出程序
 */
#include

//按钮“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()“ 的形式
2)什么是 box?
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,
gint spacing);
功能:创建一个新的水平 box 控件
参数: homogeneous:如果值为“TRUE”则所有放进去的控件都分配相同的大小
spacing:相邻控件之间的间距,单位为像素(pixel)
返回值:新创建的控件的指针。、
与之对应的 gtk_vbox_new() 用法完全相同。

4)gtk_box_pack_start()
void   gtk_box_pack_start     (GtkBox*box,
GtkWidget*child,
gboolean expand,
gboolean fill,
guint padding);
功能:往“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 这个源代码浏览软件。
阅读(1614) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~