正文

计算器2005-10-07 19:38:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/guowei/5808.html

分享到:

#include <sgwindow.h>   /*SGWINDOW 程序必须的头文件*/
#include <math.h>

#define ID_ABOUT 10231
#define ID_ZERO  10000
#define ID_ONE   10001
#define ID_TWO   10002
#define ID_THREE 10003
#define ID_FOUR  10004
#define ID_FIVE  10005
#define ID_SIX   10006
#define ID_SEVEN 10007
#define ID_EIGHT 10008
#define ID_NINE  10009

#define ID_DOT   10010
#define ID_SIGN  10011

#define ID_ADD   20001
#define ID_MINUS 20002
#define ID_MUTIPLE 20003
#define ID_DIVIDE  20004
#define ID_EQUAL   20006

#define ID_SIN     20010
#define ID_COS     20011
#define ID_TAN     20012
#define ID_LOG     20013
#define ID_LN      20014
#define ID_EXP     20015
#define ID_POWER   20016
#define ID_SQRT    20017
#define ID_REV      20018
#define ID_PERCENT  20019


#define ID_ONOFF   30001
#define ID_CLEAR   30002

#define ID_RESULT  32000
#define ID_STATU   31000
#define ID_FRAME   31110

#define VERSIONSTRING   "Calculate 1.0 For SGWINDOW 2.0 \n Copyright (C) 2005-8 SGPRO\n\n江西师范大学计算机02软件 殷圣鸽"
#define XINTERVAL       40
#define YINTERVAL       30

void Dispatch_Message(WinMessage WinMsg); /*消息处理函数定义*/
gennum(wndhnd);
char *trim(char*);
wndhnd  window;     /*主窗体句柄*/
wndhnd  about;    /* '关于' 按扭句柄*/
wndhnd  digit[10],dot,sign;
wndhnd  normaloperate[4];
wndhnd  onoff,clear,equal;
wndhnd  result;
wndhnd  extraoperate[15];
wndhnd  statu;
wndhnd  fra;
wndhnd  tip;

double  operand1 = 0,operand2 = 0,res = 0;
bool    opdready = false, opdready2 = false,resready =false;
bool    enable = true;
int     operate =0;

char  *captions[] =
{
 " 0 "," 1 "," 2 "," 3 "," 4 "," 5 "," 6 "," 7 "," 8 "," 9 ",
 " . ","-/+",
 " + "," - "," * "," / "," =  ",
 " ON "," CE ",
 "sin","cos","tan","log"," ln ","exp","pow","sqr","1/x"," %  "
};


