GTK+编程应用--日历

/×
ID:chris
date:3月2日 2012年
×/
#include<gtk/gtk.h>
#include<stdio.h>

gint status ;
GtkWidget* window ;
GtkWidget* calendar ;
GtkWidget *vbox ,*hbox,*hbox1;
GtkWidget *frame ;
GtkWidget *separator ;
GtkWidget *vbox1 ,*vbox2 , *vbox3;
GtkWidget *check_button ,*label,*label1 ,*label2 ,*label3 ,*button;
const gchar *str1,*str2,*str3 ;
gchar str[100] ;	
gint year, month , day ;

void change(GtkWidget *calendar){
	gtk_calendar_display_options(GTK_CALENDAR(calendar) , status);
}

void call_show_heading(GtkWidget *widget ,GtkWidget *calendar)
{
	status = ( status ^ 1 ) ;
	change(calendar);
}
void call_show_day_names(GtkWidget *widget ,GtkWidget *calendar)
{
	status = ( status ^ 2 ) ;
	change(calendar);
}
void call_no_month_change(GtkWidget *widget ,GtkWidget *calendar)
{
	status = ( status ^ 4 ) ;
	change(calendar);
}
void call_show_week_numbers(GtkWidget *widget ,GtkWidget *calendar)
{
	status = ( status ^ 8 ) ;
	change(calendar);
}
void call_week_start_monday(GtkWidget *widget ,GtkWidget *calendar)
{
	status = ( status ^ 16 ) ;
	change(calendar);	
}

void create_window(){
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_position(GTK_WINDOW(window) , GTK_WIN_POS_CENTER);
	gtk_window_set_default_size(GTK_WINDOW(window) , 400 , 300); 
	gtk_window_set_title(GTK_WINDOW(window) , "Calendar");
	gtk_container_set_border_width(GTK_CONTAINER(window) , 20);	
	//gtk_window_set_resizable(GTK_WINDOW(window) , FALSE);
	g_signal_connect(G_OBJECT(window) , "destroy", 
                         G_CALLBACK(gtk_main_quit) , NULL);
}

