初学MFC之(一)计算器源代码


// CalculatorDlg.h : 头文件
//
#pragma once


// CCalculatorDlg 对话框
class CCalculatorDlg : public CDialogEx
{
// 构造
public:
CCalculatorDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
enum { IDD = IDD_CALCULATOR_DIALOG };
void GetStr(CString);
void CalStr();

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持


// 实现
protected:
HICON m_hIcon;

// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnEnter();
afx_msg void OnB1();
CString m_strAns;
afx_msg void OnB2();
afx_msg void OnB3();
afx_msg void OnB4();
afx_msg void OnB5();
afx_msg void OnB6();
afx_msg void OnB7();
afx_msg void OnB8();
afx_msg void OnB9();
afx_msg void OnB0();
CString m_strFun;
afx_msg void OnBdot();
afx_msg void OnBdevide();
afx_msg void OnBnClickedBc();
afx_msg void OnBadd();
afx_msg void OnBcut();
afx_msg void OnBride();
afx_msg void OnBback();
afx_msg void OnBaddcut();
afx_msg void OnBce();
afx_msg void OnBpercent();
afx_msg void OnBcontrary();
afx_msg void OnBsqr();
afx_msg void OnBnClickedBmr();
afx_msg void OnBnClickedBms();
afx_msg void OnBnClickedBmc();
afx_msg void OnBnClickedBmadd();
afx_msg void OnBnClickedBmcut();
CString m_M;
};

 

 


// CalculatorDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "Calculator.h"
#include "CalculatorDlg.h"
#include "afxdialogex.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

bool gotDot = false; //按.标志
bool gotNum = false; //按数字标志
bool gotZero = false; //按0标志
bool optPsd = false; //按下计算符号标志
bool gotEtr = false; //按下=键标志
bool gotM = false; //得到存储器
bool flg = false; //计算时赋值t的判断符号
char b[10]; //数据处理存储数组
double a[20];
int max = 0;
double memory = 0;


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
public:
};


CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CCalculatorDlg 对话框

 


CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CCalculatorDlg::IDD, pParent)
, m_strAns(_T(""))
, m_strFun(_T(""))
, m_M(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CCalculatorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDITANS, m_strAns);
DDX_Text(pDX, IDC_EDITDSP, m_strFun);
DDX_Text(pDX, IDC_EDITM, m_M);
}

BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BENTER, &CCalculatorDlg::OnEnter)
ON_BN_CLICKED(IDC_B1, &CCalculatorDlg::OnB1)
ON_BN_CLICKED(IDC_B2, &CCalculatorDlg::OnB2)
ON_BN_CLICKED(IDC_B3, &CCalculatorDlg::OnB3)
ON_BN_CLICKED(IDC_B4, &CCalculatorDlg::OnB4)
ON_BN_CLICKED(IDC_B5, &CCalculatorDlg::OnB5)
ON_BN_CLICKED(IDC_B6, &CCalculatorDlg::OnB6)
ON_BN_CLICKED(IDC_B7, &CCalculatorDlg::OnB7)
ON_BN_CLICKED(IDC_B8, &CCalculatorDlg::OnB8)
ON_BN_CLICKED(IDC_B9, &CCalculatorDlg::OnB9)
ON_BN_CLICKED(IDC_B10, &CCalculatorDlg::OnB0)
ON_BN_CLICKED(IDC_BDOT, &CCalculatorDlg::OnBdot)
ON_BN_CLICKED(IDC_BDEVIDE, &CCalculatorDlg::OnBdevide)
ON_BN_CLICKED(IDC_BC, &CCalculatorDlg::OnBnClickedBc)
ON_BN_CLICKED(IDC_BADD, &CCalculatorDlg::OnBadd)
ON_BN_CLICKED(IDC_BCUT, &CCalculatorDlg::OnBcut)
ON_BN_CLICKED(IDC_BRIDE, &CCalculatorDlg::OnBride)
ON_BN_CLICKED(IDC_BBACK, &CCalculatorDlg::OnBback)
ON_BN_CLICKED(IDC_BADDCUT, &CCalculatorDlg::OnBaddcut)
ON_BN_CLICKED(IDC_BCE, &CCalculatorDlg::OnBce)
ON_BN_CLICKED(IDC_BPERCENT, &CCalculatorDlg::OnBpercent)
ON_BN_CLICKED(IDC_BCONTRARY, &CCalculatorDlg::OnBcontrary)
ON_BN_CLICKED(IDC_BSQR, &CCalculatorDlg::OnBsqr)
ON_BN_CLICKED(IDC_BMR, &CCalculatorDlg::OnBnClickedBmr)
ON_BN_CLICKED(IDC_BMS, &CCalculatorDlg::OnBnClickedBms)
ON_BN_CLICKED(IDC_BMC, &CCalculatorDlg::OnBnClickedBmc)
ON_BN_CLICKED(IDC_BMADD, &CCalculatorDlg::OnBnClickedBmadd)
ON_BN_CLICKED(IDC_BMCUT, &CCalculatorDlg::OnBnClickedBmcut)
END_MESSAGE_MAP()


