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`