void call_day_select(GtkWidget *widget ,GtkWidget *data){		
	str3 = gtk_label_get_text( GTK_LABEL(label2) );	
	gtk_label_set_text(GTK_LABEL(label3) , str3);
	str2 = gtk_label_get_text( GTK_LABEL(label1) );	
	gtk_label_set_text(GTK_LABEL(label2) , str2);
	gtk_calendar_get_date(GTK_CALENDAR(widget) ,&year, &month ,&day);
	sprintf(str,"day_selected : %d年%d月%d日",year,month+1,day);
	gtk_label_set_text(GTK_LABEL(label1) ,str);		
}
void call_month_changed(GtkWidget *widget ,GtkWidget *data){	
	str3 = gtk_label_get_text( GTK_LABEL(label2) );	
	gtk_label_set_text(GTK_LABEL(label3) , str3);
	str2 = gtk_label_get_text( GTK_LABEL(label1) );	
	gtk_label_set_text(GTK_LABEL(label2) , str2);
	gtk_calendar_get_date(GTK_CALENDAR(widget) ,&year, &month ,&day);
	sprintf(str,"month_changed : %d年%d月%d日",year,month+1,day);
	gtk_label_set_text(GTK_LABEL(label1) ,str);		
}
void call_day_selected_double_click(GtkWidget *widget ,GtkWidget *data){	
	str3 = gtk_label_get_text( GTK_LABEL(label2) );	
	gtk_label_set_text(GTK_LABEL(label3) , str3);
	str2 = gtk_label_get_text( GTK_LABEL(label1) );	
	gtk_label_set_text(GTK_LABEL(label2) , str2);
	gtk_calendar_get_date(GTK_CALENDAR(widget) ,&year, &month ,&day);
	sprintf(str,"day_selected_double_click : %d年%d月%d日",year,month+1,day);
	gtk_label_set_text(GTK_LABEL(label1) ,str);		
}
void call_prev_month(GtkWidget *widget ,GtkWidget *data){	
	str3 = gtk_label_get_text( GTK_LABEL(label2) );	
	gtk_label_set_text(GTK_LABEL(label3) , str3);
	str2 = gtk_label_get_text( GTK_LABEL(label1) );	
	gtk_label_set_text(GTK_LABEL(label2) , str2);
	gtk_calendar_get_date(GTK_CALENDAR(widget) ,&year, &month ,&day);
	sprintf(str,"prev_month : %d年%d月%d日",year,month+1,day);
	gtk_label_set_text(GTK_LABEL(label1) ,str);		
}
void call_next_month(GtkWidget *widget ,GtkWidget *data){	
	str3 = gtk_label_get_text( GTK_LABEL(label2) );	
	gtk_label_set_text(GTK_LABEL(label3) , str3);
	str2 = gtk_label_get_text( GTK_LABEL(label1) );	
	gtk_label_set_text(GTK_LABEL(label2) , str2);
	gtk_calendar_get_date(GTK_CALENDAR(widget) ,&year, &month+1 ,&day);
	sprintf(str,"next_month : %d年%d月%d日",year,month,day);
	gtk_label_set_text(GTK_LABEL(label1) ,str);		
}
void call_prev_year(GtkWidget *widget ,GtkWidget *data){	
	str3 = gtk_label_get_text( GTK_LABEL(label2) );	
	gtk_label_set_text(GTK_LABEL(label3) , str3);
	str2 = gtk_label_get_text( GTK_LABEL(label1) );	
	gtk_label_set_text(GTK_LABEL(label2) , str2);
	gtk_calendar_get_date(GTK_CALENDAR(widget) ,&year, &month+1 ,&day);
	sprintf(str,"prev_year : %d年%d月%d日",year,month,day);
	gtk_label_set_text(GTK_LABEL(label1) ,str);		
}
void call_next_year(GtkWidget *widget ,GtkWidget *data){	
	str3 = gtk_label_get_text( GTK_LABEL(label2) );	
	gtk_label_set_text(GTK_LABEL(label3) , str3);
	str2 = gtk_label_get_text( GTK_LABEL(label1) );	
	gtk_label_set_text(GTK_LABEL(label2) , str2);
	gtk_calendar_get_date(GTK_CALENDAR(widget) ,&year, &month ,&day);
	sprintf(str,"next_year : %d年%d月%d日",year,month+1,day);
	gtk_label_set_text(GTK_LABEL(label1) ,str);		
}

void create_calendar(){

	frame = gtk_frame_new("Calendar") ;
	gtk_box_pack_start(GTK_BOX(hbox) , frame ,FALSE ,FALSE , 0 ); 
	gtk_widget_show(frame);
	//gtk_widget_set_default_size(frame , 200,50);
	calendar = gtk_calendar_new() ;
	gtk_calendar_display_options(GTK_CALENDAR(calendar) , 0 );
	gtk_container_add(GTK_CONTAINER(frame) , calendar);
	gtk_widget_show(calendar);
	g_signal_connect(G_OBJECT(calendar) ,"day_selected" ,G_CALLBACK(call_day_select),NULL);
	g_signal_connect(G_OBJECT(calendar) , "month_changed",G_CALLBACK(call_month_changed),NULL);
	g_signal_connect(G_OBJECT(calendar) , "day_selected_double_click",G_CALLBACK(call_day_selected_double_click),NULL);
	g_signal_connect(G_OBJECT(calendar) ,"prev_month" , G_CALLBACK(call_prev_month) , NULL);
	g_signal_connect(G_OBJECT(calendar) , "next_month" , G_CALLBACK(call_next_month) ,NULL);
	g_signal_connect(G_OBJECT(calendar) , "prev_year" , G_CALLBACK(call_prev_month),NULL);
	g_signal_connect(G_OBJECT(calendar) , "next_year" ,G_CALLBACK(call_next_year),NULL);
	separator = gtk_vseparator_new();
	gtk_box_pack_start(GTK_BOX(hbox) , separator , FALSE, FALSE , 0);
	gtk_widget_show(separator); 
}