// CCalculatorDlg 消息处理程序

BOOL CCalculatorDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码
//GetDlgItem(IDC_EDITANS)->EnableWindow(false);

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void CCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}


void CCalculatorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CCalculatorDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}


void CCalculatorDlg::OnB1()
{

if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "1";
}else{
m_strAns += "1";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}


void CCalculatorDlg::OnB2()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "2";
}else{
m_strAns += "2";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}


void CCalculatorDlg::OnB3()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "3";
}else{
m_strAns += "3";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}


void CCalculatorDlg::OnB4()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "4";
}else{
m_strAns += "4";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}


void CCalculatorDlg::OnB5()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "5";
}else{
m_strAns += "5";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}


void CCalculatorDlg::OnB6()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "6";
}else{
m_strAns += "6";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}


void CCalculatorDlg::OnB7()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "7";
}else{
m_strAns += "7";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}


void CCalculatorDlg::OnB8()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "8";
}else{
m_strAns += "8";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}


void CCalculatorDlg::OnB9()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns = "9";
}else{
m_strAns += "9";
}
UpdateData(FALSE);
gotNum =true;
optPsd = false;
}


void CCalculatorDlg::OnB0()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
gotZero = true;
if(true == gotNum)
{
m_strAns += "0";
}
else
{
m_strAns = "0";
}
UpdateData(FALSE);
optPsd = false;
}

 

void CCalculatorDlg::OnBdot()
{
if(true == gotEtr || true == gotM)
{
m_strAns = "";
UpdateData(FALSE);
gotEtr = false;
gotM = false;
}
if(false ==gotNum && true == gotZero)
{
m_strAns += "0.";
}
else if(gotDot==false)
{
m_strAns += ".";
}
UpdateData(FALSE);
gotNum = true;
gotDot = true;
optPsd = false;
}


void CCalculatorDlg::OnBadd() //加法
{
if(false==optPsd)
{
m_strFun += m_strAns;
m_strFun += "+";
m_strAns = "";
UpdateData(FALSE);
}
UpdateData(TRUE);
int n = 0;
n = m_strFun.GetLength();
n--;
if(m_strFun.GetAt(n) == '-' ||m_strFun.GetAt(n) == '*'||m_strFun.GetAt(n) == '/')
{ //最后一个字符不是数字,可以二次修改运算符
m_strFun.Delete(n);
m_strFun += "+";
UpdateData(FALSE);
}
optPsd = true;
gotNum = false;
gotDot = false;
}


void CCalculatorDlg::OnBcut() //减法
{

if(false==optPsd) //不能连续按两个字符
{
m_strFun += m_strAns;
m_strFun += "-";
m_strAns = "";
UpdateData(FALSE);

}
UpdateData(TRUE);
int n = 0;
n = m_strFun.GetLength();
n--;
if(m_strFun.GetAt(n) == '+' ||m_strFun.GetAt(n) == '*'||m_strFun.GetAt(n) == '/')
{ //最后一个字符不是数字,可以二次修改运算符
m_strFun.Delete(n);
m_strFun += "-";
UpdateData(FALSE);
}

optPsd = true;
gotNum = false;
gotDot = false;
}


void CCalculatorDlg::OnBride() //乘法
{

if(false==optPsd)
{
m_strFun += m_strAns;
m_strFun += "*";
m_strAns = "";
UpdateData(FALSE);
}
UpdateData(TRUE);
int n = 0;
n = m_strFun.GetLength();
n--;
if(m_strFun.GetAt(n) == '+' ||m_strFun.GetAt(n) == '-'||m_strFun.GetAt(n) == '/')
{ //最后一个字符不是数字,可以二次修改运算符
m_strFun.Delete(n);
m_strFun += "*";
UpdateData(FALSE);
}
optPsd = true;
gotNum = false;
gotDot = false;
}


void CCalculatorDlg::OnBdevide() //除法
{
if(false==optPsd)
{
m_strFun += m_strAns;
m_strFun += "/";
m_strAns = "";
UpdateData(FALSE);
}
UpdateData(TRUE);
int n = 0;
n = m_strFun.GetLength();
n--;
if(m_strFun.GetAt(n) == '+' ||m_strFun.GetAt(n) == '*'||m_strFun.GetAt(n) == '-')
{ //最后一个字符不是数字,可以二次修改运算符
m_strFun.Delete(n);
m_strFun += "/";
UpdateData(FALSE);
}
optPsd = true;
gotNum = false;
gotDot = false;
}

 

void CCalculatorDlg::OnBnClickedBc() //清屏(全部)
{
m_strFun = "";
m_strAns = "";
UpdateData(FALSE);
gotDot = false;
gotNum = false;
gotZero = false;
optPsd = false;
gotEtr = false; //按下=键标志
bool gotM = false;
bool flg = false; //计算时赋值t的判断符号
max = 0;
}


void CCalculatorDlg::OnBback() //回删
{
int n= 0;
if(m_strAns != "")
{
n = m_strAns.GetLength()-1;
if('.' == m_strAns.GetAt(n)) //释放点控制标志
{
gotDot = false;
}

m_strAns.Delete(n);
UpdateData(FALSE);
}
}


void CCalculatorDlg::OnBaddcut() // 符号取反
{
UpdateData(TRUE);
if(m_strAns!="")
{
int n;
n = m_strAns.Find(_T("-")); //查找是否有-
if(n!=-1)
{
m_strAns.Delete(0);
}else
{
m_strAns = _T("-") + m_strAns;
}
UpdateData(FALSE);
}

}


void CCalculatorDlg::OnBce() //清屏(输入)
{
m_strAns = "";
gotDot = false;
gotNum = false;
gotZero = false;
optPsd = false;
gotEtr = false; //按下=键标志
bool gotM = false;
max = 0;
UpdateData(FALSE);
}


void CCalculatorDlg::OnBpercent() //求百分比
{
UpdateData(TRUE);
double a = 0;
a = _ttoi(m_strAns);
a *= 0.01;
m_strAns.Format(_T("%lf"),a);
int m = m_strAns.GetLength()-1; //最大位置
int n = m_strAns.Find(_T('.'));//小数点位置

while('0' == m_strAns.GetAt(m)) //m处为零
{
m_strAns.Delete(m);
m--;
}
m = m_strAns.GetLength()-1; //最大位置
if('.' == m_strAns.GetAt(m))
{
m_strAns.Delete(m);
}
UpdateData(FALSE);

}


void CCalculatorDlg::OnBcontrary() //求倒数
{
UpdateData(TRUE);
double a = 0;
a = _ttoi(m_strAns);
a = 1 / a;
m_strAns.Format(_T("%lf"),a);
int m = m_strAns.GetLength()-1; //最大位置
int n = m_strAns.Find(_T('.'));//小数点位置

while('0' == m_strAns.GetAt(m)) //m处为零
{
m_strAns.Delete(m);
m--;
}
m = m_strAns.GetLength()-1; //最大位置
if('.' == m_strAns.GetAt(m))
{
m_strAns.Delete(m);
}
UpdateData(FALSE);
}


void CCalculatorDlg::OnBsqr() //开平方根
{
UpdateData(TRUE);
double a = 1;
a = _ttoi(m_strAns);
a = sqrt(a);
m_strAns.Format(_T("%lf"),a);
int m = m_strAns.GetLength()-1; //最大位置
int n = m_strAns.Find(_T('.'));//小数点位置

while('0' == m_strAns.GetAt(m)) //m处为零
{
m_strAns.Delete(m);
m--;
}
m = m_strAns.GetLength()-1; //最大位置
if('.' == m_strAns.GetAt(m))
{
m_strAns.Delete(m);
}
UpdateData(FALSE);
}


void CCalculatorDlg::OnEnter() //计算并得值
{
int m,n = 0;
UpdateData(TRUE);
m_strFun += m_strAns;
GetStr(m_strFun);
CalStr();
m_strAns.Format(_T("%lf"),a[0]);

if(m_strFun.Find(_T("/0")) != -1)
{
m_strAns = "除数不能为零";
m_strFun = "";
UpdateData(FALSE);
}else
{
m_strAns.Format(_T("%lf"),a[0]);

m = m_strAns.GetLength()-1; //最大位置
n = m_strAns.Find(_T('.'));//小数点位置

while('0' == m_strAns.GetAt(m)) //m处为零
{
m_strAns.Delete(m);
m--;
}
m = m_strAns.GetLength()-1; //最大位置
if('.' == m_strAns.GetAt(m))
{
m_strAns.Delete(m);
}

m_strFun = "";
UpdateData(FALSE);
}
gotDot = false; //按.标志
gotNum = false; //按数字标志
gotZero = false; //按0标志
optPsd = false; //按下运算符号标志
gotEtr = true;
flg = false; //计算时赋值t的判断符号
}


