GTK编程基础---颜色选择对话框、文件选择控件

颜色选择 Color Selection

颜 色选择(color selection)构件是一个用来交互式地选择颜色的构件。这个组合构件让用户通过操纵RGB值(红绿蓝)和HSV值(色度、饱和度、纯度)来选择颜 色。这是通过调整滑动条(sliders)的值或者文本输入构件的值,或者从一个色度/饱和度/纯度条上选择相应的颜色来实现的。你还可以通过它来设置颜 色的透明性。看下面的代码例子:


/*File:color.c
 *Date:2014-01-05
 *Author:sjin
 *Mail:413977243@qq.com
 */

#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <glib.h>

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

/*颜色改变处理信号*/
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);
}

/*绘图区事件处理函数*/
gint 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("选择背景颜色");
        }
        /*获取颜色选择构件*/
        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);

        /*为color_changed 信号设置回调函数,将用户数据设置为颜色选择构件*/
        g_signal_connect(GTK_OBJECT(colorsel),"color_changed",G_CALLBACK(color_changed_cb),(gpointer)colorsel);

        /*显示对话框*/
        response = gtk_dialog_run(GTK_DIALOG(colorseldlg));

        if(response == GTK_RESPONSE_OK){
            /*获取当前颜色,并保存到color中*/
            gtk_color_selection_get_current_color(colorsel,&color);
        }else{
            /*设置成原来的颜色*/
            gtk_widget_modify_bg(drawingarea,GTK_STATE_NORMAL,&color);
        }

        gtk_widget_hide(colorseldlg);
    }
    /*只有返回True,才能弹出颜色选择控件*/
    return handled;
}

/*关闭、退出事件处理函数*/
gint destroy_window(GtkWidget *widget,GdkEvent *event,gpointer client_data)
{
    gtk_main_quit();
    return TRUE;
}

int main( int   argc, char *argv[] )
{
    /* GtkWidget 是构件的存储类型 */
    GtkWidget *window;
    GtkWidget *button;
    
    /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/
    gtk_init (&argc, &argv);
        /* 创建一个新窗口 */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    /*设置窗口标题*/
    gtk_window_set_title(GTK_WINDOW(window),"My first program helloworld!");
   
    /**/
    gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE);
    /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭”
     * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 destroy_window() 函数。
     * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/
    g_signal_connect (GTK_OBJECT(window), "delete_event",G_CALLBACK (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 程序必须有一个 gtk_main() 函数。程序运行停在这里
     * 等待事件 (如键盘事件或鼠标事件) 的发生。*/
    gtk_main ();
    
    return 0;
}

文件选择 File Selections
文件选择(file selection)构件是一种快速、简单的显示文件对话框的方法。它带有“Ok”、“Cancel”、“Help”按钮,可以极大地减少编程时间。看下面的代码:



/*File:color.c
 *Date:2014-01-05
 *Author:sjin
 *Mail:413977243@qq.com
 */

#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <glib.h>

/*获得文件名,并将它打印到控制台上*/
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 是构件的存储类型 */
    GtkWidget *filew;
    
    /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/
    gtk_init (&argc, &argv);

    /*创建一个新的文件选择构件*/
    filew = gtk_file_selection_new("文件选择对话框");

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

    /*为ok_button按钮设置回调函数,链接到file_ok_sel 函数*/
    g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button),"clicked",G_CALLBACK(file_ok_sel),filew);

    /*为cancel_button设置回调函数*/
    g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button),"clicked",G_CALLBACK(gtk_main_quit),filew);

    /*设置文件名,不如这个一个文件保存对话框,我们给了一个缺省文件名*/
    gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew),"1111.png");
    gtk_widget_show (filew);
    
    /* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里
     * 等待事件 (如键盘事件或鼠标事件) 的发生。*/
    gtk_main ();
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值