GTK tutorial 十四

Color Selection

color selection widget,使用户能够自由选择颜色。在很多应用中,当我们选择颜色时就会弹出一个能够交互的配色窗口。这个窗口的功能就是此widget实现的。下面实现一个配色窗口来示例此widget的用法。

程序运行结果:

/*colorselc.c*/
#include<glib.h>
#include<gdk/gdk.h>
#include<gtk/gtk.h>

GtkWidget *colorseldlg = NULL;
GtkWidget *drawingarea = NULL;
GdkColor color;

static void color_changed_cb(GtkWidget *widget, GtkColorSelection *colorsel)
{
    GdkColor ncolor;

    gtk_color_selection_get_current_color(colorsel, &ncolor);
    gtk_widget_modify_bg(drawingarea, GTK_STATE_NORMAL, &ncolor);
}

static gboolean area_event(GtkWidget *widget, GdkEvent *event, gpointer client_data)
{
    gint handled = FALSE;
    gint response;
    GtkColorSelection *colorsel;

    if(event->type == GDK_BUTTON_PRESS)
    {
        handled = TRUE;

        if(colorseldlg == NULL)
            colorseldlg = gtk_color_selection_dialog_new("Select background color");

        colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(colorseldlg)->colorsel);

        gtk_color_selection_set_previous_color(colorsel, &color);
        gtk_color_selection_set_current_color(colorsel, &color);
        gtk_color_selection_set_has_palette(colorsel, TRUE);

        g_signal_connect(G_OBJECT(colorsel), "color_changed",G_CALLBACK(color_changed_cb), (gpointer)colorsel);

        response = gtk_dialog_run(GTK_DIALOG(colorseldlg));

        if(response == GTK_RESPONSE_OK)
            gtk_color_selection_get_current_color(colorsel, &color);
        else
            gtk_widget_modify_bg(drawingarea, GTK_STATE_NORMAL, &color);
    }

    return handled;
}

static gboolean destroy_window(GtkWidget *widget, GdkEvent *event, gpointer client_area)
{
    gtk_main_quit();
    return TRUE;
}

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

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Color selection test");
    gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, TRUE);

    g_signal_connect(GTK_OBJECT(window), "delete_event", GTK_SIGNAL_FUNC(destroy_window), (gpointer)window);

    drawingarea = gtk_drawing_area_new();
    color.red = 0;
    color.blue = 65535;
    color.green = 0;
    
    gtk_widget_modify_bg(drawingarea, GTK_STATE_NORMAL, &color);
    gtk_widget_set_size_request(GTK_WIDGET(drawingarea), 200, 200);
    gtk_widget_set_events(drawingarea, GDK_BUTTON_PRESS_MASK);

    g_signal_connect(GTK_OBJECT(drawingarea), "event",
                    GTK_SIGNAL_FUNC(area_event), (gpointer)drawingarea);

    gtk_container_add(GTK_CONTAINER(window), drawingarea);

    gtk_widget_show(drawingarea);
    gtk_widget_show(window);

    gtk_main();

    return 0;

}

编译命令:

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

 File Selection

File Selection widget是用于显示文件对话框的一个方法。此widget本身就包含OK按钮、Cancle按钮和Help按钮。

下面举例说明其用法。

程序运行结果如下:

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

static void file_ok_sel(GtkWidget *w, GtkFileSelection *fs)
{
    g_print("%s\n", gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)));
}


int main(int argc, char *argv[])
{
    GtkWidget *filew;

    gtk_init(&argc, &argv);

    filew = gtk_file_selection_new("File Selection");

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

    g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filew)->ok_button),
                    "clicked", G_CALLBACK(file_ok_sel), (gpointer)filew);


    g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button),
                            "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(filew));

    gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), "test-test");


    gtk_widget_show(filew);
    
    gtk_main();

    return 0;
}

 编译命令:

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值