正文

计算器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);}

阅读(3379) | 评论(0)


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

评论

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