#include "map.h"
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) //屏蔽cmd窗口
vector<string> Ivec;
GtkWidget *gpWinMain=NULL;
int main( int argc,char *argv[] ){
InitializeGTK(argc,argv);
return 0;
}
//////////////////////////////////////////////////////////////////////////初始化GTK//////////////////////////////////////////////////////////////////////////
int InitializeGTK(int argc,char *argv[] )
{
gtk_init (&argc, &argv);//初始化
GtkBuilder *builder;
GtkWidget *window; //定义一下widget
GError *err=NULL;
builder = gtk_builder_new (); //new widget
if (gtk_builder_add_from_file (builder,".\\glade\\winCalculator.glade", &err) == 0) //从文件加载glade
{
g_error_free (err);
return false;
}
window = GTK_WIDGET(gtk_builder_get_object(builder, "winCalculator")); //获取窗体
g_object_set_data(G_OBJECT(window),"winCalculator",window);
g_signal_connect(G_OBJECT(window),"destroy",
G_CALLBACK(destroy),NULL);
g_signal_connect(G_OBJECT(window),"delete_event",
G_CALLBACK(delete_event),NULL);
GtkWidget *pwidget;
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"txtInput"));//获取控件
g_object_set_data(G_OBJECT(window),"txtInput",pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btn0"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btn1"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btn2"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btn3"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btn4"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btn5"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btn6"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btn7"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btn8"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btn9"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btnPoint"));//获取控件
ConnectButtonNumWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btnResult"));//获取控件
g_signal_connect ((gpointer) pwidget, "clicked",G_CALLBACK (on_btnResult_clicked),NULL);//定义事件
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btnAdd"));//获取控件
ConnectActionWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btnSub"));//获取控件
ConnectActionWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btnMul"));//获取控件
ConnectActionWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btnDiv"));//获取控件
ConnectActionWidget(NULL,pwidget);
pwidget=GTK_WIDGET(gtk_builder_get_object(builder,"btnClear"));//获取控件
g_signal_connect ((gpointer) pwidget, "clicked",G_CALLBACK (on_btnClear_Clicked),NULL);//定义事件
gpWinMain=window;
InitializeApplication();
gtk_window_set_title(GTK_WINDOW(window),"计算器");
gtk_window_set_icon(GTK_WINDOW(window),create_pixbuf(".\\Pic\\psu.jpg"));
gtk_widget_show (window); //show窗体
gtk_main (); //执行gtk main函数
return 0;
}
void ConnectButtonNumWidget(GtkBuilder *builder, GtkWidget *pwidget)
{
g_signal_connect ((gpointer) pwidget, "clicked",G_CALLBACK (on_btn_clicked),NULL);//定义事件
}
void ConnectActionWidget(GtkBuilder *builder, GtkWidget *pwidget)
{
g_signal_connect ((gpointer) pwidget, "clicked",G_CALLBACK (on_btnAction_Clicked),NULL);//定义事件
}
void destroy(GtkWidget *window,gpointer data)
{
gtk_main_quit();//程序退出
}
gboolean delete_event(GtkWidget *window,GdkEvent *event,gpointer data)
{
return false;
}
void on_btn_clicked(GtkButton *button,gpointer data)
{
ShowInputNum(button,data);
}
void ShowInputNum(GtkButton *button,gpointer data)
{
const gchar *BtnText=gtk_button_get_label(button);
GtkWidget *control;
control=(GtkWidget*)g_object_get_data(G_OBJECT(gpWinMain),"txtInput");
const gchar *TxtText=gtk_entry_get_text(GTK_ENTRY(control));
string strBtnText(BtnText);
string strTxt(TxtText);
bool isHavePoint=false;//记录是否为Point
size_t loc=strTxt.find(".",0);
if( loc != string::npos )
{
if (strBtnText==".")
return;
}
if (Ivec.size()==1)
{
if (strTxt!="0"||strBtnText==".")
{
string temp=strTxt+strBtnText;//串连输入
Ivec[0]=temp;
gtk_entry_set_text(GTK_ENTRY(control),temp.c_str());
}
else if (strBtnText!=".")
{
Ivec[0]=strBtnText;
gtk_entry_set_text(GTK_ENTRY(control),BtnText);
}
}
else if (Ivec.size()>1)
{
if (Ivec.size()==2)
{
if (strBtnText!=".")
{
Ivec.push_back(BtnText);
gtk_entry_set_text(GTK_ENTRY(control),BtnText);
}
else
{
string temp="0"+strBtnText;//串连输入
Ivec.push_back(temp);
gtk_entry_set_text(GTK_ENTRY(control),temp.c_str());
}
}
else
{
string temp=strTxt+strBtnText;//串连输入
Ivec[2]=temp;
gtk_entry_set_text(GTK_ENTRY(control),temp.c_str());
}
}
}
void on_btnClear_Clicked(GtkButton *button,gpointer data)
{
InitializeApplication();
}
void InitializeApplication()
{
Ivec.clear();
const gchar *temp="0";//还原
GtkWidget *control;
control=(GtkWidget*)g_object_get_data(G_OBJECT(gpWinMain),"txtInput");
gtk_entry_set_text(GTK_ENTRY(control),temp);
Ivec.push_back("0");
}
void on_btnAction_Clicked(GtkButton *button,gpointer data)
{
ActionProcess(button,data);
}
void ActionProcess(GtkButton *button,gpointer data)
{
const gchar *BtnText=gtk_button_get_label(button);
string strBtnText(BtnText);
if (Ivec.size()==0)
return;
else if (Ivec.size()==1)
Ivec.push_back(strBtnText);
else if (Ivec.size()==2)
Ivec[1]=strBtnText;
else
{
ShowResult();
Ivec.push_back(strBtnText);
}
}
void on_btnResult_clicked(GtkButton *button,gpointer data)
{
if (Ivec.size()!=3)
return;
ShowResult();
}
void ShowResult()
{
GtkWidget *control;
control=(GtkWidget*)g_object_get_data(G_OBJECT(gpWinMain),"txtInput");
double calResult=Calculate();
char str[50];
//%g
//%e
sprintf(str,"%g",calResult);
Ivec.push_back(str);
gtk_entry_set_text(GTK_ENTRY(control),str);
}
double Calculate()
{
double i=atof(Ivec[0].c_str());
string action=Ivec[1];
double j=atof(Ivec[2].c_str());
double calResult=0;
if (action=="+")
calResult =i+j;
else if (action=="-")
calResult= i-j;
else if (action=="*")
calResult= i*j;
else if (action=="/")
calResult= i/j;
Ivec.clear();
return calResult;
}
GdkPixbuf *create_pixbuf(const gchar * filename){
GdkPixbuf *pixbuf;
GError *error = NULL;
pixbuf = gdk_pixbuf_new_from_file(filename, &error);
if(!pixbuf) {
fprintf(stderr, "%s\n", error->message);
g_error_free(error);
}
return pixbuf;
}