📄 ex25_1.c
字号:
/ * filename: ex25_1.c */
#include <gtk/gtk.h>
#include <stdlib.h>
gint color_state=0;
typedef struct{
GtkWidget *dialog;
GdkColor *color;
}diacolor;
void OnCancel(GtkWidget *widget,gpointer data)
{
color_state=0;
gtk_grab_remove(widget);
if (data!=NULL)
gtk_widget_destroy(GTK_WIDGET(data));
}
void OnClose(GtkWidget *widget,gpointer data)
{
gtk_widget_destroy(GTK_WIDGET(data));
gtk_main_quit();
}
void OnExit(GtkWidget *widget,gpointer data)
{
gtk_main_quit();
}
void ColorChanged(GtkWidget *widget,GtkColorSelectionDialog *cls)
{
GtkColorSelection *cs;
gdouble color[4];
/* get the color */
cs=GTK_COLOR_SELECTION(cls->colorsel);
gtk_color_selection_get_color(cs,color);
}
void OnSelectedColor(GtkWidget *widget,diacolor *colorinfo)
{
GtkColorSelection *cls;
GtkColorSelectionDialog *colors;
gdouble color[4];
/* get the dialog box and the color */
colors=(GtkColorSelectionDialog *)colorinfo->dialog;
cls=GTK_COLOR_SELECTION(colors->colorsel);
gtk_color_selection_get_color(cls,color);
colorinfo->color->red=color[0]*0xffff;
colorinfo->color->green=color[1]*0xffff;
colorinfo->color->blue=color[2]*0xffff;
color_state=1;
gtk_widget_destroy(GTK_WIDGET(colors));
}
int GetSelectedColor (GdkColor *cl)
{
static GtkWidget *window=NULL;
diacolor *colorinfo;
/* create a color selection dialog window */
window=gtk_color_selection_dialog_new("选择颜色");
colorinfo=g_malloc(sizeof(diacolor));
colorinfo->dialog=window;
colorinfo->color=cl;
gtk_color_selection_set_opacity(
GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(window)->colorsel),TRUE);
gtk_color_selection_set_update_policy(
GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(window)->colorsel),
GTK_UPDATE_CONTINUOUS);
gtk_signal_connect(GTK_OBJECT(window),"destroy",
GTK_SIGNAL_FUNC(gtk_main_quit),NULL);
/* transfer function ColorChanged when color changes */
gtk_signal_connect(
GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(window)->colorsel),
"color_changed",GTK_SIGNAL_FUNC(ColorChanged), window);
/* transfer function OnSelectedColor when Ok button is clicked */
gtk_signal_connect(
GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(window)->ok_button),"clicked",
GTK_SIGNAL_FUNC(OnSelectedColor),colorinfo);
/* transfer function CloseDialog when Cancel button is clicked */
gtk_signal_connect(
GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(window)->cancel_button),"clicked",
GTK_SIGNAL_FUNC(OnCancel),GTK_OBJECT(window));
gtk_widget_show(window);
/* only this dialog window can be done now */
gtk_grab_add(window);
gtk_main();
return color_state;
}
GtkStyle *CreatStyleByColor(GdkColor bg)
{
GtkStyle *defausty;
GtkStyle *sty;
int i;
defausty=gtk_widget_get_default_style();
sty=gtk_style_copy(defausty);
for(i=0;i<=4;i++)
{
sty->bg[i]=bg;
}
return(sty);
}
void SetWidgetStyle(GtkWidget *widget,gpointer data)
{
GtkStyle *style;
style=(GtkStyle*)data;
gtk_widget_set_style(widget,style);
if(GTK_IS_CONTAINER(widget))
{ gtk_container_foreach(GTK_CONTAINER(widget),SetWidgetStyle,style);
}
}
void OnSelect(GtkWidget *widget,gpointer gdata)
{
GtkStyle *sty;
GdkColor color;
/* transfer function GetSelectedColor to get a color */
GetSelectedColor(&color);
/* create a style */
if(color_state)
{
sty=CreatStyleByColor(color);
/* transfer function SetStyle to set the style of the widget */
SetWidgetStyle(widget,(gpointer)sty);
}
}
int main(int argc, char *argv[])
{
GtkWidget *dialog_window;
GtkWidget *button1;
GtkWidget *button2;
GtkWidget *label;
gtk_init(&argc, &argv);
/* create a dialog window */
dialog_window=gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dialog_window),"test color");
gtk_signal_connect(GTK_OBJECT(dialog_window),"destroy",
GTK_SIGNAL_FUNC(OnExit),NULL);
gtk_container_border_width(GTK_CONTAINER(dialog_window),10);
/*GTK_WIDGET_SET_FLAGS(dialog_window,GTK_NO_WINDOW); */
/* create "Select" and "Close" buttons */
button1=gtk_button_new_with_label("Select");
button2=gtk_button_new_with_label("Close");
GTK_WIDGET_SET_FLAGS(button1,GTK_CAN_DEFAULT);
GTK_WIDGET_SET_FLAGS(button2,GTK_CAN_DEFAULT);
/* add the buttons to the dialog action_area */
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_window)->action_area),
button1,TRUE,TRUE,0);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_window)->action_area),
button2,TRUE,TRUE,0);
/* click "select" button to transfer function OnSelect */
gtk_signal_connect(GTK_OBJECT(button1),"clicked",
GTK_SIGNAL_FUNC(OnSelect),NULL);
/* click "No" button to transfer function CloseDialog */
gtk_signal_connect(GTK_OBJECT(button2),"clicked",
GTK_SIGNAL_FUNC(OnClose),dialog_window);
gtk_widget_show(button1);
gtk_widget_show(button2);
gtk_widget_grab_default(button1);
/* create a label with message */
label=gtk_label_new("Please select the color of the button.");
gtk_misc_set_padding(GTK_MISC(label),10,10);
/* add the label to the dialog box */
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_window)->vbox),
label,TRUE,TRUE,0);
gtk_widget_show(label);
gtk_widget_show(dialog_window);;
gtk_main();
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -