颜色选择对话框、文件选择控件

最后更新于:2022-04-01 20:22:07

### 颜色选择 Color Selection 颜 色选择(color selection)构件是一个用来交互式地选择颜色的构件。这个组合构件让用户通过操纵RGB值(红绿蓝)和HSV值(色度、饱和度、纯度)来选择颜 色。这是通过调整滑动条(sliders)的值或者文本输入构件的值,或者从一个色度/饱和度/纯度条上选择相应的颜色来实现的。你还可以通过它来设置颜 色的透明性。看下面的代码例子: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-24_57bd77995cd95.jpg) ~~~ /*File:color.c *Date:2014-01-05 *Author:sjin *Mail:413977243@qq.com */ #include #include #include 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”按钮,可以极大地减少编程时间。看下面的代码: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-24_57bd779979b4a.jpg) ~~~ /*File:color.c *Date:2014-01-05 *Author:sjin *Mail:413977243@qq.com */ #include #include #include /*获得文件名,并将它打印到控制台上*/ 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; } ~~~
';