GTK tutorial 八

Container Widgets

The EventBox

一些GTK widget没有用于显示用的X window,这些widget利用其父widget进行显示。由于没有window, 这些widget会在使用时存在问题。比如,这些widget不能接受event、如果他们的尺寸设置不合适,你也不能进行缩放,等等问题。EventBox 就是为这类widget解决这些相关的问题的。

EventBox不在屏幕上显示任何内容,它只负责为widget提供x window。

下面的例子显示了如何使用EventBox,例子的功能是,当放大窗口时,会有更多的文本内容出现,当点击文本内容时,程序会退出。

运行结果:

/*eventwidget.c*/
#include<stdio.h>
#include<gtk/gtk.h>

int main(int argc, char *argv)
{

    GtkWidget *window;
    GtkWidget *event_box;
    GtkWidget *label;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title(GTK_WINDOW(window), "Event Box");

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(exit), NULL);

    gtk_container_set_border_width(GTK_CONTAINER(window), 10);

    event_box = gtk_event_box_new();
    gtk_container_add(GTK_CONTAINER(window), event_box);
    gtk_widget_show(event_box);

    label = gtk_label_new("Click here to quit, quit, quit, quit,quit");
    gtk_container_add(GTK_CONTAINER(event_box), label);
    gtk_widget_show(label);

    gtk_widget_set_size_request(label, 110, 20);

    gtk_widget_set_events(event_box, GDK_BUTTON_PRESS_MASK);
    g_signal_connect(G_OBJECT(event_box), "button_press_event", G_CALLBACK(exit), NULL);

    gtk_widget_realize(event_box);
    gdk_window_set_cursor(event_box->window, gdk_cursor_new(GDK_HAND1));

    gtk_widget_show(window);

    gtk_main();

    return 0;
}

编译命令:

gcc -Wall -g eventwidget.c -o eventwidget `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0` 

The Alignment widget

Alignment widget的功能是,根据Alignment widget的尺寸放置widget在其window中。

Fixed Container

Fixed Container的功能是,可以将widget放在其窗口的固定位置,这个位置是相对与其窗口的左上角的。

下面的例子显示了Fixed Container的用法。

运行结果:

/*fixconta.c*/
#include<gtk/gtk.h>

gint x = 50;
gint y = 50;

static void move_button(GtkWidget *widget, GtkWidget *fixed)
{
    x = (x + 30) % 300;
    y = (y + 50) % 300;

    gtk_fixed_move(GTK_FIXED(fixed), widget, x, y);
}

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *fixed;
    GtkWidget *button;
    gint i;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Fixed Container");

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);


    gtk_container_set_border_width(GTK_CONTAINER(window), 10);

    fixed = gtk_fixed_new();
    gtk_container_add(GTK_CONTAINER(window), fixed);
    gtk_widget_show(fixed);

    for(i = 1; i <= 3; i++)
    {
        button = gtk_button_new_with_label("Press me");

        g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(move_button), (gpointer)fixed);

        gtk_fixed_put(GTK_FIXED(fixed), button, i*50, i*50);

        gtk_widget_show(button);
    }

    gtk_widget_show(window);
    
    gtk_main();

    return 0;
}

 编译命令:

gcc  -Wall -g fixconta.c -o fixconta `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0` 

 Layout Container

Layout Container 与Fixed Container 类似,区别在于,Layout Container 实现了一个无限的scrolling area (无限意思是在2^32之间都行)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值