标题:
基于ucgui的计算器界面 含部分源码
[打印本页]
作者:
51hei学习技术中
时间:
2016-10-11 17:47
标题:
基于ucgui的计算器界面 含部分源码
0.png
(239.2 KB, 下载次数: 35)
下载附件
2016-10-11 17:46 上传
#include "stm32f10x.h"
#include <stdio.h>
#include "tsc2046.h"
#include "GUI.h"
#include "Time.h"
#include "WM.h"
#include "BUTTON.h"
#include "EDIT.h"
#include "FRAMEWIN.h"
#include <stddef.h>
#include <string.h>
#include "DIALOG.h"
#include <stdlib.h>
#include "Calculator.h"
#define GUI_ID_BUTTON10 GUI_ID_USER+1
#define GUI_ID_BUTTON11 GUI_ID_USER+2
#define GUI_ID_BUTTON12 GUI_ID_USER+3
#define GUI_ID_BUTTON13 GUI_ID_USER+4
#define GUI_ID_BUTTON14 GUI_ID_USER+5
#define GUI_ID_BUTTON15 GUI_ID_USER+6
#define GUI_ID_BUTTON16 GUI_ID_USER+7
#define GUI_ID_BUTTON17 GUI_ID_USER+8
#define GUI_ID_BUTTON18 GUI_ID_USER+9
#define GUI_ID_BUTTON19 GUI_ID_USER+10
char DisplayContent[100];
WM_HWIN CalculatorDlg;
void OperateLeftToRight(char *buf);
typedef struct{
double operate1; //第一个操作数
double operate2; //第二个操作数
double result; //操作结果
uint8_t operatenum; //当前操作数
#define ADD 0x01 //加法
#define SUB 0x02 //减法
#define MUL 0x04 //乘法
#define DIV 0x08 //除法
#define EQUAL 0x10 //等于
#define NUMBER 0x20 //数字
#define OPERATE 0x40 //运算符
#define DOT 0x80 //小数点
uint8_t pressedsymbol; //当前按下的符号
uint8_t IllegalExpression; //是否是合法的表达式
char keyval; //当前按下的按钮
uint8_t close;
}CALCULATE;
CALCULATE Calculate={
0,
0,
0,
0,
0,
0,
0,
0,
};
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ FRAMEWIN_CreateIndirect, "Calculator", 0, 0, 0, 240,320,FRAMEWIN_CF_ACTIVE,0},
{ BUTTON_CreateIndirect, "7", GUI_ID_BUTTON0, 10, 100, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "8", GUI_ID_BUTTON1, 65, 100, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "9", GUI_ID_BUTTON2, 120, 100, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "*", GUI_ID_BUTTON3, 175, 100, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "4", GUI_ID_BUTTON4, 10, 140, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "5", GUI_ID_BUTTON5, 65, 140, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "6", GUI_ID_BUTTON6, 120, 140, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "/", GUI_ID_BUTTON7, 175, 140, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "1", GUI_ID_BUTTON8, 10, 180, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "2", GUI_ID_BUTTON9, 65, 180, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "3", GUI_ID_BUTTON10, 120, 180, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "+", GUI_ID_BUTTON11, 175, 180, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "0", GUI_ID_BUTTON12, 10, 220, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "=", GUI_ID_BUTTON13, 65, 220, 45, 25, 0,0},
{ BUTTON_CreateIndirect, ".", GUI_ID_BUTTON14, 120, 220, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "-", GUI_ID_BUTTON15, 175, 220, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "Ac", GUI_ID_BUTTON16, 10,260,45, 25, 0,0},
{ BUTTON_CreateIndirect, "", GUI_ID_BUTTON17, 65, 260, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "", GUI_ID_BUTTON18, 120, 260, 45, 25, 0,0},
{ BUTTON_CreateIndirect, "", GUI_ID_BUTTON19, 175,260,45, 25, 0,0},
{ EDIT_CreateIndirect, 0, GUI_ID_EDIT0, 16, 3, 200,38, 0,0}
};
static void InitDialog(WM_MESSAGE * pMsg)
{
WM_HWIN hWin = pMsg->hWin;
//FRAMEWIN
FRAMEWIN_SetClientColor(hWin,GUI_GREEN);
FRAMEWIN_SetFont(hWin,&GUI_FontComic18B_1);
FRAMEWIN_SetTextAlign(hWin,GUI_TA_VCENTER|GUI_TA_CENTER);
FRAMEWIN_AddCloseButton(hWin,FRAMEWIN_BUTTON_RIGHT,10);
FRAMEWIN_SetTitleHeight(hWin,18);
//GUI_ID_BUTTON0
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),&GUI_FontComic24B_1);
//GUI_ID_BUTTON1
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON1),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON1),&GUI_FontComic24B_1);
//GUI_ID_BUTTON2
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON2),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON2),&GUI_FontComic24B_1);
//GUI_ID_BUTTON3
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON3),BUTTON_CI_UNPRESSED,GUI_RED);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON3),&GUI_FontComic24B_1);
//GUI_ID_BUTTON4
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON4),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON4),&GUI_FontComic24B_1);
//GUI_ID_BUTTON5
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON5),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON5),&GUI_FontComic24B_1);
//GUI_ID_BUTTON6
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON6),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON6),&GUI_FontComic24B_1);
//GUI_ID_BUTTON7
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON7),BUTTON_CI_UNPRESSED,GUI_RED);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON7),&GUI_FontComic24B_1);
//GUI_ID_BUTTON8
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON8),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON8),&GUI_FontComic24B_1);
//GUI_ID_BUTTON9
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON9),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON9),&GUI_FontComic24B_1);
//GUI_ID_BUTTON10
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON10),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON10),&GUI_FontComic24B_1);
//GUI_ID_BUTTON11
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON11),BUTTON_CI_UNPRESSED,GUI_RED);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON11),&GUI_FontComic24B_1);
//GUI_ID_BUTTON12
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON12),&GUI_FontComic24B_1);
//GUI_ID_BUTTON13
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON13),&GUI_FontComic24B_1);
//GUI_ID_BUTTON14
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),BUTTON_CI_UNPRESSED,GUI_CYAN);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON14),&GUI_FontComic24B_1);
//GUI_ID_BUTTON15
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),BUTTON_CI_UNPRESSED,GUI_RED);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON15),&GUI_FontComic24B_1);
//GUI_ID_BUTTON16
BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),BUTTON_CI_UNPRESSED,GUI_RED);
BUTTON_SetFont(WM_GetDialogItem(hWin,GUI_ID_BUTTON16),&GUI_FontComic24B_1);
//GUI_ID_EDIT0
EDIT_SetMaxLen(WM_GetDialogItem(hWin,GUI_ID_EDIT0),100);
EDIT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_EDIT0),EDIT_CI_ENABLED,GUI_WHITE);
EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT0),&GUI_FontComic18B_1);
EDIT_SetTextAlign(WM_GetDialogItem(hWin,GUI_ID_EDIT0),GUI_TA_VCENTER|GUI_TA_RIGHT);
EDIT_SetText(WM_GetDialogItem(hWin,GUI_ID_EDIT0),DisplayContent);
}
static void _cbCallback(WM_MESSAGE * pMsg)
{
uint16_t NCode, Id;
char str[8];
uint8_t i;
WM_HWIN hWin = pMsg->hWin;
switch (pMsg->MsgId)
{
case WM_DELETE:
Calculate.close=1;
break;
case WM_INIT_DIALOG:
InitDialog(pMsg);
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc); //控件的id
NCode = pMsg->Data.v; //通知代码
switch (Id)
{
case GUI_ID_OK:
if(NCode==WM_NOTIFICATION_RELEASED){
GUI_EndDialog(hWin, 0);
}
break;
case GUI_ID_CANCEL:
if(NCode==WM_NOTIFICATION_RELEASED){
GUI_EndDialog(hWin, 1);
}
break;
case GUI_ID_BUTTON0: // 7
if(NCode==WM_NOTIFICATION_RELEASED){
Calculate.keyval='7';
Calculate.pressedsymbol |= NUMBER;
}
break;
case GUI_ID_BUTTON1: // 8
if(NCode==WM_NOTIFICATION_RELEASED){
Calculate.keyval='8';
Calculate.pressedsymbol |= NUMBER;
}
break;
case GUI_ID_BUTTON2:// 9
if(NCode==WM_NOTIFICATION_RELEASED){
Calculate.keyval='9';
Calculate.pressedsymbol |= NUMBER;
}
break;
case GUI_ID_BUTTON4: // 4
if(NCode==WM_NOTIFICATION_RELEASED){
Calculate.keyval='4';
Calculate.pressedsymbol |= NUMBER;
}
break;
case GUI_ID_BUTTON5: //5
if(NCode==WM_NOTIFICATION_RELEASED){
Calculate.keyval='5';
Calculate.pressedsymbol |= NUMBER;
}
break;
case GUI_ID_BUTTON6:// 6
if(NCode==WM_NOTIFICATION_RELEASED){
Calculate.keyval='6';
Calculate.pressedsymbol |= NUMBER;
}
break;
case GUI_ID_BUTTON8://1
if(NCode==WM_NOTIFICATION_RELEASED){
Calculate.keyval='1';
Calculate.pressedsymbol |= NUMBER;
}
break;
case GUI_ID_BUTTON9://2
if(NCode==WM_NOTIFICATION_RELEASED){
Calculate.keyval='2';
Calculate.pressedsymbol |= NUMBER;
}
break;
case GUI_ID_BUTTON10://3
if(NCode==WM_NOTIFICATION_RELEASED){
Calculate.keyval='3';
Calculate.pressedsymbol |= NUMBER;
}
break;
case GUI_ID_BUTTON12://0
if(NCode==WM_NOTIFICATION_RELEASED){
Calculate.keyval='0';
Calculate.pressedsymbol |= NUMBER;
}
break;
case GUI_ID_BUTTON14:// .
if(NCode==WM_NOTIFICATION_RELEASED){
if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&DOT)!=DOT){
Calculate.keyval='.';
Calculate.pressedsymbol |= DOT;
Calculate.pressedsymbol &= ~NUMBER;
strcat(DisplayContent,&Calculate.keyval);
EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
Calculate.keyval=0;
}
}
break;
case GUI_ID_BUTTON7:// /
if(NCode==WM_NOTIFICATION_RELEASED){
if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
Calculate.keyval='/';
Calculate.pressedsymbol |= OPERATE;
Calculate.pressedsymbol &= ~NUMBER;
Calculate.pressedsymbol &= ~DOT; //接下来可以输入小数点
strcat(DisplayContent,&Calculate.keyval);
EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
Calculate.keyval=0;
}
}
break;
case GUI_ID_BUTTON3:// *
if(NCode==WM_NOTIFICATION_RELEASED){
if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
Calculate.keyval='*';
Calculate.pressedsymbol |= OPERATE;
Calculate.pressedsymbol &= ~NUMBER;
Calculate.pressedsymbol &= ~DOT; //接下来可以输入小数点
strcat(DisplayContent,&Calculate.keyval);
EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
Calculate.keyval=0;
}
}
break;
case GUI_ID_BUTTON15:// -
if(NCode==WM_NOTIFICATION_RELEASED){
if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
Calculate.keyval='-';
Calculate.pressedsymbol |= OPERATE;
Calculate.pressedsymbol &= ~NUMBER;
Calculate.pressedsymbol &= ~DOT; //接下来可以输入小数点
strcat(DisplayContent,&Calculate.keyval);
EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
Calculate.keyval=0;
}
}
break;
case GUI_ID_BUTTON11:// +
if(NCode==WM_NOTIFICATION_RELEASED){
if((Calculate.pressedsymbol&NUMBER)==NUMBER&&(Calculate.pressedsymbol&OPERATE)!=OPERATE){
Calculate.keyval='+';
Calculate.pressedsymbol |= OPERATE;
Calculate.pressedsymbol &= ~NUMBER;
Calculate.pressedsymbol &= ~DOT; //接下来可以输入小数点
strcat(DisplayContent,&Calculate.keyval);
EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
Calculate.keyval=0;
}
}
break;
case GUI_ID_BUTTON16:// c
if(NCode==WM_NOTIFICATION_RELEASED){
strcpy(DisplayContent,"");
Calculate.result=0;
EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
Calculate.pressedsymbol &= ~NUMBER;
Calculate.keyval=0;
}
break;
case GUI_ID_BUTTON13:// =
if(NCode==WM_NOTIFICATION_RELEASED)
{
if(strlen(DisplayContent)>0)
{
OperateLeftToRight(DisplayContent);
if((Calculate.result-(uint16_t)Calculate.result)!=0)
{
strcpy(DisplayContent,"");
sprintf(DisplayContent,"%d",(uint16_t)Calculate.result);
strcat(DisplayContent,".");
sprintf(str,"%d",(uint16_t)((Calculate.result-(uint16_t)Calculate.result)*100000));
strcat(DisplayContent,str);
for(i=strlen(DisplayContent)-1;i>=0;i--) //将小数点后多余的0去掉
{
if(DisplayContent[i]!='0')
{
DisplayContent[i+1]='\0';
break;
}
}
}
else
{
strcpy(DisplayContent,"");
sprintf(DisplayContent,"%d",(uint16_t)Calculate.result);
}
EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
Calculate.pressedsymbol &= ~DOT; //接下来可以输入小数点
Calculate.keyval=0;
}
}
break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
void Operate(double numb1,double numb2,char symbol)
{
switch(symbol)
{
case '+':
numb1 += numb2;
Calculate.result=numb1;
//printf("Calculate.result:%f\r\n",result);
break;
case '-':
numb1 -= numb2;
Calculate.result=numb1;
//printf("Calculate.result:%f\r\n",result);
break;
case '*':
numb1 *= numb2;
Calculate.result=numb1;
//printf("Calculate.result:%f\r\n",result);
break;
case '/':
if(numb2==0)
{
Calculate.IllegalExpression = 1;
}else
{
numb1 = (double)numb1/(double)numb2;
Calculate.result=numb1;
//printf("Calculate.result:%f\r\n",result);
}
break;
default:
break;
}
}
/*
***************************************************************
*函数名:IsOperator
*功能: 判断此字符是不是运算符
*参数:
*返回值:0:是 1:不是
****************************************************************
*/
static uint8_t IsOperator(char opt)
{
if(opt=='+'||opt=='-'||opt=='*'||opt=='/')
{
return 0;
}
return 1;
}
/*
***************************************************************
*函数名:OperateLeftToRight
*功能: 从左到右计算表达式,不考虑优先级 输入的表达式必须合法
*参数:
*返回值:
****************************************************************
*/
void OperateLeftToRight(char *buf)
{
char Operatesym;
double tmpnum1=1,tmpnum2=1,output1=0,output2=0;
uint8_t i=0;
//temp = (char*)mem_malloc(100);
while(*buf)
{
if(!IsOperator(*buf)) //判断是不是运算符
{
i++;
Operatesym = *buf; //得到操作符
buf++;
}
else
{
if(i==0) //第一个操作数
{
while(*buf>='0' && *buf<='9')
output1=output1*10+(*buf++)-'0'; //整数部分
if(*buf=='.')
{
buf++;
while(*buf>='0' && *buf<='9') //*str 是数字
{
tmpnum1/=10;
output1=output1+((*buf++)-'0')*tmpnum1;//小数部分
}
}
}
if(i==1) //第二个操作数
{
i=0;
while(*buf>='0' && *buf<='9')
output2=output2*10+(*buf++)-'0'; //整数部分
if(*buf=='.')
{
buf++;
while(*buf>='0' && *buf<='9') //*str 是数字
{
tmpnum2/=10;
output2=output2+((*buf++)-'0')*tmpnum2;//小数部分
}
}
}
}//else
}//while
Operate(output1,output2,Operatesym);
//mem_free(temp);
}
/*
***************************************************************
*函数名:Calculator
*功能: 计算器功能
*参数: 无
*返回值:无
****************************************************************
*/
void Calculator(void)
{
strcpy(DisplayContent,"");
//WM_SetCreateFlags(WM_CF_MEMDEV); ////后面加的
CalculatorDlg = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback,0, 0, 0);
while(1){
if((Calculate.pressedsymbol&NUMBER)==NUMBER)
{
strcat(DisplayContent,&Calculate.keyval);
EDIT_SetText(WM_GetDialogItem(CalculatorDlg,GUI_ID_EDIT0),DisplayContent);
Calculate.keyval=0;
Calculate.pressedsymbol &= ~OPERATE;
}
if(Calculate.close){
Calculate.close = 0;
break;
}
GUI_Delay(10);
}
}
复制代码
作者:
wbx2017
时间:
2019-10-12 21:20
骗积分的吧,整个就一个c文件。差评
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1