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_X 50
#define BEGAIN_Y 150
#define BUTTON_X 50
#define BUTTON_Y 50
#define BUTTON_BUTTON_INTERVAL 30
struct rtgui_label* label;
char op='0';
float Value1,Value2,Result;
#define STATE_IN_Value1 0
#define STATE_IN_op 1
#define STATE_IN_Value2 2
char 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_I