免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1318 | 回复: 0
打印 上一主题 下一主题

gtk 窗口布局简介 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-19 22:03 |只看该作者 |倒序浏览

                先看代码:
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“中的各个参数的值,然后重新编译运行程序,根据运行效果来体会各个参数的关系吧。
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/87718/showart_1834884.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP