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、付费专栏及课程。

余额充值