void CCalculatorDlg::GetStr(CString str) //处理字符串
{
int i=0,p=0;
double rate = 10.0,item = 0.0;
for(i=0;i<20;i++) //初始化
{
a[i] = 1000000.0;
}
for(i=0;i<10;i++) //初始化
{
b[i] = ' ';
}
i = 0;
for(;i<str.GetLength();i++)//得到操作数
{
if(isdigit(str.GetAt(i)))
{
if(rate==10.0)
{item = item*rate+(str.GetAt(i)-'0');} //取得整数
else
{
item = item+rate*(str.GetAt(i)-'0'); //小数部分
rate = rate/10;
}
}
else if(str.GetAt(i)=='.') //遇点
{
rate = 0.1;
}
else if(str.GetAt(i)=='+') //遇+
{
a[p] = item;
item = 0;
p++;
b[p] = '+';
p++;
rate = 10.0;
}
else if(str.GetAt(i)=='-') //遇-
{
a[p] = item;
item = 0;
p++;
b[p] = '-';
p++;
rate = 10.0;
}
else if(str.GetAt(i)=='*') //遇*
{
a[p] = item;
item = 0;
p++;
b[p] = '*';
p++;
rate = 10.0;
}
else if(str.GetAt(i)=='/') //遇/
{
a[p] = item;
item = 0;
p++;
b[p] = '/';
p++;
rate = 10.0;
}
}
a[p] = item;//把最后一个item赋值
max = p;//获得操作总数
}


void CCalculatorDlg::CalStr() //计算所得值存入a[0]
{

int i = 0,x = 0, y = 1,t = 1,p = 1;
for(i=0;i<=max;i++)
{
if('/' == b[i])//把除操作化成乘,简化
{
b[i] = '*';
a[i+1] = 1 / a[i+1];
}
}

for(i=0;i<=max;i++)
{
if('*' == b[i])//操作乘法
{
if(2 == i-t && flg == true)//处理连乘,再次相乘赋值在最前个数据位置
{
a[t-p] = a[t-p]*a[i+1];
p += 2;
}else{
a[i-1] = a[i-1]*a[i+1];
}
a[i+1] = 1000000.0; //乘号后数字初始化
b[i] = ' '; //乘号设为初始化
t = i;
flg = true;
}
}

for(i=0;i<=max;i++) //为计算加减做准备
{
if(1000000.0 != a[i])
{
a[x] = a[i];
x += 2;
}
if(' ' != b[i])
{
b[y] = b[i];
y += 2;
}
}

for(i=0;i<=y-2;i++)
{
if('+'== b[i])
{
a[0] = a[0]+a[i+1];
}else if('-'== b[i]){
a[0] = a[0]-a[i+1];
}
}
}


void CCalculatorDlg::OnBnClickedBmr() //读取存储器值
{
m_M = "M";
m_strAns.Format(_T("%lf"),memory);
int m = m_strAns.GetLength()-1; //最大位置
int n = m_strAns.Find(_T('.'));//小数点位置

while('0' == m_strAns.GetAt(m)) //m处为零
{
m_strAns.Delete(m);
m--;
}
m = m_strAns.GetLength()-1; //最大位置
if('.' == m_strAns.GetAt(m))
{
m_strAns.Delete(m);
}
UpdateData(FALSE);
gotM = true;
}


void CCalculatorDlg::OnBnClickedBms() //设置存储器
{
UpdateData(TRUE);
if("" != m_strAns){
m_M = "M";
memory = _ttoi(m_strAns);
UpdateData(FALSE);
gotM = true;
}
}


void CCalculatorDlg::OnBnClickedBmc() //存储器清除
{
UpdateData(TRUE);
m_M = "";;
memory = 0;
UpdateData(FALSE);
gotM = true;

}

 


void CCalculatorDlg::OnBnClickedBmadd() //M+
{
UpdateData(TRUE);
if(false == gotM){
m_M = "M";;
memory += _ttoi(m_strAns);
UpdateData(FALSE);
gotM = true;
}
}


void CCalculatorDlg::OnBnClickedBmcut() //M-
{
UpdateData(TRUE);
if(false == gotM){
m_M = "M";;
memory -= _ttoi(m_strAns);
UpdateData(FALSE);
gotM = true;
}
}

 

posted @ 2013-07-22 10:39  YUAN园  阅读(8631)  评论(1编辑  收藏  举报