⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex25_1.c

📁 linux 高级编程的例子源码,包括了本书上的所有代码
💻 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 + -