void calendar_select_ok(GtkWidget *button,GtkWidget *data){
	GtkStyle *style;
  	PangoFontDescription *font_desc;
	gchar *font ;
	font = gtk_font_selection_dialog_get_font_name (
			GTK_FONT_SELECTION_DIALOG (data));

      	font_desc = pango_font_description_from_string (font);
      	if (font_desc) 
	{
	  	style = gtk_style_copy (gtk_widget_get_style (calendar));
	  	style->font_desc = font_desc;
	  	gtk_widget_set_style (calendar, style);
	}
}

void call_font(GtkWidget *button , GtkWidget *data){
	GtkWidget *window1 ;
	window1 = gtk_font_selection_dialog_new ("Font Selection Dialog");
	gtk_window_set_position (GTK_WINDOW (window1), GTK_WIN_POS_MOUSE);
	g_signal_connect(G_OBJECT(window1),"destroy",G_CALLBACK(gtk_widget_destroy),window1);

	g_signal_connect(G_OBJECT(GTK_FONT_SELECTION_DIALOG (window1)->ok_button),"clicked",G_CALLBACK(calendar_select_ok),window1);

	g_signal_connect_swapped(G_OBJECT(GTK_FONT_SELECTION_DIALOG(window1)->cancel_button),"clicked",G_CALLBACK(gtk_widget_destroy) ,window1);
	gtk_widget_show(window1);
}

