Chinaunix首页 | 论坛 | 博客
  • 博客访问: 206562
  • 博文数量: 32
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 295
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-06 20:47
文章分类

全部博文(32)

文章存档

2009年(11)

2008年(21)

我的朋友

分类: LINUX

2009-02-19 22:03:32

先看代码:
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 中的所有对象。

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“中的各个参数的值,然后重新编译运行程序,根据运行效果来体会各个参数的关系吧。
阅读(2016) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~