vc API 计算器

篇幅有限,这里只列出了部分代码,去掉了重复部分,如果想要完整的代码,请参考

csdn:http://download.youkuaiyun.com/source/3448966资源。

作者:林子木

水平有限,以下代码,仅供参考,个人QQ:356342556 如想交流,验证信息:林子木

#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include "Resource.h"
#include "MainDlg.h"
#include"math.h"

double flag = 0;
int flag_sign = 0; //当前按下的运算符号
double N = 10;
double n = 0;//保存输入的值
double result = 0; //算式结果
int key = 0;//保存前一个运算符号
TCHAR num[256]; //保存计算的值
TCHAR snum[256]; //保存计算的式子
TCHAR pnum[256]; //中间变量

void dtostr(TCHAR srt[],double n);//double 至 str
void Main_Equal (HWND hwnd); //显示函数

BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
}

return FALSE;
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
return TRUE;
}

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{

switch(id)
{

case IDC_0:// num 0
{
if(flag_sign == 0) //如果是第一数,那么就在下一行
{
wsprintf(num,"%s%s",num,"0");//将按一个0,就以字符串的形式,添加一个0进去
wsprintf(pnum,"\r\n%s",num); // 注意此处如果想换行,必须Edit control 开启换行功能 而且\r\n 才能换行
SetDlgItemText(hwnd,IDC_DISPLAY, pnum);//将pnum 显示在 IDC_DISPLAY 框中
}
else//不是第一个数,将前面的算式也打印出来
{

wsprintf(num,"%s%s",num,"0");
wsprintf(pnum,"%s\r\n%s",snum,num); //将前面的算式式子也显示
SetDlgItemText(hwnd,IDC_DISPLAY, pnum);
}

}
break;

case IDC_POINT: //point
{
n =strtod(num,NULL);
if(n == 0)//如果前面的n是零的情况
{
wsprintf(num,"%s","0.");
wsprintf(pnum,"%s\r\n%s",snum,num);
SetDlgItemText(hwnd,IDC_DISPLAY, pnum);
}
else
{

wsprintf(num,"%s%s",num,"."); //n为非零的情况
wsprintf(pnum,"%s\r\n%s",snum,num);
SetDlgItemText(hwnd,IDC_DISPLAY, pnum);
}

}
break;
case IDC_CE://清除所有
{
n = 0;
wsprintf(num,"%s","\0");
wsprintf(snum,"%s","\0");
wsprintf(pnum,"%s","\0");
flag = 0;
flag_sign = 0;
result = 0;
SetDlgItemText(hwnd,IDC_DISPLAY, num);

}
break;
case IDC_C: //清除所有
{
n = 0;
wsprintf(num,"%s","\0");
wsprintf(snum,"%s","\0");
wsprintf(pnum,"%s","\0");
flag = 0;
flag_sign = 0;
result = 0;
SetDlgItemText(hwnd,IDC_DISPLAY, num);

}
break;
case IDC_BACKSPACE: //退位标志
{
n =strtod(num,NULL);
n=(int)(n/10);
if(n==0)
wsprintf(num,"%s","\0");
else
dtostr(num,n);
wsprintf(pnum,"%s\r\n%s",snum,num);
SetDlgItemText(hwnd,IDC_DISPLAY,pnum);
}
break;
case IDC_JIA:// add 加法函数
{
wsprintf(snum,"%s%s +",snum,num); //在输入值后带上加法
SetDlgItemText(hwnd,IDC_DISPLAY, snum); //打印
n = strtod(num,NULL); // 将如入的值转换为 double型保存在 n中
wsprintf(num,"%s","\0");//将 num 清零
flag_sign = 1;//flag_sign 加法为1 减法为 2 乘法为3 除法为4
Main_Equal (hwnd);//调用显示函数

}
break;

case IDC_EQUAL://等号
{
wsprintf(snum,"%s%s",snum,num);
SetDlgItemText(hwnd,IDC_DISPLAY, snum);
n = strtod(num,NULL);
wsprintf(num,"%s","\0");
flag_sign = 0;
Main_Equal (hwnd);
n = 0;
wsprintf(num,"%s","\0");
wsprintf(snum,"%s","\0");
wsprintf(pnum,"%s","\0");
flag = 0;
flag_sign = 0;
MessageBox(hwnd,TEXT("算式到此已经没有了,像=后在加减乘除没有编辑"),TEXT("温馨提示"),MB_OK);
}
break;
case IDC_GENHAO:
{
MessageBox(hwnd,TEXT("根号,%,倒数,符号未定义"),TEXT("温馨提示"),MB_OK);
}
break;
case IDC_BAIFENHAO:
{
MessageBox(hwnd,TEXT("根号,%,倒数,符号未定义"),TEXT("温馨提示"),MB_OK);
}
break;
case IDC_DAOSHU:
{
MessageBox(hwnd,TEXT("根号,%,倒数,符号未定义"),TEXT("温馨提示"),MB_OK);
}
break;
case IDC_NEGTIVE:
{
MessageBox(hwnd,TEXT("根号,%,倒数,符号未定义"),TEXT("温馨提示"),MB_OK);
}
break;
default:
break;
}
}

void Main_OnClose(HWND hwnd)
{
EndDialog(hwnd, 0);
}

void Main_Equal (HWND hwnd)
{
switch (key)
{
case 0: //等号显示
{
result = n;
n = 0;
dtostr(num,result);
wsprintf(pnum,"%s\r\n%s",snum,num);
SetDlgItemText(hwnd,IDC_DISPLAY,pnum);
wsprintf(num,"%s ","\0");
key = flag_sign ;

}
break;

case 1: //加法显示
{

result += n;
n = 0;
dtostr(num,result); //将 结果转化为 字符串
wsprintf(pnum,"%s\r\n%s",snum,num); //将snum 和 num 保存在 pnum中
SetDlgItemText(hwnd,IDC_DISPLAY,pnum); //打印pnum
wsprintf(num,"%s ","\0");//清零 num
key = flag_sign ;//更新操作 现在的操作是前一个 运算符 当前按下的 + 将在下一次按下运算符号或者 = 时执行

}
break;

default:
break;
}

}

void dtostr(TCHAR srt[],double n1) //double 至 str
{
int Num; //整数部分
int Point; //小数部分
char a1[256];
char a2[256];
Num = (int)n1;
Point = (int)((n1-Num+0.0000001)*pow(10.0,6)); //这里到小数点后面六位 +0.0000001 是因为 strtod 函数转化精度的问题
while(Point % 10==0&&Point>0)
{
Point /= 10;//将小数中后面的零去掉
}
itoa(Num,a1,10);
itoa(Point,a2,10);
if(Point>0)
wsprintf(srt,"%s%s%s",a1,".",a2); //打印
else
wsprintf(srt,"%s",a1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值