void create_flags(){
	vbox3 = gtk_vbox_new(FALSE ,0);
	gtk_box_pack_start(GTK_BOX(hbox) , vbox3 ,FALSE, FALSE ,0);
	gtk_widget_show(vbox3);
	
	frame = gtk_frame_new("Flags") ;
	gtk_box_pack_start(GTK_BOX(vbox3) , frame, FALSE ,FALSE , 0);
	gtk_widget_show(frame);	
		
	vbox1 = gtk_vbox_new(FALSE , 0); 
	gtk_container_add(GTK_CONTAINER(frame) , vbox1); 
	gtk_widget_show(vbox1) ;
	
	check_button = gtk_check_button_new_with_label("Show Heading") ;
	gtk_box_pack_start(GTK_BOX(vbox1) , check_button ,FALSE , FALSE , 0 ) ;
	gtk_widget_show(check_button);
	g_signal_connect(G_OBJECT(check_button) , "clicked" ,
			G_CALLBACK(call_show_heading) , calendar );	
	
	check_button = gtk_check_button_new_with_label("Show Day Names") ;
	gtk_box_pack_start(GTK_BOX(vbox1) , check_button ,FALSE , FALSE , 0 ) ;
	gtk_widget_show(check_button);
	g_signal_connect(G_OBJECT(check_button) , "clicked" ,
			G_CALLBACK(call_show_day_names) , calendar );

	check_button = gtk_check_button_new_with_label("No Month Change") ;
	gtk_box_pack_start(GTK_BOX(vbox1) , check_button ,FALSE , FALSE , 0 ) ;
	gtk_widget_show(check_button);
	g_signal_connect(G_OBJECT(check_button) , "clicked" ,
			G_CALLBACK(call_no_month_change) , calendar );

	check_button = gtk_check_button_new_with_label("Show Week Numbers") ;
	gtk_box_pack_start(GTK_BOX(vbox1) , check_button ,FALSE , FALSE , 0 ) ;
	gtk_widget_show(check_button);
	g_signal_connect(G_OBJECT(check_button) , "clicked" ,
			G_CALLBACK(call_show_week_numbers) , calendar );

	check_button = gtk_check_button_new_with_label("Week Start Monday") ;
	gtk_box_pack_start(GTK_BOX(vbox1) , check_button ,FALSE , FALSE , 0 ) ;
	gtk_widget_show(check_button);	
	g_signal_connect(G_OBJECT(check_button) , "clicked" ,
			G_CALLBACK(call_week_start_monday) , calendar );
	
	button = gtk_button_new_with_label("Font...");
	gtk_box_pack_start(GTK_BOX(vbox3) , button ,FALSE,FALSE ,0);
	gtk_widget_show(button);
	g_signal_connect(G_OBJECT(button) ,"clicked" ,G_CALLBACK(call_font) ,NULL);
}
void create_signal(){
	frame = gtk_frame_new("Signal events") ;
	gtk_box_pack_start(GTK_BOX(vbox) , frame ,FALSE ,FALSE, 0);
	gtk_widget_show(frame);
	
	vbox2 = gtk_vbox_new(FALSE , 0);
	gtk_container_add(GTK_CONTAINER(frame) , vbox2);
	gtk_widget_show(vbox2);

	hbox1 = gtk_hbox_new(FALSE ,0);
	gtk_box_pack_start(GTK_BOX(vbox2) , hbox1 ,FALSE ,FALSE , 0);
	gtk_widget_show(hbox1);
	label = gtk_label_new("Signal:");
	gtk_box_pack_start(GTK_BOX(hbox1) ,label , FALSE ,FALSE , 0);
	gtk_widget_show(label);
	label1 = gtk_label_new("") ;
	gtk_box_pack_start(GTK_BOX(hbox1) , label1 , FALSE ,FALSE , 0) ;
	gtk_widget_show(label1);
	
	hbox1 = gtk_hbox_new(FALSE ,0);
	gtk_box_pack_start(GTK_BOX(vbox2) , hbox1 ,FALSE ,FALSE , 0);
	gtk_widget_show(hbox1);
	label = gtk_label_new("Previous signal:");
	gtk_box_pack_start(GTK_BOX(hbox1) ,label , FALSE ,FALSE , 0);
	gtk_widget_show(label);
	label2 = gtk_label_new("") ;
	gtk_box_pack_start(GTK_BOX(hbox1) , label2 , FALSE ,FALSE , 0) ;
	gtk_widget_show(label2);

	hbox1 = gtk_hbox_new(FALSE ,0);
	gtk_box_pack_start(GTK_BOX(vbox2) , hbox1 ,FALSE ,FALSE , 0);
	gtk_widget_show(hbox1);
	label = gtk_label_new("Second previous signal:");
	gtk_box_pack_start(GTK_BOX(hbox1) ,label , FALSE ,FALSE , 0);
	gtk_widget_show(label);
	label3 = gtk_label_new("") ;
	gtk_box_pack_start(GTK_BOX(hbox1) , label3 , FALSE ,FALSE , 0) ;
	gtk_widget_show(label3);


}

void create_close(){
	hbox1 = gtk_hbox_new(FALSE ,0) ;
	gtk_box_pack_start(GTK_BOX(vbox),hbox1 ,FALSE,FALSE ,0) ;
	gtk_widget_show(hbox1);
	button = gtk_button_new_with_label("Close");
	gtk_box_pack_end(GTK_BOX(hbox1) ,button ,FALSE , FALSE , 0);
	gtk_widget_show(button);
	g_signal_connect(G_OBJECT(button),"clicked" ,G_CALLBACK(gtk_main_quit),NULL);
}

int main(int argc, char *argv[])
{	 
	status = 0 ;
	gtk_init(&argc,&argv);
	create_window() ;
	vbox = gtk_vbox_new(FALSE , 0 );
	gtk_container_add(GTK_CONTAINER(window) , vbox);
	gtk_widget_show(vbox);
	
	hbox = gtk_hbox_new(FALSE , 20 );
	gtk_container_add(GTK_CONTAINER(vbox) , hbox);
	gtk_widget_show(hbox) ;
	
	create_calendar() ;
	create_flags();	
	create_signal() ;
	create_close() ;
	gtk_widget_show(window);
	gtk_main() ;	
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值