void main()
{
 WinMessage msg;   /*主消息*/
 winfont    wft;   /*字体*/
 int    dcnt = 0;

 SGWINDOWinit();   /*加载SGWINDOW*/
 changewincircletime(0);
 setfont(&wft,1,4,WIN12,0); /*设置字体*/
 window = new_form(100,100,300,290,1,wft,6,"计算器 1.0 For SGWINDOW 2.0","exe.bmp",true,true,true,40); /*设置窗体属性*/

 result = new_Textbox(Get_FormUserarealeft(FORM(window))+6,
     Get_FormUserareatop(FORM(window))+10,
    280,18,15,wft,"0",50,false,true,true,true);

 fra = new_frame(Get_FormUserarealeft(FORM(window))+6,
     Get_FormUserareatop(FORM(window))+40,
     220,190,wft,"",true);

 for ( dcnt = 0; dcnt < 12; dcnt++)
 {
  if ( dcnt < 10 )
  {
   digit[dcnt] = new_Defaultbutton(Get_FormUserarealeft(FORM(window))+20+(dcnt%3)*XINTERVAL,
   Get_FormUserareatop(FORM(window))+50+(dcnt/3)*YINTERVAL, captions[dcnt]);
  }
  else if (dcnt == 10 )
  {
   dot = new_Defaultbutton(Get_FormUserarealeft(FORM(window))+20+(dcnt%3)*XINTERVAL,
   Get_FormUserareatop(FORM(window))+50+(dcnt/3)*YINTERVAL, captions[dcnt]);
  }
  else if (dcnt == 11 )
  {
   sign = new_Defaultbutton(Get_FormUserarealeft(FORM(window)) +
   20+(dcnt%3)*XINTERVAL,
   Get_FormUserareatop(FORM(window))+50+(dcnt/3)*YINTERVAL,
   captions[dcnt]);
  }

 }

 for ( dcnt = 0; dcnt < 4; dcnt++ )
 {
  normaloperate[dcnt] = new_Defaultbutton(Get_FormUserarealeft(FORM(window))+20+3*XINTERVAL,
   Get_FormUserareatop(FORM(window))+50+dcnt*YINTERVAL, captions[dcnt+12]);
 }

 for (dcnt = 0; dcnt < 10; dcnt++)
 {
  extraoperate[dcnt] =
  new_Defaultbutton(Get_FormUserarealeft(FORM(window))+
  20+(dcnt%5)*XINTERVAL,
  Get_FormUserareatop(FORM(window))+50+(4+dcnt/5)*YINTERVAL,
  captions[dcnt+19]);
 }


 statu = new_Defaultstatubar(Get_FormUserarealeft(FORM(window))+2,
   Get_FormUserareatop(FORM(window))+50+6*YINTERVAL+10,290,"就绪");

 onoff = new_Defaultbutton(Get_FormUserarealeft(FORM(window))+20+4*XINTERVAL,
   Get_FormUserareatop(FORM(window))+50, captions[17]);
 clear = new_Defaultbutton(Get_FormUserarealeft(FORM(window))+20+4*XINTERVAL,
   Get_FormUserareatop(FORM(window))+50+YINTERVAL, captions[18]);
 equal = new_Defaultbutton(Get_FormUserarealeft(FORM(window))+20+4*XINTERVAL,
   Get_FormUserareatop(FORM(window))+50+2*YINTERVAL, captions[16]);

 about = new_Defaultbutton(340,325," 关于 ");
 Register_Windowhandletoform(window,about,SGWNDBUTTON,ID_ABOUT);/*在主窗体中 注册 '关于' 按扭句柄 */
 Register_Windowhandletoform(window,result,SGWNDTEXTBOX,ID_RESULT);
 Register_Windowhandletoform(window,fra,SGWNDFRAME,ID_FRAME);

 for ( dcnt = 0; dcnt < 10; dcnt++)
 {
  Register_Windowhandletoform(window,digit[dcnt],SGWNDBUTTON,ID_ZERO+dcnt);
 }

 for ( dcnt = 0; dcnt < 4; dcnt++)
 {
  Register_Windowhandletoform(window,normaloperate[dcnt],SGWNDBUTTON,ID_ADD+dcnt);
 }

 for (dcnt = 0; dcnt < 10; dcnt++)
 {
  Register_Windowhandletoform(window,extraoperate[dcnt],
  SGWNDBUTTON,ID_SIN+dcnt);
 }


 Register_Windowhandletoform(window,dot,SGWNDBUTTON,ID_DOT);
 Register_Windowhandletoform(window,sign,SGWNDBUTTON,ID_SIGN);
 Register_Windowhandletoform(window,onoff,SGWNDBUTTON,ID_ONOFF);
 Register_Windowhandletoform(window,clear,SGWNDBUTTON,ID_CLEAR);
 Register_Windowhandletoform(window,equal,SGWNDBUTTON,ID_EQUAL);
 Register_Windowhandletoform(window,statu,SGWNDSTATUBAR,ID_STATU);
 Change_ButtonSize(equal,Get_ButtonSizewidth(BUTTON(equal)),
 Get_ButtonSizeheight(BUTTON(equal)) +YINTERVAL);
 while (TestMessageSource(window))/*当消息源存在时,进入消息循环*/
 {
  msg = WindowSend_Message(GetMessageSource(window));/*提取并发送消息*/
  Dispatch_Message(msg);  /*处理消息*/
 }
}

