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

📄 messagebox.c

📁 多媒体电话记录程序
💻 C
字号:
/////////////////////////////////////////////////////////////////////////////
//  Name: messagebox.c
//  Copyright: wellgain
//  Author: bet
//  Date: 2003-10-21
//  Description:  implementation for the MessageBox function.
/////////////////////////////////////////////////////////////////////////////
#include "messagebox.h"
#include <locale.h>
#include <libintl.h>
#include <gtk/gtk.h>

#ifndef _
	#define _(String)		gettext(String)
#endif


typedef struct
{
  GtkWidget *dialog;
  gint response_id;
  GMainLoop *loop;  
} RunInfo;

typedef struct
{
	RunInfo* ri;
	GtkWidget* dialog;
	int response;
} ResponseData;


static gchar* stock_icons[] = { 
	MSGBOX_XPMFILEPATH "stock-error.xpm",
	MSGBOX_XPMFILEPATH "stock-info.xpm",
	MSGBOX_XPMFILEPATH "stock-question.xpm",
	MSGBOX_XPMFILEPATH "stock-warning.xpm",
};
 
static GtkWidget*
create_dialog (const char* szText, const char* szCaption, 
			   int icon, UINT uType, RunInfo* ri);
gboolean
on_dialog_delete_event                 (GtkWidget       *widget,
                                        GdkEvent        *event,
                                        gpointer         user_data);

void
on_dialog_destroy                      (GtkObject       *object,
                                        gpointer         user_data);

void
on_dialog_button_click                     (GtkButton       *button,
                                        gpointer         user_data);

static void 
Shutdown_roop(RunInfo* ri);


static GdkPixmap* messagebox_close_pixmap;
static GdkPixmap* messagebox_close_down_pixmap;

int MessageBox(const char* szText, const char* szCaption, 
			   int icon, UINT uType)
{
	int response;
	RunInfo ri = { (GtkWidget*)NULL, ID_None, (GMainLoop*)NULL };

	GtkWidget* dialog = create_dialog(szText, szCaption, icon, uType, &ri);
	gtk_signal_connect (GTK_OBJECT(dialog),
                      "delete_event",
                      GTK_SIGNAL_FUNC(on_dialog_delete_event),
                      &ri);
	gtk_signal_connect (GTK_OBJECT(dialog),
                      "destroy",
                      GTK_SIGNAL_FUNC(on_dialog_destroy),
                      &ri);

	gtk_widget_show(dialog);
	// main loop	
	ri.loop = g_main_new (FALSE);

  GDK_THREADS_LEAVE ();  
  g_main_run (ri.loop);
  GDK_THREADS_ENTER ();  

  response =  ri.response_id;
  g_main_destroy(ri.loop);
  ri.loop = (GMainLoop*)NULL;

  return response;
}


static void 
Shutdown_roop(RunInfo* ri)
{
	if (g_main_is_running (ri->loop))
		g_main_quit (ri->loop);
}

gboolean
on_dialog_delete_event                 (GtkWidget       *widget,
                                        GdkEvent        *event,
                                        gpointer         user_data)
{
	RunInfo* ri = (RunInfo*)user_data;
	ri->response_id = stock_none;
	return FALSE;
}

void
on_dialog_destroy                      (GtkObject       *object,
                                        gpointer         user_data)
{
	Shutdown_roop((RunInfo*)user_data);
}

void
on_dialog_button_click                     (GtkButton       *button,
											gpointer         user_data)
{
	ResponseData *rd = (ResponseData*)gtk_object_get_data (GTK_OBJECT (button),
                                        "dialog-response-data");      
    if (rd){
		rd->ri->response_id = rd->response;	
		gtk_widget_destroy (rd->dialog);
	}
}


void
on_close_button_pressed                     (GtkButton       *button,
											gpointer         user_data)
{
	GtkWidget* pixwid;
	if(messagebox_close_down_pixmap){
		pixwid = GTK_BIN(button)->child;
		if(pixwid)
			gtk_pixmap_set(GTK_PIXMAP(pixwid), messagebox_close_down_pixmap, NULL);
  }
}

void
on_close_button_released                     (GtkButton       *button,
											gpointer         user_data)
{
	GtkWidget* pixwid;
	if(messagebox_close_pixmap){
		pixwid = GTK_BIN(button)->child;
		if(pixwid)
			gtk_pixmap_set(GTK_PIXMAP(pixwid), messagebox_close_pixmap, NULL);
  }
}

