转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
Linux GUI编程笔记之GTK+篇(2)         ★★★★

Linux GUI编程笔记之GTK+篇(2)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1895 更新时间:2009/4/22 20:45:33

Linux GUI编程笔记之GTK+篇(2)
                 -----窗体布局


从上文我们知道了GTK+程序的基本框架和其内在的工作原理,现在让我们一起来学习如何在一个窗体上摆放控件。用惯了Windows下VB,Delphi等RAD工具的朋友一定会感到疑惑,怎么在窗体上摆一个控件还要大动干戈?这可能是Linux编程的缺陷吧(虽然我们也可以用glade等工具进行GUI构建,但是和VB等傻瓜工具比还是很有差距的)。但是我还是喜欢自己用代码实现GUI,虽然虽然好像有点自讨苦吃,但是这样却使我有一种真正在编程的感觉:)

要了解怎么样在GTK+窗体上摆放控件,我们首先需要了解“窗体布局”这个概念。不知道现在C#等.NET平台语言有没有“窗体布局器”这个概念(我以前用VB6.0, VC6.0的时候是没有的,不过Java里面有Layout这个类实现窗体布局),对于用惯Windows下开发工具的朋友肯定对这个概念比较陌生。在GTK+里不能像VB那样直接把所有需要的控件都直接加到窗体上,我们需要用各种容器(box,table等)的组合来完成这些动作。各种能够容纳其他控件的特殊控件(容器)都是窗体布局器。

在GTK+中有两种常用的布局容器:盒状容器(box)和表格容器(table)
下面让我们来分别认识他们:

1 - 盒状容器

盒状容器是能够线性容纳子控件的容器,分为水平盒(gtk_hbox)和垂直盒(gtk_vbox)两种。
水平盒就是能够使子控件水平一线排开的容器,垂直盒则让子控件从上到下垂直排列。
以水平盒为例子,产生一个水平盒的函数是:

GtkWidget *gtk_hbox_new ( gboolean homogeneous,  //子控件是否一样大小(和最大的控件相同)
                          gint     spacing );   //默认子控件之间的间距

在盒子里加入子控件的函数:

void gtk_box_pack_start( GtkBox    *box,  //盒子
                         GtkWidget *child,  //子控件
                         gboolean   expand,  //盒子是否占据所有分配的空间
                         gboolean   fill,  //子控件是否分开(TRUE为分开)或挤在一起
                         guint      padding );  //子控件是否丰满(TRUE且expand应该为TRUE)或者缩成一定大小

为了理解这两个程序,我们看一个完整的程序:

#include

/* 回调函数,使程序退出 */
void quit_program(GtkWidget *widget, gpointer data)
{
 gtk_main_quit();
}

int main(int argc, char *argv[])
{
 GtkWidget *window;
 GtkWidget *box;
 GtkWidget *button;
 
 gtk_init(&argc, &argv);  /* 初始化程序 */
 
 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 gtk_window_set_title(GTK_WINDOW(window), "横向盒状容器");
 g_signal_connect(G_OBJECT(window), "destroy",
   G_CALLBACK(quit_program), NULL);
 gtk_container_set_border_width(GTK_CONTAINER(window), 5);
 
 box = gtk_hbox_new (FALSE, 0);  /* 新建一个横向盒子,子控件不需要一样大,默认间距0 */
   
    /* 建立4个按钮 */
    button = gtk_button_new_with_label ("按钮一");
    gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 3);
    gtk_widget_show (button);
   
    button = gtk_button_new_with_label ("按钮二");
    gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 3);
    gtk_widget_show (button);
   
    button = gtk_button_new_with_label ("按钮三");
    /* 使这个按钮占据多余空间 */
    gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 3);
    gtk_widget_show (button);
   
    button = gtk_button_new_with_label ("按钮四");
    gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 3);
    gtk_widget_show (button);
   
    gtk_container_add(GTK_CONTAINER(window), box);
    gtk_widget_show(box);
    gtk_widget_show(window);
   
    gtk_main();
   
    return 0;
}

这个程序编译运行后的结果如下:

按钮3因为设置了expand=TRUE,fill=TRUE,于是充分扩展了自己; 其他按钮都缩在最小的范围内。
同样,垂直盒子也有同样的函数:

GtkWidget*  gtk_vbox_new(gboolean homogeneous,  //子控件是否同样大小
                         gint spacing);   //默认的子控件之间间距
                        
void gtk_box_pack_start( GtkBox    *box,  //盒子
                         GtkWidget *child,  //子控件
                         gboolean   expand,  //盒子是否占据所有分配的空间
                         gboolean   fill,  //子控件是否分开(TRUE为分开)或挤在一起
                         guint      padding );  //子控件是否丰满(TRUE且expand应该为TRUE)或者缩成一定大小


2 - 表格容器
表格容器是在水平和垂直方向都可以摆放多个子控件的容器,想象一个表格容器就像一个Excel表格一样,子控件可以占据一个格子,也可以占据连续的多个格子,这样就可以十分自由的排列我们的子控件了。

产生一个新表格容器的函数是:

GtkWidget *gtk_table_new( guint    rows,   //行数
                          guint    columns,  //列数
                          gboolean homogeneous );  //子控件是否一样大(和最大子控件一样大)

假设我们用: gtk_table_new(2, 2, TRUE)生成一个表格,其逻辑上就像下面的图形一样:

 0          1          2
0+----------+----------+
   |                |                |
1+----------+----------+
   |                |                |
2+----------+----------+

然后我们可以用下面的函数往表格上面填加子控件:
void gtk_table_attach( GtkTable         *table,  //盒子
                       GtkWidget        *child,  //要加入盒子的子控件
                       guint            left_attach,   //左边界
                       guint            right_attach,  //右边界
                       guint            top_attach,  //上边界
                       guint            bottom_attach,  //下边界
                       GtkAttachOptions xoptions,
                       GtkAttachOptions yoptions,
                       guint            xpadding,
                       guint            ypadding );

哇!那么多参数,让人怎么怎么用啊?!
呵呵,不要害怕:)其实很简单的,4个XXX_attach()是控制子控件摆放位置的:

如果我们要在左上角那个格子放一个控件,那么left_attach=0, right_attach=1,
top_attach=0, bottom_attach=1(好象用4条线隔了一个空间)
同理,如果想在下面一整行摆一个控件,那么left_attach=0, right_attach=2,
top_attach=1, bottom_attach=2

然后下面两个参数xoption, yoption是控制子控件行为的,控制参数有:
GTK_FILL: 如果盒子比子控件大,而且GTK_FILL已经设置,则子控件会扩展成盒子那么大

GTK_SHRINK:如果GTK_SHRINK已经设置,那么当用户改变窗口大小时(变小),子控件会跟着变小

GTK_EXPAND:如果这个位设置了,那么盒子容器就会占据所有窗体上留下的空间

使用的时候我们可以用或”|“符号连接他们一起使用,比如:GTK_FILL | GTK_EXPAND

再下面两个参数就是代表子控件在X(横向),

[1] [2]  下一页


[C语言系列]C# 和 Linux 时间戳转换  [Web开发]PHP flock文件锁介绍
[Web开发]flock() Linux下的文件锁  [电脑应用]Linux下的六个免费的虚拟主机管理系统介绍
[电脑应用]Linux数据库大比拚  [操作系统]在Windows中玩转Linux操作系统
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]掌握 Linux 调试技术
[办公软件]理解 Linux 配置文件  [聊天工具]Real10 & Xpdf installation on Linux Box
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台