在RealTouch中实现一个计算器

来源:互联网 发布:淘宝怎么打不开了 编辑:程序博客网 时间:2024/05/01 01:20

 

UI的设计倒是很简单,按钮和label就可以了。困难的是算法。

1.这样把数值输入

2.这样调整小数点

3这样保留有效小数位

4防止多次按下Op

代码还有很多问题,本来目的是使用realtouch的GUI的反而在算法上花费太多时间了。所以不再继续了

 

#include <rtthread.h>#include <rtgui/rtgui_app.h>#include <rtgui/widgets/container.h>#include <rtgui/widgets/window.h>#include <rtgui/widgets/button.h>#include <rtgui/widgets/label.h>#include <rtgui/image.h>#include <rtgui/font.h>#define BEGAIN_X50#define BEGAIN_Y150#define BUTTON_X50#define BUTTON_Y50#define BUTTON_BUTTON_INTERVAL30struct rtgui_label* label;char op='0';float Value1,Value2,Result;#define  STATE_IN_Value10#define  STATE_IN_op1#define  STATE_IN_Value22char state=STATE_IN_Value1;char dot_cnt=0;char strBuf[50];char srtIndex=0;char Calculate(float a ,char option,float b,float *pOutResult);void debug_print(float a,char op,float b){rt_kprintf("%d\n",(long)(a*100));rt_kprintf("op=%c\n",op);rt_kprintf("%d\n",(long)(b*100));}float moveDot(char cnt){int i;float temp=1;for(i=0;i<cnt;i++){temp*=0.1;}return temp;}void button0_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=0;float dot;if(state==STATE_IN_Value1){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value1=Value1+X*dot;}else{Value1=Value1*10+X;}}else if(state==STATE_IN_Value2){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value2=Value2+X*dot;}else{Value2=Value2*10+X;}}strBuf[srtIndex++]='0';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数  下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button1_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=1;float dot;if(dot_cnt) dot_cnt++;//记录小数点位数if(state==STATE_IN_Value1){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value1=Value1+X*dot;}else{Value1=Value1*10+X;}}else if(state==STATE_IN_Value2){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value2=Value2+X*dot;}else{Value2=Value2*10+X;}}strBuf[srtIndex++]='1';rtgui_label_set_text(label,strBuf);debug_print((int)Value1,op,(int)Value2);}void button2_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=2;float dot;if(dot_cnt) dot_cnt++;//记录小数点位数if(state==STATE_IN_Value1){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value1=Value1+X*dot;}else{Value1=Value1*10+X;}}else if(state==STATE_IN_Value2){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value2=Value2+X*dot;}else{Value2=Value2*10+X;}}strBuf[srtIndex++]='2';rtgui_label_set_text(label,strBuf);debug_print((int)Value1,op,(int)Value2);}void button3_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=3;float dot;if(dot_cnt) dot_cnt++;//记录小数点位数if(state==STATE_IN_Value1){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value1=Value1+X*dot;}else{Value1=Value1*10+X;}}else if(state==STATE_IN_Value2){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value2=Value2+X*dot;}else{Value2=Value2*10+X;}}strBuf[srtIndex++]='3';rtgui_label_set_text(label,strBuf);debug_print((int)Value1,op,(int)Value2);}void button4_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=4;float dot;if(state==STATE_IN_Value1){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value1=Value1+X*dot;}else{Value1=Value1*10+X;}}else if(state==STATE_IN_Value2){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value2=Value2+X*dot;}else{Value2=Value2*10+X;}}strBuf[srtIndex++]='4';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数  下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button5_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=5;float dot;if(state==STATE_IN_Value1){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value1=Value1+X*dot;}else{Value1=Value1*10+X;}}else if(state==STATE_IN_Value2){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value2=Value2+X*dot;}else{Value2=Value2*10+X;}}strBuf[srtIndex++]='5';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数  下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button6_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=6;float dot;if(state==STATE_IN_Value1){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value1=Value1+X*dot;}else{Value1=Value1*10+X;}}else if(state==STATE_IN_Value2){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value2=Value2+X*dot;}else{Value2=Value2*10+X;}}strBuf[srtIndex++]='6';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数  下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button7_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=7;float dot;if(state==STATE_IN_Value1){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value1=Value1+X*dot;}else{Value1=Value1*10+X;}}else if(state==STATE_IN_Value2){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value2=Value2+X*dot;}else{Value2=Value2*10+X;}}strBuf[srtIndex++]='7';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数  下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button8_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=8;float dot;if(state==STATE_IN_Value1){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value1=Value1+X*dot;}else{Value1=Value1*10+X;}}else if(state==STATE_IN_Value2){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value2=Value2+X*dot;}else{Value2=Value2*10+X;}}strBuf[srtIndex++]='8';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数  下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button9_pressed(struct rtgui_object* object, struct rtgui_event* event){char X=9;float dot;if(state==STATE_IN_Value1){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value1=Value1+X*dot;}else{Value1=Value1*10+X;}}else if(state==STATE_IN_Value2){if(dot_cnt!=0)//按下小数点{dot=moveDot(dot_cnt);Value2=Value2+X*dot;}else{Value2=Value2*10+X;}}strBuf[srtIndex++]='9';rtgui_label_set_text(label,strBuf);if(dot_cnt) dot_cnt++;//记录小数点位数  下一次按下数值键时小数点位数debug_print((int)Value1,op,(int)Value2);}void button_add_pressed(struct rtgui_object* object, struct rtgui_event* event){op='+';state=STATE_IN_Value2;dot_cnt=0;strBuf[srtIndex++]='+';rtgui_label_set_text(label,strBuf);}void button_sub_pressed(struct rtgui_object* object, struct rtgui_event* event){op='-';state=STATE_IN_Value2;dot_cnt=0;strBuf[srtIndex++]='-';rtgui_label_set_text(label,strBuf);}void button_mul_pressed(struct rtgui_object* object, struct rtgui_event* event){op='*';state=STATE_IN_Value2;dot_cnt=0;strBuf[srtIndex++]='*';rtgui_label_set_text(label,strBuf);}void button_div_pressed(struct rtgui_object* object, struct rtgui_event* event){op='/';state=STATE_IN_Value2;dot_cnt=0;strBuf[srtIndex++]='/';rtgui_label_set_text(label,strBuf);}void button_dot_pressed(struct rtgui_object* object, struct rtgui_event* event){dot_cnt=1;strBuf[srtIndex++]='.';rtgui_label_set_text(label,strBuf);}void button_equ_pressed(struct rtgui_object* object, struct rtgui_event* event){char err=0;long temp;long dot_temp;char dot01;char dot001;char dot0001;char dot00001;err=Calculate(Value1,op,Value2,&Result);if(err==0){rt_kprintf("Result=%d\n",(long)(Result*10000));}else{rt_kprintf("err\n");}Value1=0;Value2=0;dot_cnt=0;state=STATE_IN_Value1;strBuf[srtIndex++]='=';temp=(long )Result;//取整数部分dot_temp=(Result-temp)*10000;//取小数部分,保留5位小数部分if(dot_temp>0){rt_sprintf(strBuf+srtIndex,"%d.%d%d%d%d%d",temp,dot_temp/1000,dot_temp/100,dot_temp/10,dot_temp%10);}else{rt_sprintf(strBuf+srtIndex,"%d",temp);}rtgui_label_set_text(label,strBuf);//清除缓冲rt_memset(strBuf,0,50);srtIndex=0;}void rect_moveto(rtgui_rect_t *rect, int x, int y){    rect->x1 += x;    rect->x2 += x;    rect->y1 += y;    rect->y2 += y;}void main(void){/*变量声明*/struct rtgui_app* application;struct rtgui_win* win;struct rtgui_button *button0,*button1,*button2,*button3,*button4,*button5,*button6,*button7,*button8,*button9;struct rtgui_button *button_dot,*button_add,*button_sub,*button_mul,*button_div,*button_equ;    rtgui_rect_t rect;    rtgui_image_t *imageUP,*imageDOWN;    debug_print(1.2,'+',4.7);    rt_memset(strBuf,0,50);    /*建立应用程序*/application = rtgui_app_create(rt_thread_self(), "buttondemo");/*判断应用程序是否加载成功*/if (RT_NULL==application){rt_kprintf("Create application failed!");return;}/*建立主窗体*/win =rtgui_mainwin_create(RT_NULL,"buttondemo", RTGUI_WIN_STYLE_MAINWIN| RTGUI_WIN_STYLE_DESTROY_ON_CLOSE);/*判断窗体是否建立成功*/    if (RT_NULL==win){rt_kprintf("Create mainwindow failed!");rtgui_app_destroy(application);return;}    button0 = rtgui_button_create("0");button1 = rtgui_button_create("1");button2 = rtgui_button_create("2");button3 = rtgui_button_create("3");button4 = rtgui_button_create("4");button5 = rtgui_button_create("5");button6 = rtgui_button_create("6");button7 = rtgui_button_create("7");button8 = rtgui_button_create("8");button9 = rtgui_button_create("9");button0 = rtgui_button_create("0");button_dot = rtgui_button_create(".");button_add = rtgui_button_create("+");button_sub = rtgui_button_create("-");button_mul = rtgui_button_create("*");button_div = rtgui_button_create("/");button_equ = rtgui_button_create("=");/*设置button1的位置*///第一行rect = (rtgui_rect_t){BEGAIN_X,BEGAIN_Y,BEGAIN_X+BUTTON_X,BEGAIN_Y+BUTTON_Y};rtgui_widget_set_rect(RTGUI_WIDGET(button7), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button8), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button9), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_div), &rect);//第二行rect = (rtgui_rect_t){BEGAIN_X,BEGAIN_Y,BEGAIN_X+BUTTON_X,BEGAIN_Y+BUTTON_Y};rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rtgui_widget_set_rect(RTGUI_WIDGET(button4), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button5), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button6), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_mul), &rect);//第三行rect = (rtgui_rect_t){BEGAIN_X,BEGAIN_Y,BEGAIN_X+BUTTON_X,BEGAIN_Y+BUTTON_Y};rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rtgui_widget_set_rect(RTGUI_WIDGET(button1), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button2), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button3), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_sub), &rect);//第三行rect = (rtgui_rect_t){BEGAIN_X,BEGAIN_Y,BEGAIN_X+BUTTON_X,BEGAIN_Y+BUTTON_Y};rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rect_moveto(&rect,0,BUTTON_Y+BUTTON_BUTTON_INTERVAL);rtgui_widget_set_rect(RTGUI_WIDGET(button0), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_dot), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_equ), &rect);rect_moveto(&rect,BUTTON_X+BUTTON_BUTTON_INTERVAL,0);rtgui_widget_set_rect(RTGUI_WIDGET(button_add), &rect);/*设置按键事件函数*/rtgui_button_set_onbutton(button0,button0_pressed);        rtgui_button_set_onbutton(button1,button1_pressed);        rtgui_button_set_onbutton(button2,button2_pressed);        rtgui_button_set_onbutton(button3,button3_pressed);        rtgui_button_set_onbutton(button4,button4_pressed);        rtgui_button_set_onbutton(button5,button5_pressed);        rtgui_button_set_onbutton(button6,button6_pressed);        rtgui_button_set_onbutton(button7,button7_pressed);        rtgui_button_set_onbutton(button8,button8_pressed);        rtgui_button_set_onbutton(button9,button9_pressed);        rtgui_button_set_onbutton(button_add,button_add_pressed);        rtgui_button_set_onbutton(button_sub,button_sub_pressed);        rtgui_button_set_onbutton(button_mul,button_mul_pressed);        rtgui_button_set_onbutton(button_div,button_div_pressed);        rtgui_button_set_onbutton(button_dot,button_dot_pressed);        rtgui_button_set_onbutton(button_equ,button_equ_pressed);/*建立lable标签*/label=rtgui_label_create("This is a button demo");/*设置label位置*/rect = (rtgui_rect_t){100,50,600,160};rtgui_widget_set_rect(RTGUI_WIDGET(label),&rect);/*添加按钮到主窗体中*/rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button0));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button1));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button2));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button3));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button4));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button5));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button6));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button7));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button8));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button9));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_div));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_mul));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_sub));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_dot));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_equ));rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(button_add));/*添加label到主窗体中*/rtgui_container_add_child(RTGUI_CONTAINER(win), RTGUI_WIDGET(label));/*显示主窗体*/rtgui_win_show(win, RT_TRUE);rtgui_app_destroy(application);}char Calculate(float a ,char option,float b,float *pOutResult){char err=0;switch(option){case '+':*pOutResult=a+b;break;case '-':*pOutResult=a-b;break;case '*':*pOutResult=a*b;break;case '/':if(b==0){err=-1;}else{*pOutResult=a/b;}break;default : err=-1;break;}return err;}


 

原创粉丝点击