static GtkWidget*
create_dialog (const char* szText, const char* szCaption, 
			   int icon, UINT uType, RunInfo* ri)
{
  GtkWidget *dialog;
  GtkWidget *caption;
  GtkWidget *vbox1;
  GtkWidget *vbox2;
  GtkWidget *hbox;
  GtkWidget *label;
  GtkWidget *hbuttonbox;
  GtkWidget *button;
  GtkWidget *pixwid;
  GdkPixmap *pixmap;
  GdkBitmap *mask;
  GtkWidget *frame1;
  GtkWidget *frame2;
  GtkWidget *fixed1;
  GtkWidget *Close_button;
  GtkStyle* style;
  int labellen = 210;
  static GdkColor white = {0, 0xFFFF, 0xFFFF, 0xFFFF };
  static GdkColor blue  = {0, 0x0000, 0x5050, 0xE0E0 };
  static GdkColor cyan  = {0, 0xC6C6, 0xDEDE, 0xF7F7 };

  int i, nBut, response;  
  gchar* szLabel;
  ResponseData* rd;  

  dialog = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_set_usize (dialog, 230, 130);
  //gtk_window_set_title (GTK_WINDOW (dialog), _(szCaption));
  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
  gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
  gtk_window_set_policy (GTK_WINDOW (dialog), FALSE, FALSE, FALSE);
  gtk_widget_realize(dialog);

  frame1 = gtk_frame_new(NULL);
  gtk_widget_show (frame1);  
  gtk_widget_set_usize(frame1, 230, 130);
  gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_OUT);
  gtk_container_add (GTK_CONTAINER (dialog), frame1);

  vbox1 = gtk_vbox_new (FALSE, 0);  
  gtk_container_add (GTK_CONTAINER (frame1), vbox1);
 // gtk_widget_set_usize(vbox2, 220, 105);
  gtk_widget_show (vbox1);

  fixed1 = gtk_fixed_new ();
  gtk_widget_show (fixed1);  
  //gtk_widget_set_usize(fixed1, 230, 130);
  gtk_box_pack_start (GTK_BOX (vbox1), fixed1, FALSE, FALSE, 0);

  frame2 = gtk_frame_new(NULL);
  gtk_widget_show (frame2);  
  //gtk_widget_set_usize(frame2, 228, 108);
  gtk_frame_set_shadow_type(GTK_FRAME(frame2), GTK_SHADOW_IN);
  gtk_box_pack_start (GTK_BOX (vbox1), frame2, TRUE, TRUE, 0);
  
   style = gtk_style_copy(gtk_widget_get_style(dialog));
  style->bg[GTK_STATE_NORMAL] = white;
  gtk_widget_set_style(dialog, style);
  gtk_style_unref(style);

  style = gtk_style_copy(gtk_widget_get_style(fixed1));
  style->bg[GTK_STATE_NORMAL] = blue;
  gtk_widget_set_style(fixed1, style);
  gtk_style_unref(style);

   style = gtk_style_copy(gtk_widget_get_style(frame1));
  style->bg[GTK_STATE_NORMAL] = blue;
  gtk_widget_set_style(frame1, style);
  gtk_style_unref(style);

  style = gtk_style_copy(gtk_widget_get_style(frame2));
  style->bg[GTK_STATE_NORMAL] = blue;
  gtk_widget_set_style(frame2, style);
  gtk_style_unref(style);

  pixmap = gdk_pixmap_create_from_xpm(dialog->window, &mask, 
					&(gtk_widget_get_style(fixed1)->bg[GTK_STATE_NORMAL]), 
					MSGBOX_XPMFILEPATH "toolbar.xpm");
  if(pixmap){
  	  pixwid = gtk_pixmap_new(pixmap, mask);
	  gtk_widget_show (pixwid);
	  gtk_fixed_put (GTK_FIXED (fixed1), pixwid, 228-47, 0);
  }

  Close_button = gtk_button_new ();
  gtk_widget_show (Close_button);
  gtk_fixed_put (GTK_FIXED (fixed1), Close_button, 228-25, 0);
  gtk_widget_set_usize (Close_button, 19, 19);
    
  messagebox_close_down_pixmap = gdk_pixmap_colormap_create_from_xpm((GdkWindow*)NULL, 
						gdk_colormap_get_system (), &mask, (GdkColor*)NULL, 
						MSGBOX_XPMFILEPATH "close-down.xpm");
  messagebox_close_pixmap = gdk_pixmap_colormap_create_from_xpm((GdkWindow*)NULL, 
						gdk_colormap_get_system (), &mask, (GdkColor*)NULL, 
						MSGBOX_XPMFILEPATH "close.xpm");

  if(messagebox_close_pixmap){
		pixwid = gtk_pixmap_new(messagebox_close_pixmap, mask);
	  gtk_widget_show (pixwid);
	  gtk_container_add (GTK_CONTAINER (Close_button), pixwid);	  
  }

  // caption
  if(szCaption && szCaption[0]){
	  caption = gtk_label_new (_(szCaption));
	  gtk_widget_show (caption);
	  gtk_fixed_put (GTK_FIXED (fixed1), caption, 5, 0);
	  gtk_widget_set_usize (caption, 170, 20);
	  gtk_misc_set_alignment(GTK_MISC(caption), 0.0, 0.5); 

	  style = gtk_style_copy(gtk_widget_get_style(caption));
	  style->fg[GTK_STATE_NORMAL] = white;	  
	  gtk_widget_set_style(caption, style);
	  gtk_style_unref(style);
  }	  
 
    vbox2 = gtk_vbox_new (FALSE, 0);  
  gtk_container_add (GTK_CONTAINER (frame2), vbox2);
 // gtk_widget_set_usize(vbox2, 220, 105);
  gtk_widget_show (vbox2);

  hbox = gtk_hbox_new (FALSE, 0);  
  gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0);
  gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
  gtk_widget_show (hbox);

  // icon
  if(icon>0 && icon<5){	  
	pixmap = gdk_pixmap_create_from_xpm(dialog->window, &mask, 
					&(gtk_widget_get_style(hbox)->bg[GTK_STATE_NORMAL]), 
					stock_icons[icon-1]);
	if(pixmap){
		pixwid = gtk_pixmap_new(pixmap, mask);
		gtk_widget_show (pixwid);
		gtk_box_pack_start (GTK_BOX (hbox), pixwid, FALSE, FALSE, 1);	
		labellen = 145;
	}
  }

  // lable 
  label = gtk_label_new (_(szText));
  gtk_widget_show (label);
  gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
  gtk_widget_set_usize (label, labellen, 70);
  gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
  gtk_misc_set_padding (GTK_MISC (label), 2, 2);

  hbuttonbox = gtk_hbutton_box_new ();
  gtk_widget_show (hbuttonbox);
  gtk_box_pack_start (GTK_BOX (vbox2), hbuttonbox, FALSE, FALSE, 5);
  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_SPREAD);
  gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbuttonbox), 5);
  gtk_button_box_set_child_size (GTK_BUTTON_BOX (hbuttonbox), 5, 5);
  gtk_button_box_set_child_ipadding (GTK_BUTTON_BOX (hbuttonbox), 10, -1);

  // buttons
  i = 0;
  while(i<(int)sizeof(uType)*8){
	  nBut = (uType & (1<<i));
	  i++;
	  if(!nBut)
		  continue;	  
	  switch(nBut){
	  case MB_OK:
		  szLabel = _("确定");
		  response = ID_OK;
		  break;
	  case MB_Cancel:
		  szLabel = _("取消");
		  response = ID_Cancel;
		  break;
	  case MB_Yes:
		  szLabel = _("是");
		  response = ID_Yes;
		  break;
	  case MB_YesAll:
		  szLabel = _("全部");
		  response = ID_YesAll;
		  break;
	  case MB_No:
		  szLabel = _("否");
		  response = ID_No;
		  break;
	  default:
		  szLabel = "";
		  response = ID_None;
	  }

	  if(response != ID_None){
		rd = (ResponseData*)g_new(ResponseData, 1);
		rd->ri = ri;
		rd->dialog = dialog;
		rd->response = response;

		button = gtk_button_new();
		gtk_widget_set_usize(button, -2, 20);
		style = gtk_style_copy(gtk_widget_get_style(button));
  	    style->bg[GTK_STATE_NORMAL] = blue;
		style->bg[GTK_STATE_ACTIVE] = cyan;
		style->bg[GTK_STATE_PRELIGHT] = cyan;
		gtk_widget_set_style(button, style);
		gtk_style_unref(style);

		label = gtk_label_new(szLabel);
		gtk_widget_show(label);
		  style = gtk_style_copy(gtk_widget_get_style(label));
		  style->fg[GTK_STATE_NORMAL] = white;		  
		  gtk_widget_set_style(label, style);
		  gtk_style_unref(style);
		  gtk_container_add(GTK_CONTAINER(button), label);

		gtk_object_set_data_full (GTK_OBJECT (button),
                              "dialog-response-data",
                              rd,
                              g_free);		
		gtk_container_add (GTK_CONTAINER (hbuttonbox), button);
		//GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
		gtk_signal_connect(GTK_OBJECT(button), "clicked", 
							GTK_SIGNAL_FUNC(on_dialog_button_click), NULL);
		gtk_widget_show (button);
	  }	 	  

	  // define title close button
	response = ID_None;
	rd = (ResponseData*)g_new(ResponseData, 1);
	rd->ri = ri;
	rd->dialog = dialog;
	rd->response = response;
	gtk_object_set_data_full (GTK_OBJECT (Close_button),
                            "dialog-response-data",
                              rd,
                              g_free);		
	gtk_signal_connect(GTK_OBJECT(Close_button), 
						  "clicked", 
						  GTK_SIGNAL_FUNC(on_dialog_button_click), 
						  NULL);
	gtk_signal_connect(GTK_OBJECT(Close_button), 
						  "pressed", 
						  GTK_SIGNAL_FUNC(on_close_button_pressed), 
						  NULL);
	gtk_signal_connect(GTK_OBJECT(Close_button), 
						  "released", 
						  GTK_SIGNAL_FUNC(on_close_button_released),
						  NULL);
  }

  return dialog;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -