📄 calc.c
字号:
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---计算器等号处理---------------------------------------------------□
□ □
□---2001.3.4---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
void CalcEqual(void)
{
unsigned char i=calc.status;
if(i>=1&&i<=3)
{
if(i==1)StrCopy(calc.OldIn,calc.InOne);
else StrCopy(calc.OldIn,calc.InTwo);
}
switch(calc.Opt)
{
case DIV:StrDIV(calc.InOne,calc.InOne,calc.OldIn);break;
case MUT:StrMUT(calc.InOne,calc.InOne,calc.OldIn);break;
case SUB:StrSUB(calc.InOne,calc.InOne,calc.OldIn);break;
case ADD:StrADD(calc.InOne,calc.InOne,calc.OldIn);break;
case 0:return;
}
calc.InTwo[0]='+';
calc.InTwo[1]=0;
calc.OldOpt=calc.Opt;
calc.Opt=0;
calc.status=5;
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---操作符处理-------------------------------------------------------□
□ □
□---2001.3.1---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
unsigned char * CalcOpp(void)
{
unsigned char *s;
if(calc.Opt)
{
s=calc.InTwo;
calc.status=3;
}
else
{
s=calc.InOne;
calc.status=4;
}
return s;
}
void CalcOperate(unsigned char i)
{
unsigned char *ss;
unsigned char *s;
unsigned char b[3];
short k;
if(calc.status==8&&i!=CE&&i!=CC)return;
switch(i)
{
case UNDO:
if(calc.status==0||calc.status==2)
{
s=(calc.Opt)?&calc.InTwo[1]:&calc.InOne[1];
if(!calc.Opt)calc.status=0;
if(*s)
{
while(*++s);
*--s=0;
}
}
break;
case CE:
*calc.InTwo='+';
calc.InTwo[1]=0;
if(calc.status==8||!calc.Opt)InitCalc();
break;
case CC:InitCalc();break;
case MC:
s=CalcOpp();
*calc.M='+';
calc.M[1]=0;
break;
case MR:
if(StrToDouble(calc.M)!=0.0)
{
s=CalcOpp();
StrCopy(s,calc.M);
}
break;
case MS:
s=CalcOpp();
StrSUB(calc.M,calc.M,s);
for(k=0,ss=calc.M;*ss;ss++){
if(*ss=='.')break;
k++;
}
if((k-1)>MAXNUM){
StrADD(calc.M,calc.M,s);
calc.M[12]=0;
calc.status=8;
}
break;
case MA:
s=CalcOpp();
StrADD(calc.M,calc.M,s);
for(k=0,ss=calc.M;*ss;ss++){
if(*ss=='.')break;
k++;
}
if((k-1)>MAXNUM){
StrSUB(calc.M,calc.M,s);
calc.M[12]=0;
calc.status=8;
}
break;
case DIV:/*/*/
case MUT:/***/
case SUB:/*-*/
case ADD:/*+*/
if(calc.Opt&&calc.status!=1)CalcEqual();
calc.Opt=i;
calc.status=1;
break;
case ROOT:
calc.OldOpt=0;
if(calc.status==1)
{
StrROOT(calc.InTwo,calc.InOne);
calc.status=3;
}
else
{
s=CalcOpp();
StrROOT(s,s);
}
break;
/*case PERCENT:break;*/
case RECIPROCAL:/*倒数*/
calc.OldOpt=0;
b[0]='+';b[1]='1';b[2]=0;
if(calc.status==1)
{
StrDIV(calc.InTwo,b,calc.InOne);
calc.status=3;
}
else
{
s=CalcOpp();
StrDIV(s,b,s);
}
break;
case P_N:/*+/-*/
if(calc.Opt)*calc.InTwo=(*calc.InTwo=='-')?'+':'-';
else *calc.InOne=(*calc.InOne=='-')?'+':'-';
break;
case '=':
if((calc.status==4)&&calc.OldOpt)calc.Opt=calc.OldOpt;
if(calc.Opt)CalcEqual();
break;
}
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---当前操作数插入数字-----------------------------------------------□
□ □
□---2001.3.1---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
void InputAddNum(unsigned char i,unsigned char *s)
{
unsigned char num;
if(calc.status==8)return;
if(calc.status==4){calc.InOne[0]='+';calc.InOne[1]=0;}
else if(calc.status==3){calc.InTwo[0]='+';calc.InTwo[1]=0;}
calc.status=(calc.Opt)?2:0;
if(*s)
{
if(*s=='0'&&s[1]==0){*s++=i;*s=0;}
else
{
num=1;
while(*(++s))
{
if(*s!='.')num++;
if(num>=MAXNUM)return;
}
*s++=i;
*s=0;
}
}
else {*s++=i;*s=0;}
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---当前操作数插入小数点---------------------------------------------□
□ □
□---2001.3.1---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
void InputAddDot(unsigned char *s)
{
if(calc.status==8)return;
if(calc.status==4){calc.InOne[0]='+';calc.InOne[1]=0;}
else if(calc.status==3){calc.InTwo[0]='+';calc.InTwo[1]=0;}
calc.status=(calc.Opt)?2:0;
if(*s)
{
while(*(++s))if(*s=='.')return;
*s++='.';
*s=0;
}
else{*s++='0';*s++='.';*s=0;}
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---计算器面板按钮功能处理函数---------------------------------------□
□ □
□---2001.3.1---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
void CalcInput(unsigned char i)
{
unsigned char *s;
s=(calc.Opt)?&calc.InTwo[1]:&calc.InOne[1];
if(i>='0'&&i<='9')InputAddNum(i,s);
else if(i=='.')InputAddDot(s);
else CalcOperate(i);
CalcShow();
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□
□ 图象数据数组 generated by 《PdaTools-BmpToGray.exe》
□
□ 图象数据头部(有)长度为6字节的DATAHEAD结构。
□ 扫描模式:0(0:水平 1:垂直 2:字节垂直,数据水平 3:字节水平,数据垂直 4:Nucleus)
□ 灰度: 4(1:单色 2:四灰 4:十六灰 8:256色)
□ 宽度: 16
□ 高度: 11
□
□---2001.10.9--15:28----------------------------------------------------
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
const unsigned char Image_Root[94]={0,4,16,0,11,0,
34,34,34,42,170,170,170,170,34,34,34,42,34,34,34,34,34,34,34,162,
34,34,34,34,34,34,34,162,34,34,34,34,34,34,34,162,34,34,34,34,34,
34,42,34,34,34,34,34,34,34,42,34,34,34,34,34,42,34,42,34,34,34,34,
34,162,162,162,34,34,34,34,34,162,42,162,34,34,34,34,34,34,34,162,
34,34,34,34,34,};
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□
□ 图象数据数组 generated by 《PdaTools-BmpToGray.exe》
□
□ 图象数据头部(有)长度为6字节的DATAHEAD结构。
□ 扫描模式:0(0:水平 1:垂直 2:字节垂直,数据水平 3:字节水平,数据垂直 4:Nucleus)
□ 灰度: 4(1:单色 2:四灰 4:十六灰 8:256色)
□ 宽度: 14
□ 高度: 11
□
□---2001.10.9--15:29----------------------------------------------------
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
const unsigned char Image_Reciprocal[83]={0,4,14,0,11,0,
34,34,34,42,34,34,34,42,34,34,42,34,34,34,170,34,34,162,42,162,170,
42,34,34,162,34,162,162,42,34,34,162,34,162,162,42,34,42,34,34,42,
34,42,34,42,34,34,42,34,42,34,42,34,34,162,162,42,34,162,34,34,162,
162,170,162,162,34,42,162,170,34,34,162,34,34,34,34,};
const unsigned char CalcButtonID[]={
MA,/*M+*/'7',/*7*/'8',/*8*/'9',/*9*/DIV,/*/*/ROOT,/*√ˉ*/CC,/*C*/
MS,/*M-*/'4',/*4*/'5',/*5*/'6',/*6*/MUT,/***/RECIPROCAL,/*1/x*/CE,/*CE*/
MR,/*MR*/'1',/*1*/'2',/*2*/'3',/*3*/SUB,/*-*/'=',/*=*/UNDO,/*退格*/
MC,/*MC*/'0',/*0*/P_N,/*+/-*/'.',/*.*/ADD,/*+*/
};
const unsigned char CalcButtonStr[][6]={
"M+","7","8","9","÷","√ˉ","C",
"M-","4","5","6","×","1/x","CE",
"MR","1","2","3","-","=","退格",
"MC","0","±",".","+",
};
const PDARECT CalcButtonRc[26]={
{7,133,29,153,},/*M+*/
{35,61,56,81,},/*7*/
{59,61,80,81,},/*8*/
{83,61,104,81,},/*9*/
{107,61,129,81,},/*/*/
{132,61,154,81,},/*√ˉ*/
{132,36,153,56,},/*C*/
{7,109,29,129,},/*M-*/
{35,85,56,105,},/*4*/
{59,85,80,105,},/*5*/
{83,85,104,105,},/*6*/
{107,85,129,105,},/***/
{132,85,154,105,},/*1/x*/
{107,36,129,56,},/*CE*/
{7,85,29,105,},/*MR*/
{35,109,56,129,},/*1*/
{59,109,80,129,},/*2*/
{83,109,104,129,},/*3*/
{107,109,129,129,},/*-*/
{132,109,154,153,},/*=*/
{59,36,104,56,},/*退格*/
{7,61,29,81,},/*MC*/
{35,133,56,153,},/*0*/
{59,133,80,153,},/*+/-*/
{83,133,104,153,},/*.*/
{107,133,129,153,},/*+*/
};
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---计算器面板按钮获取函数-------------------------------------------□
□ □
□---2001.10.9---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
short GetCalcButton(PDAMSG *pMsg)
{
BUTTON b;
short i,x,y;
x=pMsg->x;
y=pMsg->y;
for(i=0;i<26;i++)if(CheckPointInRect(x,y,(PDARECT *)&CalcButtonRc[i]))
{
InitButton(&b,(PDARECT *)&CalcButtonRc[i],0);
if(i!=5&&i!=12)SetButtonStr(&b,(unsigned char *)CalcButtonStr[i],COLOR_HIGHGRAY);
else
{
SetButtonBmp(&b,(unsigned char *)(i==5?Image_Root:Image_Reciprocal),NULL);
}
if(GetButton(&b,pMsg))return i+100;
}
return MSG_NULL;
}
/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□---计算器入口函数---------------------------------------------------□
□ □
□---2001.10.9---------------------------------------------------------□
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
short Calc(void)
{
void DrawButtonFrame(BUTTON *b,short f);
short i;
BUTTON b;
PDAMSG msg;
//计算器数据初始化。
InitCalc();
//清屏。
DispBar(0,0,160,160,COLOR_BACK);
//画外围框架。
InitRect(0,0,159,159,&b.Rect);
DrawButtonFrame(&b,0);
//画计算器显示屏。
InitRect(7,8,153,30,&b.Rect);
DrawButtonFrame(&b,1);
DispBar(9,10,143,19,COLOR_WHITE);
//画一个填充空白区域的凹型框架。
InitRect(7,36,56,56,&b.Rect);
DrawButtonFrame(&b,1);
//画计算器输入按钮。
for(i=0;i<26;i++)
{
InitButton(&b,(PDARECT *)&CalcButtonRc[i],0);
if(i!=5&&i!=12)SetButtonStr(&b,(unsigned char *)CalcButtonStr[i],COLOR_HIGHGRAY);
else
{
SetButtonBmp(&b,(unsigned char *)(i==5?Image_Root:Image_Reciprocal),NULL);
}
DrawButton(&b,0);
}
//发送MSG_PAINT消息。
msg.type=MSG_PAINT;
SendMsg(&msg);
while(1)
{
GetMsg(&msg);
TranslateMsg(&msg);
/*热键ICON退出*/
if(msg.type>=80&&msg.type<90)return msg.type;
switch(msg.type)
{
case MSG_EXIT:return MSG_EXIT;/*退出消息*/
case MSG_LCD:/*位置消息*/
i=GetCalcButton(&msg);
if(i>=100)CalcInput(CalcButtonID[i-100]);
break;
case MSG_PAINT:/*绘制计算器显示屏图象*/
CalcShow();
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -