📄 messagebox.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 + -