鱼C论坛

 找回密码
 立即注册
查看: 2989|回复: 0

[技术交流] C语言GUI程序设计-GTK图文系列-GtkWidget之容器(二)

[复制链接]
发表于 2014-10-26 15:10:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 G0398 于 2014-10-26 15:11 编辑

由于GTK中容器数量较多,这个教程拆分成多个帖子来写。

这一讲讲解GtkAspectFrame和GtkBox

GtkAspectFrame
这个部件类似于GroupBox,一个带有标签的框,由于它“继承”于 GtkBin,所以只能添加一个子部件。
aspect_frame.png
#include <gtk/gtk.h>

int window_width = 600;
int window_height = 400;

int main(int argc,char *argv[])
{
    GtkWidget *window,*aspect_frame,*label;
    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"hello fishc ");
    gtk_widget_set_size_request(window,300,200);

    aspect_frame = gtk_aspect_frame_new("Tags",0,0,0,TRUE);
    gtk_container_add(GTK_CONTAINER(window), aspect_frame);

    label = gtk_label_new("this is a tag.");
    gtk_container_add(GTK_CONTAINER(aspect_frame), label);

    gtk_widget_show_all(window);
    gtk_main ();

    return 0;
}
通过gtk_aspect_frame_new函数进行创建时参数设置。这个函数有5个参数:
label:设置frame的标签文本,
xalign:(参见上一节GtkAlignment图片)
yalign:(参见上一节GtkAlignment图片)
ratio:子部件纵横比(只有obey_child参数设置为false时生效)
obey_child:决定是否启用ratio参数

GtkBox

GtkBox是一个容器盒子,包括多个“子类”:GtkHBox,GtkVBox,GtkButtonBox,GtkHButtonBox,GtkVButtonBox。
其中H(horizontal)是水平的意思,V(verital)是垂直的意思,这里只讲一个带H的意思。

一个简单的GtkBox例子: gtk_box.png

#include <gtk/gtk.h>

int window_width = 600;
int window_height = 400;

int main(int argc,char *argv[])
{
    GtkWidget *window,*box,*label1,*label2;
    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"hello fishc ");
    gtk_widget_set_size_request(window,300,200);

    box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
    gtk_container_add(GTK_CONTAINER(window), box);

    label1 = gtk_label_new("label1");
    label2 = gtk_label_new("label2");

    gtk_box_pack_start(GTK_BOX(box), label1, TRUE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(box), label2, FALSE, FALSE, 0);

    gtk_widget_show_all(window);
    gtk_main ();

    return 0;
}
gtk_box_new函数创建一个GtkBox”对象“,它有两个参数:
orientation:用来指定方向,是水平还是垂直,
定义:
typedef enum {
  GTK_ORIENTATION_HORIZONTAL,
  GTK_ORIENTATION_VERTICAL
} GtkOrientation;
spacing:默认子部件间距。

在创建GtkBox的时候可以指定方向,这样就能创建出GtkHBox和GtkVBox了,另外文档里也指出:3.2版本后gtk_hbox_new和gtk_vbox_new是不赞成使用的(gtk_hbutton_box_new和gtk_vbutton_box_new也不赞成使用),所以我们只要了解了GtkBox和GtkButtonBox就可以了。

gtk_box_pack_start函数用来添加子部件。其中第三个参数(expand)为扩展,设置为TRUE后子部件将分配到box的所有扩展空间,第四个参数(fill)为填充,设置为TRUE用来填充空间,而不仅仅是padding,这个参数和expand参数配合使用,只有expand设置为TRUE时生效。

gtk_box_pack_end和start正好相反,这个函数是从右到左添加部件。

GtkButtonBox

注意大家不要被它的名字所迷惑,这家伙可以添加各种部件,不仅仅是button

下面是为GtkLabel布局的一个示例:
gtk_button_box.png
#include <gtk/gtk.h>

int window_width = 600;
int window_height = 400;

int main(int argc,char *argv[])
{
    GtkWidget *window,*button_box,*label1,*label2,*label3;
    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"hello fishc ");
    gtk_widget_set_size_request(window,300,200);

    button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
    gtk_container_add(GTK_CONTAINER(window), button_box);

    label1 = gtk_label_new("label1");
    label2 = gtk_label_new("label2");
    label3 = gtk_label_new("label2");

    gtk_container_add(GTK_CONTAINER(button_box), label1);
    gtk_container_add(GTK_CONTAINER(button_box), label2);
    gtk_container_add(GTK_CONTAINER(button_box), label3);

    gtk_widget_show_all(window);
    gtk_main ();

    return 0;
}
可以通过gtk_button_box_set_layout函数设置布局风格,效果这里就不展示了,可以参考这个图,大家自己设置看下。

gtk_button_box_with_button.png

(GTK bin文件夹下的gtk3-demo.exe例程所提供)

下篇继续讲布局容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 04:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表