void Dispatch_Message(WinMessage msg) /*消息处理函数*/
{
 int ObjectID = Get_MessagescrID(msg);      /*获取发送消息的对象的ID号*/
 int MessageType = Get_MessagescrType(msg); /*获取该消息的类型*/

 switch (ObjectID)
 {
  case ID_FORMCLOSE:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"关闭程序 ALT+F4");
  }
  break;
  case ID_MAINFORM:/*主窗体对象*/
  if (MessageType == WE_EXIT)/*主窗体发送退出消息*/
  {
   delete_form(&FORMPTR(window));/* 销毁主窗体*/
  }
  else if (MessageType == WE_FORMLOAD)/*主窗体发送加载消息*/
  {
   Show_Form(window);/*显示主窗体*/
  }
  else if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"就绪");
  }

  break;
  case ID_STATU:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"计算器状态与帮助信息");
  }
  break;
  case ID_FRAME:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"就绪");
  }
  break;
  case ID_RESULT:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"结果显示屏, 数字超长时将分页显示");
  }
  break;
  case ID_ABOUT:/* '关于'按扭对象*/
  if (MessageType == WE_CLICK) /*关于按扭发送鼠标单击消息*/
  {
   Messagebox("Calculate For SGWINDOW",VERSIONSTRING,
   SGMSGBOX_OKONLY,SGMSGBOXICON_information);/*缺省形式的消息框,显示当前SGWINDOW的版本字符串*/
  }
  else if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"关于本软件...");
  }
  break;
  case ID_ZERO:
  case ID_ONE:
  case ID_TWO:
  case ID_THREE:
  case ID_FOUR:
  case ID_FIVE:
  case ID_SIX:
  case ID_SEVEN:
  case ID_EIGHT:
  case ID_NINE:
  case ID_DOT:
  case ID_SIGN:

  if (MessageType==WE_CLICK && enable)
  {
   if ((opdready == true &&  opdready2 == false) ||
   resready == true)
   {
    if (ObjectID!=ID_SIGN)
    Change_TextboxText(result,"");
   }
   gennum(Get_WindowItemhandle(*GetMessageSource(window),ObjectID));
  }
  break;
  case ID_ADD:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"加法运算");
   goto NC;
  }
  case ID_MINUS:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"减法运算");
   goto NC;
  }
  case ID_MUTIPLE:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"乘法运算");
   goto NC;
  }
  case ID_DIVIDE:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"除法运算");
   goto NC;
  }
  NC:if (MessageType == WE_CLICK && enable)
  {
   if ( opdready && opdready2)
   {
    calculate();
   }
   if (resready)
   {
    operand1 = res;
    res = 0;
    resready = false;
   }
   operate = ObjectID -20000;
   opdready = true;
  }
  break;
  case ID_SIN:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"计算弧度正弦");
   goto EC;
  }
  case ID_COS:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"计算弧度余弦");
   goto EC;
  }
  case ID_TAN:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"计算弧度正切");
   goto EC;
  }
  case ID_LOG:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"计算10为底的对数");
   goto EC;
  }
  case ID_LN:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"计算e为底的对数");
   goto EC;
  }
  case ID_POWER:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"求平方");
   goto EC;
  }
  case ID_SQRT:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"求开方");
   goto EC;
  }
  case ID_REV:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"求倒数");
   goto EC;
  }
  case ID_EXP:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"求e的幂");
   goto EC;
  }
  case ID_PERCENT:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"求百分点");
   goto EC;
  }

  EC:if (MessageType== WE_CLICK &&enable)
  {
   singlecal(ObjectID);
  }
  break;
  case ID_EQUAL:
  if (MessageType == WE_CLICK &&enable)
  {
   calculate();
  }
  break;
  case ID_CLEAR:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"清除显示屏");
  }

  if (MessageType == WE_CLICK && enable)
  {
   operand1 = 0;
   res = 0;
   operand2 = 0;
   Change_TextboxText(result,"0");
   opdready = false;
  }
  break;
  case ID_ONOFF:
  if (MessageType==WE_MOUSEMOVE)
  {
   Set_StatubarText(statu,"计算器开关");
  }

  if (MessageType == WE_CLICK)
  {
   enable = !enable;
   enable? Change_TextboxText(result,"0"):
   Change_TextboxText(result,"");
   operand1 = operand2 = res = 0;
   opdready = false;
  }

 }
}

calculate()
{
 char temp[128];
 if (resready)
 {
  return;
 }
 if (!opdready || !opdready2)
 {
  return;
 }

 switch ( operate)
 {
  case 1:
  res = operand1+operand2;
  break;
  case 2:
  res = operand1-operand2;
  break;
  case 3:
  res = operand1*operand2;
  break;
  case 4:
  if (operand2!=0)
  res= operand1/operand2;
  else
  {
   Set_StatubarText(statu,"除法错误:除数为0");

   Messagebox("计算器","除法错误:除数为0",SGMSGBOX_OKONLY,SGMSGBOXICON_critical);
  }
  break;
 }

  sprintf(temp,"%lf",res);
  Change_TextboxText(result,temp);
  opdready = false;
  opdready2 = false;
  resready = true;
  operand2 = 0;
  operate = 0;
}


gennum(wndhnd handle)
{
 char numstring[64]="";
 double temp;

 if (handle != sign)
 {
  if (resready == true)
  {
   resready = false;
  }
  if ( !strcmp(Get_TextboxText(TEXTBOX(result)),"0"))
  {
   if (handle == digit[0])
   return;
   else
   {
    if (handle!=dot) Change_TextboxText(result,"");
   }
  }
  strcpy(numstring,Get_ButtonCaption(BUTTON(handle)));
  strcpy(numstring, trimstring(numstring));

  Appendtext_Textbox(result,numstring);
  sscanf(Get_TextboxText(TEXTBOX(result)),"%lf",opdready? &operand2:&operand1);
  if (opdready==true)
  {
   opdready2 = true;
  }
 }
 else
 {
  if (resready == false)
  {
   opdready?  (operand2 = -1*operand2) : (operand1 = -1*operand1);
   sprintf(numstring,"%lf",opdready? operand2:operand1);
   Change_TextboxText(result,numstring);
  }
 }
}

char *trimstring(char *s)
{
 char b[128]="" ;
 int i = 0;
 int j = 0;

 for( ;*(s+i); i++)
 {
  if (s[i] !=' ')
  {
   b[j++] = s[i];
  }
 }

 return b;
}


singlecal(int ID)
{
 double tmp;

 sscanf(Get_TextboxText(TEXTBOX(result)),"%lf",&tmp);

 switch(ID)
 {
  case ID_SIN:
  tmp = sin(tmp);
  break;
  case ID_COS:
  tmp = cos(tmp);
  break;
  case ID_TAN:
  tmp = tan(tmp);
  break;
  case ID_LOG:
  if (tmp>0)
  tmp = log10(tmp);
  else
  {
   Set_StatubarText(statu,"计算对数错误:底数非正数");
   Messagebox("计算器","计算对数错误:底数非正数",SGMSGBOX_OKONLY,SGMSGBOXICON_critical);
  }
  break;
  case ID_LN:
  if (tmp>0)
  tmp = log(tmp);
  else{
   Set_StatubarText(statu,"计算对数错误:底数非正数");
   Messagebox("计算器","计算对数错误:底数非正数",SGMSGBOX_OKONLY,SGMSGBOXICON_critical);
  }
  break;
  case ID_POWER:
  tmp = pow(tmp,2);
  break;
  case ID_SQRT:
  if (tmp>=0)
  tmp = sqrt(tmp);
  else
  {
   Set_StatubarText(statu,"开方错误:被开方数为负数");
   Messagebox("计算器","错误:被开方数为负数",SGMSGBOX_OKONLY,SGMSGBOXICON_critical);
  }
  break;
  case ID_REV:
  if (tmp!=0)

  tmp = 1/tmp;
  else
  {
   Set_StatubarText(statu,"除法错误:除数为0");

   Messagebox("计算器","除法错误:除数为0",SGMSGBOX_OKONLY,SGMSGBOXICON_critical);
  }
  break;
  case ID_PERCENT:
  tmp = tmp*100;
  break;
  case ID_EXP:
  tmp =exp(tmp);
  break;
 }

 if (resready == true)
 {
  res = tmp;
 }
 else
 {
  if (opdready == false)
  {
   operand1= tmp;
   opdready = true;
  }
  else if (opdready2==true)
  {
   operand2 = tmp;
  }

 }
 Formats_Textbox(result,"%lf",tmp);
}

阅读(3367) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册