找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3901|回复: 1
打印 上一主题 下一主题
收起左侧

基于ucgui的计算器界面 含部分源码

[复制链接]
跳转到指定楼层
楼主


  1. #include "stm32f10x.h"
  2. #include <stdio.h>
  3. #include "tsc2046.h"
  4. #include "GUI.h"
  5. #include "Time.h"
  6. #include "WM.h"
  7. #include "BUTTON.h"
  8. #include "EDIT.h"
  9. #include "FRAMEWIN.h"
  10. #include <stddef.h>
  11. #include <string.h>
  12. #include "DIALOG.h"
  13. #include <stdlib.h>
  14. #include "Calculator.h"


  15. #define GUI_ID_BUTTON10   GUI_ID_USER+1
  16. #define GUI_ID_BUTTON11   GUI_ID_USER+2
  17. #define GUI_ID_BUTTON12   GUI_ID_USER+3
  18. #define GUI_ID_BUTTON13   GUI_ID_USER+4
  19. #define GUI_ID_BUTTON14   GUI_ID_USER+5
  20. #define GUI_ID_BUTTON15   GUI_ID_USER+6
  21. #define GUI_ID_BUTTON16   GUI_ID_USER+7
  22. #define GUI_ID_BUTTON17   GUI_ID_USER+8
  23. #define GUI_ID_BUTTON18   GUI_ID_USER+9
  24. #define GUI_ID_BUTTON19   GUI_ID_USER+10

  25. char DisplayContent[100];
  26. WM_HWIN CalculatorDlg;
  27. void OperateLeftToRight(char *buf);

  28. typedef        struct{
  29.         double operate1;                                        //第一个操作数
  30.         double operate2;                                        //第二个操作数
  31.         double result;                                            //操作结果
  32.         uint8_t  operatenum;                                //当前操作数
  33.         #define ADD                 0x01                        //加法
  34.         #define SUB                 0x02                        //减法
  35.         #define MUL                        0x04                        //乘法
  36.         #define DIV                        0x08                        //除法
  37.         #define EQUAL                0x10                        //等于
  38.         #define NUMBER        0x20                            //数字
  39.         #define OPERATE        0x40                            //运算符
  40.         #define DOT                        0x80                        //小数点
  41.         uint8_t pressedsymbol;                            //当前按下的符号
  42.         uint8_t IllegalExpression;                        //是否是合法的表达式
  43.         char keyval;                                                //当前按下的按钮
  44.         uint8_t close;        
  45. }CALCULATE;

  46. CALCULATE Calculate={
  47. 0,
  48. 0,
  49. 0,
  50. 0,
  51. 0,
  52. 0,
  53. 0,
  54. 0,
  55. };

  56. static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  57.     { FRAMEWIN_CreateIndirect,  "Calculator",        0,                       0,  0,  240,320,FRAMEWIN_CF_ACTIVE,0},
  58.     { BUTTON_CreateIndirect,    "7",                 GUI_ID_BUTTON0,          10, 100, 45, 25, 0,0},
  59.     { BUTTON_CreateIndirect,    "8",                 GUI_ID_BUTTON1,          65, 100, 45, 25, 0,0},
  60.     { BUTTON_CreateIndirect,    "9",                 GUI_ID_BUTTON2,          120, 100, 45, 25, 0,0},
  61.     { BUTTON_CreateIndirect,    "*",                 GUI_ID_BUTTON3,          175, 100, 45, 25, 0,0},
  62.     { BUTTON_CreateIndirect,    "4",                 GUI_ID_BUTTON4,          10, 140, 45, 25, 0,0},
  63.     { BUTTON_CreateIndirect,    "5",                 GUI_ID_BUTTON5,          65, 140, 45, 25, 0,0},
  64.     { BUTTON_CreateIndirect,    "6",                 GUI_ID_BUTTON6,          120, 140, 45, 25, 0,0},
  65.     { BUTTON_CreateIndirect,    "/",                 GUI_ID_BUTTON7,          175, 140, 45, 25, 0,0},
  66.     { BUTTON_CreateIndirect,    "1",                 GUI_ID_BUTTON8,          10, 180, 45, 25, 0,0},
  67.     { BUTTON_CreateIndirect,    "2",                 GUI_ID_BUTTON9,          65, 180, 45, 25, 0,0},
  68.     { BUTTON_CreateIndirect,    "3",                 GUI_ID_BUTTON10,         120, 180, 45, 25, 0,0},
  69.     { BUTTON_CreateIndirect,    "+",                 GUI_ID_BUTTON11,         175, 180, 45, 25, 0,0},
  70.     { BUTTON_CreateIndirect,    "0",                 GUI_ID_BUTTON12,         10, 220, 45, 25, 0,0},
  71.     { BUTTON_CreateIndirect,    "=",                 GUI_ID_BUTTON13,         65, 220, 45, 25, 0,0},
  72.     { BUTTON_CreateIndirect,    ".",                 GUI_ID_BUTTON14,         120, 220, 45, 25, 0,0},
  73.     { BUTTON_CreateIndirect,    "-",                 GUI_ID_BUTTON15,         175, 220, 45, 25, 0,0},
  74.     { BUTTON_CreateIndirect,    "Ac",                GUI_ID_BUTTON16,         10,260,45, 25, 0,0},
  75.         { BUTTON_CreateIndirect,    "",                  GUI_ID_BUTTON17,         65, 260, 45, 25, 0,0},
  76.     { BUTTON_CreateIndirect,    "",                  GUI_ID_BUTTON18,         120, 260, 45, 25, 0,0},
  77.     { BUTTON_CreateIndirect,    "",                  GUI_ID_BUTTON19,         175,260,45, 25, 0,0},
  78.     { EDIT_CreateIndirect,       0,                  GUI_ID_EDIT0,            16, 3,  200,38, 0,0}
  79. };

  80. static void InitDialog(WM_MESSAGE * pMsg)
  81. {
  82.     WM_HWIN hWin = pMsg->hWin;
  83.     //FRAMEWIN
  84.     FRAMEWIN_SetClientColor(hWin,GUI_GREEN);
  85.     FRAMEWIN_SetFont(hWin,&GUI_FontComic18B_1);
  86.     FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
  87.     FRAMEWIN_AddCloseButton(hWin,FRAMEWIN_BUTTON_RIGHT,10);
  88.     FRAMEWIN_SetTitleHeight(hWin,18);
  89.     //GUI_ID_BUTTON0
  90.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),BUTTON_CI_UNPRESSED,GUI_CYAN);
  91.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_FontComic24B_1);
  92.     //GUI_ID_BUTTON1
  93.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON1),BUTTON_CI_UNPRESSED,GUI_CYAN);
  94.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON1),&GUI_FontComic24B_1);
  95.     //GUI_ID_BUTTON2
  96.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON2),BUTTON_CI_UNPRESSED,GUI_CYAN);
  97.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON2),&GUI_FontComic24B_1);
  98.     //GUI_ID_BUTTON3
  99.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON3),BUTTON_CI_UNPRESSED,GUI_RED);
  100.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON3),&GUI_FontComic24B_1);
  101.     //GUI_ID_BUTTON4
  102.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON4),BUTTON_CI_UNPRESSED,GUI_CYAN);
  103.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON4),&GUI_FontComic24B_1);
  104.     //GUI_ID_BUTTON5
  105.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON5),BUTTON_CI_UNPRESSED,GUI_CYAN);
  106.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON5),&GUI_FontComic24B_1);
  107.     //GUI_ID_BUTTON6
  108.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON6),BUTTON_CI_UNPRESSED,GUI_CYAN);
  109.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON6),&GUI_FontComic24B_1);
  110.     //GUI_ID_BUTTON7
  111.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON7),BUTTON_CI_UNPRESSED,GUI_RED);
  112.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON7),&GUI_FontComic24B_1);
  113.     //GUI_ID_BUTTON8
  114.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON8),BUTTON_CI_UNPRESSED,GUI_CYAN);
  115.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON8),&GUI_FontComic24B_1);
  116.     //GUI_ID_BUTTON9
  117.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON9),BUTTON_CI_UNPRESSED,GUI_CYAN);
  118.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON9),&GUI_FontComic24B_1);
  119.     //GUI_ID_BUTTON10
  120.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON10),BUTTON_CI_UNPRESSED,GUI_CYAN);
  121.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON10),&GUI_FontComic24B_1);
  122.     //GUI_ID_BUTTON11
  123.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON11),BUTTON_CI_UNPRESSED,GUI_RED);
  124.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON11),&GUI_FontComic24B_1);
  125.     //GUI_ID_BUTTON12
  126.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),BUTTON_CI_UNPRESSED,GUI_CYAN);
  127.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),&GUI_FontComic24B_1);
  128.     //GUI_ID_BUTTON13
  129.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),BUTTON_CI_UNPRESSED,GUI_CYAN);
  130.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),&GUI_FontComic24B_1);
  131.     //GUI_ID_BUTTON14
  132.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),BUTTON_CI_UNPRESSED,GUI_CYAN);
  133.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),&GUI_FontComic24B_1);
  134.     //GUI_ID_BUTTON15
  135.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),BUTTON_CI_UNPRESSED,GUI_RED);
  136.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),&GUI_FontComic24B_1);
  137.     //GUI_ID_BUTTON16
  138.     BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),BUTTON_CI_UNPRESSED,GUI_RED);
  139.     BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),&GUI_FontComic24B_1);
  140.     //GUI_ID_EDIT0
  141.         EDIT_SetMaxLen(WM_GetDialogItem(hWin,GUI_ID_EDIT0),100);
  142.     EDIT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_EDIT0),EDIT_CI_ENABLED,GUI_WHITE);
  143.     EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT0),&GUI_FontComic18B_1);
  144.     EDIT_SetTextAlign(WM_GetDialogItem(hWin,GUI_ID_EDIT0),GUI_TA_VCENTER|GUI_TA_RIGHT);
  145.     EDIT_SetText(WM_GetDialogItem(hWin,GUI_ID_EDIT0),DisplayContent);

  146. }

  147. static void _cbCallback(WM_MESSAGE * pMsg)
  148. {
  149.     uint16_t NCode, Id;
  150.         char str[8];
  151.         uint8_t i;
  152.     WM_HWIN hWin = pMsg->hWin;
  153.     switch (pMsg->MsgId)
  154.     {
  155.                 case WM_DELETE:
  156.                         Calculate.close=1;
  157.                         break;
  158.         case WM_INIT_DIALOG:
  159.             InitDialog(pMsg);
  160.             break;
  161.         case WM_NOTIFY_PARENT:
  162.             Id = WM_GetId(pMsg->hWinSrc);                    //控件的id
  163.             NCode = pMsg->Data.v;                           //通知代码
  164.             switch (Id)
  165.             {
  166.                                                                 case GUI_ID_OK:
  167.                                                                         if(NCode==WM_NOTIFICATION_RELEASED){
  168.                                                                                           GUI_EndDialog(hWin, 0);        
  169.                                                                                 }                                                                                
  170.                                                                                 break;
  171.                                                                 case GUI_ID_CANCEL:
  172.                                                                         if(NCode==WM_NOTIFICATION_RELEASED){
  173.                                                                                           GUI_EndDialog(hWin, 1);        
  174.                                                                                 }        
  175.                                                                                 break;
  176.                                                                 case GUI_ID_BUTTON0:        // 7
  177.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  178.                                                                                           Calculate.keyval='7';
  179.                                                                                           Calculate.pressedsymbol |= NUMBER;
  180.                                                                                 }
  181.                                                                                 break;
  182.                                                                 case GUI_ID_BUTTON1:        // 8
  183.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  184.                                                                                          Calculate.keyval='8';
  185.                                                                                          Calculate.pressedsymbol |= NUMBER;
  186.                                                                                 }
  187.                                                                                 break;
  188.                                                                 case GUI_ID_BUTTON2:// 9
  189.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  190.                                                                                         Calculate.keyval='9';
  191.                                                                                         Calculate.pressedsymbol |= NUMBER;
  192.                                                                                 }
  193.                                                                                 break;
  194.                                                                 case GUI_ID_BUTTON4:        // 4
  195.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  196.                                                                                         Calculate.keyval='4';
  197.                                                                                         Calculate.pressedsymbol |= NUMBER;
  198.                                                                                 }
  199.                                                                                 break;
  200.                                                                 case GUI_ID_BUTTON5:        //5
  201.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  202.                                                                                         Calculate.keyval='5';
  203.                                                                                         Calculate.pressedsymbol |= NUMBER;
  204.                                                                                 }
  205.                                                                                 break;
  206.                                                                 case GUI_ID_BUTTON6:// 6
  207.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  208.                                                                                         Calculate.keyval='6';
  209.                                                                                         Calculate.pressedsymbol |= NUMBER;
  210.                                                                                 }
  211.                                                                                 break;
  212.                                                                 case GUI_ID_BUTTON8://1
  213.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  214.                                                                                         Calculate.keyval='1';
  215.                                                                                         Calculate.pressedsymbol |= NUMBER;
  216.                                                                                 }
  217.                                                                                 break;
  218.                                                                 case GUI_ID_BUTTON9://2
  219.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  220.                                                                                         Calculate.keyval='2';
  221.                                                                                         Calculate.pressedsymbol |= NUMBER;
  222.                                                                                 }
  223.                                                                                 break;
  224.                                                                 case GUI_ID_BUTTON10://3
  225.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  226.                                                                                         Calculate.keyval='3';
  227.                                                                                         Calculate.pressedsymbol |= NUMBER;
  228.                                                                                 }
  229.                                                                                 break;
  230.                                                                 case GUI_ID_BUTTON12://0
  231.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  232.                                                                                         Calculate.keyval='0';
  233.                                                                                         Calculate.pressedsymbol |= NUMBER;
  234.                                                                                 }
  235.                                                                                 break;
  236.                                                                 case GUI_ID_BUTTON14:// .
  237.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  238.                                                                                           if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&DOT)!=DOT){
  239.                                                                                                         Calculate.keyval='.';
  240.                                                                                                         Calculate.pressedsymbol |= DOT;
  241.                                                                                                         Calculate.pressedsymbol &= ~NUMBER;
  242.                                                                                                         strcat(DisplayContent,&Calculate.keyval);
  243.                                                                                                         EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);        
  244.                                                                                                         Calculate.keyval=0;                                                                                                               
  245.                                                                                                 }

  246.                                                                                 }
  247.                                                                                 break;
  248.                                                                 case GUI_ID_BUTTON7:// /
  249.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  250.                                                                                         if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
  251.                                                                                                 Calculate.keyval='/';
  252.                                                                                                 Calculate.pressedsymbol |= OPERATE;
  253.                                                                                                 Calculate.pressedsymbol &= ~NUMBER;
  254.                                                                                                 Calculate.pressedsymbol &= ~DOT;                //接下来可以输入小数点
  255.                                                                                                 strcat(DisplayContent,&Calculate.keyval);
  256.                                                                                                 EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);        
  257.                                                                                                 Calculate.keyval=0;               
  258.                                                                                         }
  259.                                                                                 }
  260.                                                                                 break;
  261.                                                                 case GUI_ID_BUTTON3:// *
  262.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  263.                                                                                         if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
  264.                                                                                                 Calculate.keyval='*';
  265.                                                                                                 Calculate.pressedsymbol |= OPERATE;
  266.                                                                                                 Calculate.pressedsymbol &= ~NUMBER;
  267.                                                                                                 Calculate.pressedsymbol &= ~DOT;                //接下来可以输入小数点
  268.                                                                                                 strcat(DisplayContent,&Calculate.keyval);
  269.                                                                                                 EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);        
  270.                                                                                                 Calculate.keyval=0;        
  271.                                                                                         }
  272.                                                                                 }
  273.                                                                                 break;
  274.                                                                 case GUI_ID_BUTTON15:// -
  275.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  276.                                                                                         if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
  277.                                                                                                 Calculate.keyval='-';
  278.                                                                                                 Calculate.pressedsymbol |= OPERATE;
  279.                                                                                                 Calculate.pressedsymbol &= ~NUMBER;
  280.                                                                                                 Calculate.pressedsymbol &= ~DOT;                //接下来可以输入小数点
  281.                                                                                                 strcat(DisplayContent,&Calculate.keyval);
  282.                                                                                                 EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);        
  283.                                                                                                 Calculate.keyval=0;                                                                                                        
  284.                                                                                         }
  285.                                                                                 }
  286.                                                                                 break;
  287.                                                                 case GUI_ID_BUTTON11:// +
  288.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  289.                                                                                         if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
  290.                                                                                                 Calculate.keyval='+';
  291.                                                                                                 Calculate.pressedsymbol |= OPERATE;
  292.                                                                                                 Calculate.pressedsymbol &= ~NUMBER;
  293.                                                                                                 Calculate.pressedsymbol &= ~DOT;                //接下来可以输入小数点
  294.                                                                                                 strcat(DisplayContent,&Calculate.keyval);
  295.                                                                                                 EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);        
  296.                                                                                                 Calculate.keyval=0;                                                                                                        
  297.                                                                                         }
  298.                                                                                 }
  299.                                                                                 break;
  300.                                                                 case GUI_ID_BUTTON16:// c
  301.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED){
  302.                                                                                                 strcpy(DisplayContent,"");
  303.                                                                                             Calculate.result=0;
  304.                                                                                                 EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
  305.                                                                                                 Calculate.pressedsymbol &= ~NUMBER;               
  306.                                                                                                 Calculate.keyval=0;        
  307.                                                                                 }
  308.                                                                                 break;
  309.                                                                 case GUI_ID_BUTTON13:// =
  310.                                                                                 if(NCode==WM_NOTIFICATION_RELEASED)
  311.                                                                                 {
  312.                                                                                                 if(strlen(DisplayContent)>0)
  313.                                                                                                 {
  314.                                                                                                         OperateLeftToRight(DisplayContent);        
  315.                                                                                                         if((Calculate.result-(uint16_t)Calculate.result)!=0)
  316.                                                                           {
  317.                                                                              strcpy(DisplayContent,"");
  318.                                                                              sprintf(DisplayContent,"%d",(uint16_t)Calculate.result);
  319.                                                                              strcat(DisplayContent,".");
  320.                                                                              sprintf(str,"%d",(uint16_t)((Calculate.result-(uint16_t)Calculate.result)*100000));
  321.                                                                              strcat(DisplayContent,str);
  322.                                                                              for(i=strlen(DisplayContent)-1;i>=0;i--)  //将小数点后多余的0去掉
  323.                                                                                 {
  324.                                                                                                if(DisplayContent[i]!='0')
  325.                                                                                                   {
  326.                                                                                                          DisplayContent[i+1]='\0';
  327.                                                                                                      break;
  328.                                                                                                   }
  329.                                                                                     }
  330.                                                                           }                                                                             
  331.                                                                         else
  332.                                                                           {
  333.                                                                              strcpy(DisplayContent,"");
  334.                                                                              sprintf(DisplayContent,"%d",(uint16_t)Calculate.result);
  335.                                                                           }        
  336.                                                                                                           EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
  337.                                                                                                       Calculate.pressedsymbol &= ~DOT;        //接下来可以输入小数点
  338.                                                                           Calculate.keyval=0;                                                                                                                                                                                                                                               
  339.                                                                                                 }                                                                                                        
  340.                                                                                 }
  341.                                                                                 break;                                                                                
  342.             }
  343.             break;
  344.         default:
  345.             WM_DefaultProc(pMsg);
  346.     }
  347. }

  348. void Operate(double numb1,double numb2,char symbol)
  349. {
  350.          switch(symbol)
  351.          {
  352.                         case '+':
  353.                                         numb1 += numb2;
  354.                                         Calculate.result=numb1;
  355.                                         //printf("Calculate.result:%f\r\n",result);
  356.                                 break;
  357.                         case '-':
  358.                                     numb1 -= numb2;
  359.                                         Calculate.result=numb1;
  360.                                     //printf("Calculate.result:%f\r\n",result);
  361.                                 break;
  362.                         case '*':
  363.                                         numb1 *= numb2;
  364.                                         Calculate.result=numb1;
  365.                                         //printf("Calculate.result:%f\r\n",result);
  366.                                 break;
  367.                         case '/':
  368.                                         if(numb2==0)
  369.                                         {
  370.                                                 Calculate.IllegalExpression = 1;
  371.                                         }else
  372.                                         {
  373.                                                 numb1 = (double)numb1/(double)numb2;
  374.                                                 Calculate.result=numb1;
  375.                                                 //printf("Calculate.result:%f\r\n",result);
  376.                                         }
  377.                                 break;
  378.                         default:
  379.                                 break;
  380.          }
  381. }
  382. /*
  383. ***************************************************************
  384. *函数名:IsOperator
  385. *功能:         判断此字符是不是运算符
  386. *参数:         
  387. *返回值:0:是 1:不是
  388. ****************************************************************
  389. */
  390. static uint8_t IsOperator(char opt)
  391. {
  392.         if(opt=='+'||opt=='-'||opt=='*'||opt=='/')
  393.         {
  394.                         return 0;
  395.         }
  396.         return 1;
  397. }

  398. /*
  399. ***************************************************************
  400. *函数名:OperateLeftToRight
  401. *功能:         从左到右计算表达式,不考虑优先级 输入的表达式必须合法
  402. *参数:         
  403. *返回值:
  404. ****************************************************************
  405. */
  406. void OperateLeftToRight(char *buf)
  407. {
  408.         char Operatesym;
  409.         double tmpnum1=1,tmpnum2=1,output1=0,output2=0;
  410.         uint8_t i=0;
  411.         //temp = (char*)mem_malloc(100);
  412.   while(*buf)
  413.   {
  414.                 if(!IsOperator(*buf)) //判断是不是运算符
  415.                 {
  416.                             i++;
  417.                                 Operatesym = *buf;                //得到操作符
  418.                                 buf++;
  419.                 }
  420.                 else
  421.                 {
  422.                            if(i==0)                                                //第一个操作数
  423.                         {
  424.                            while(*buf>='0' && *buf<='9')
  425.                        output1=output1*10+(*buf++)-'0';   //整数部分
  426.                if(*buf=='.')                                         
  427.                {
  428.                    buf++;
  429.                    while(*buf>='0' && *buf<='9')      //*str 是数字
  430.                    {
  431.                       tmpnum1/=10;
  432.                       output1=output1+((*buf++)-'0')*tmpnum1;//小数部分
  433.                    }
  434.                }
  435.                         }

  436.                          if(i==1)                       //第二个操作数
  437.                         {
  438.                            i=0;
  439.                            while(*buf>='0' && *buf<='9')
  440.                        output2=output2*10+(*buf++)-'0';   //整数部分
  441.    
  442.                if(*buf=='.')                                         
  443.                {
  444.                    buf++;
  445.                    while(*buf>='0' && *buf<='9')       //*str 是数字
  446.                    {
  447.                       tmpnum2/=10;
  448.                       output2=output2+((*buf++)-'0')*tmpnum2;//小数部分
  449.                    }
  450.                }
  451.                         }
  452.                 }//else
  453.         }//while
  454.         Operate(output1,output2,Operatesym);
  455.         //mem_free(temp);
  456. }
  457. /*
  458. ***************************************************************
  459. *函数名:Calculator
  460. *功能:         计算器功能
  461. *参数:         无
  462. *返回值:无
  463. ****************************************************************
  464. */
  465. void Calculator(void)
  466. {        
  467.             strcpy(DisplayContent,"");
  468.         //WM_SetCreateFlags(WM_CF_MEMDEV); ////后面加的
  469.                 CalculatorDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback,0, 0, 0);
  470.                 while(1){
  471.                           if((Calculate.pressedsymbol&NUMBER)==NUMBER)
  472.                           {
  473.                                                  strcat(DisplayContent,&Calculate.keyval);
  474.                                                  EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);        
  475.                                                 Calculate.keyval=0;               
  476.                                                 Calculate.pressedsymbol &= ~OPERATE;                                       
  477.                                 }               
  478.                                 if(Calculate.close){
  479.                                                 Calculate.close = 0;
  480.                                                 break;                                                
  481.                                 }
  482.                                 GUI_Delay(10);
  483.                 }
  484. }
复制代码



评分

参与人数 1黑币 +1 收起 理由
虾条粥 + 1 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:281427 发表于 2019-10-12 21:20 | 只看该作者
骗积分的吧,整个就一个c文件。差评
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表