void CCCalculatorDlg::OnNum(UINT uID)
{
UINT index=uID- IDC_NUM_0;
CString num;
CString str;
num.Format(_T("%d"),index);
//AfxMessageBox(num);//弹出对话框提醒
switch(st)
{
case _CE:
str=num;
m_ctlDisplay.SetWindowText(str);
st=_A;
break;
case _A:
m_ctlDisplay.GetWindowText(str);
str+=num;
m_ctlDisplay.SetWindowText(str);
break;
case _B:
str=num;
m_ctlDisplay.SetWindowText(str);
st=_C;
break;
case _C:
m_ctlDisplay.GetWindowText(str);
str+=num;
m_ctlDisplay.SetWindowText(str);
break;
case _D:
str=num;
m_ctlDisplay.SetWindowText(str);
st=_A;
break;
default:;
}
}
double CCCalculatorDlg::GetCurrentNum()
{ double num=0;
CString str;
m_ctlDisplay.GetWindowText(str);
num=atof(str);
return num;
}//获得当前显示的数字void CCCalculatorDlg::DisplayNum(double d)
{
CString str;
str.Format(_T("%f"),d);
m_ctlDisplay.SetWindowText(str);}//显示数字
void CCCalculatorDlg:: Clear()
{ op=None;
st=_CE;
m_dCurrentNum=m_dPreNum=0;
}
void CCCalculatorDlg::OnOperator(_operator_ _op)
{
switch(st){
case _A:
op=_op;
m_dPreNum=GetCurrentNum();
st=_B;
break;
case _C:
m_dCurrentNum=GetCurrentNum();
m_dPreNum=GetValue(m_dPreNum,m_dCurrentNum);
DisplayNum(m_dPreNum);
op=_op;
st=_B;
break;
case _D:
st=_B;
m_dPreNum=GetCurrentNum();
op=_op;
break;
default:;
}
}
double CCCalculatorDlg::GetValue(double m,double n)
{ double dr=0;
double br=m;
double cr=1/m;//求第一个操作数的倒数用来求x^y
int i;
switch(op)
{
case Add:
dr=m+n;
break;
case Multi:
dr=m*n;
break;
case Minus:
dr=m-n;
break;
case Div:
if(n==0.0)
{
AfxMessageBox(_T("分母不能为0!"));
OnCe();
}
else
{
dr=m/n;
}
break;
case Mod:
dr=(int)m%(int)n;//这里简单起见,转换为整数求余数
break;
case Exp:
if(n>=0)//n为正数
for(i=0;i<n;i++)
{
br=br*10;//乘以10的n次幂
}
else//n为负数
{ n=-n;
for(i=0;i<n;i++)
{
br=br*0.1;//乘以0.1的n次幂
}
}
dr=br;
break;
case SQUAR:
if(n>=0)
for (i=0;i<n-1;i++)
{
br=br*m;
}
else
{ br=1/br;
n=-n;
for(i=0;i<n-1;i++)
{
br=br*cr;//乘以0.1的n次幂
}
} dr=br;
break;
default:;
}
return dr; }
{
UINT index=uID- IDC_NUM_0;
CString num;
CString str;
num.Format(_T("%d"),index);
//AfxMessageBox(num);//弹出对话框提醒
switch(st)
{
case _CE:
str=num;
m_ctlDisplay.SetWindowText(str);
st=_A;
break;
case _A:
m_ctlDisplay.GetWindowText(str);
str+=num;
m_ctlDisplay.SetWindowText(str);
break;
case _B:
str=num;
m_ctlDisplay.SetWindowText(str);
st=_C;
break;
case _C:
m_ctlDisplay.GetWindowText(str);
str+=num;
m_ctlDisplay.SetWindowText(str);
break;
case _D:
str=num;
m_ctlDisplay.SetWindowText(str);
st=_A;
break;
default:;
}
}
double CCCalculatorDlg::GetCurrentNum()
{ double num=0;
CString str;
m_ctlDisplay.GetWindowText(str);
num=atof(str);
return num;
}//获得当前显示的数字void CCCalculatorDlg::DisplayNum(double d)
{
CString str;
str.Format(_T("%f"),d);
m_ctlDisplay.SetWindowText(str);}//显示数字
void CCCalculatorDlg:: Clear()
{ op=None;
st=_CE;
m_dCurrentNum=m_dPreNum=0;
}
void CCCalculatorDlg::OnOperator(_operator_ _op)
{
switch(st){
case _A:
op=_op;
m_dPreNum=GetCurrentNum();
st=_B;
break;
case _C:
m_dCurrentNum=GetCurrentNum();
m_dPreNum=GetValue(m_dPreNum,m_dCurrentNum);
DisplayNum(m_dPreNum);
op=_op;
st=_B;
break;
case _D:
st=_B;
m_dPreNum=GetCurrentNum();
op=_op;
break;
default:;
}
}
double CCCalculatorDlg::GetValue(double m,double n)
{ double dr=0;
double br=m;
double cr=1/m;//求第一个操作数的倒数用来求x^y
int i;
switch(op)
{
case Add:
dr=m+n;
break;
case Multi:
dr=m*n;
break;
case Minus:
dr=m-n;
break;
case Div:
if(n==0.0)
{
AfxMessageBox(_T("分母不能为0!"));
OnCe();
}
else
{
dr=m/n;
}
break;
case Mod:
dr=(int)m%(int)n;//这里简单起见,转换为整数求余数
break;
case Exp:
if(n>=0)//n为正数
for(i=0;i<n;i++)
{
br=br*10;//乘以10的n次幂
}
else//n为负数
{ n=-n;
for(i=0;i<n;i++)
{
br=br*0.1;//乘以0.1的n次幂
}
}
dr=br;
break;
case SQUAR:
if(n>=0)
for (i=0;i<n-1;i++)
{
br=br*m;
}
else
{ br=1/br;
n=-n;
for(i=0;i<n-1;i++)
{
br=br*cr;//乘以0.1的n次幂
}
} dr=br;
break;
default:;
}
return dr; }
解决方案 »
- 我遇到的情况是用VC做的OCX在WIN7下 用regsvr32注册显示是注册成功,但在用时就是不能用。同样的东西同样的操作在XP下一切正常.......凌乱中.
- 20分在线求C# 如何在一张图上设置热区域
- 关于字体宽度的问题
- 拆分奇数个窗口的问题,大家帮忙顶下!
- 彩色转换成灰色问题
- 请问CList与CTypedPtrList的区别??
- hhk=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInstance,0);hhk==NUll ???
- 关于Accesss数据库的问题!
- 问一下VC里有没有等待5秒,10秒的涵数?
- 请问如何自己写文件格式
- 用在IE网页中的ActiveX透明控件在网页滚动之后出现的问题
- MFC picture控件位置问题
这是个计算器喽,那就是为了控制连续操作的
st 是里面控制的关键
m_ctlDisplay 是那个显示输入和结果的控件
m_dPreNum 是两个操作数的前面一个
op 是操作的方式,加减乘除等……
m_dCurrentNum 是第二个操作数例如 12+34+56void CCCalculatorDlg::OnNum(UINT uID) // 这个肯定是按了 数字键 的时候处理
{
UINT index=uID- IDC_NUM_0; // 把数字键 的 Ascii 转换成整数?
CString num;
CString str;
num.Format(_T("%d"),index); // 把数字弄成字符用来显示
//AfxMessageBox(num);//弹出对话框提醒
switch(st)
{
case _CE: // st 是 _CE 就是最初始的状态
str=num; // 这个时候要将用户输入的第一个数字显示出来
m_ctlDisplay.SetWindowText(str); // 状态要变成 _A 这是用来接受用户的其他数字显示
st=_A; // 这里就是 1
break;
case _A: // st 从 _CE 变成 _A,这里再处理数字时就把显示
m_ctlDisplay.GetWindowText(str); // 的数字取出来,再加上用户输入数字
str+=num; // 一起显示到输入上
m_ctlDisplay.SetWindowText(str); // 这里就是 12 了,状态不再转换,直到用户输入 +-= 等
break;
case _B: // 用户开始输入第二个数字了 前面记录了 12+
str=num; // 这就是 3 了
m_ctlDisplay.SetWindowText(str); // 状态转换为 _C 是因为这里要把原有的 12 清除
st=_C;
break;
case _C: // 再输入数字就是第二个数了,这里是 34
m_ctlDisplay.GetWindowText(str); // 一直输入,直到用户输入了 +-=等
str+=num;
m_ctlDisplay.SetWindowText(str);
break;
case _D:
str=num;
m_ctlDisplay.SetWindowText(str);
st=_A;
break;
default:;
}
}
double CCCalculatorDlg::GetCurrentNum() // 费半天劲将当前显示的数字再转换成浮点数
{ double num=0;
CString str;
m_ctlDisplay.GetWindowText(str);
num=atof(str);
return num;
}//获得当前显示的数字void CCCalculatorDlg::DisplayNum(double d) // 显示一个指定的数字,也就是结果?
{
CString str;
str.Format(_T("%f"),d);
m_ctlDisplay.SetWindowText(str);}//显示数字
void CCCalculatorDlg:: Clear()
{ op=None;
st=_CE;
m_dCurrentNum=m_dPreNum=0;
}
void CCCalculatorDlg::OnOperator(_operator_ _op) // 这是处理 +-= 等操作的
{
switch(st){
case _A: // st 是 _A 说明刚才一直处理
op=_op; // 第一个数来着,现在第一个数
m_dPreNum=GetCurrentNum(); // 输入结束了,保存下来,并记录操作
st=_B; // 用户输入了 +
break;
case _C: // 用户输入+ 了,结束第二个数的输入
m_dCurrentNum=GetCurrentNum(); // 把这次显示的数取出来
m_dPreNum=GetValue(m_dPreNum,m_dCurrentNum); // 跟之前存的数用 op 做运算
DisplayNum(m_dPreNum); // 显示出来 12+34 46+
op=_op; // 并且结果就是下一次运算的 pre 了
st=_B; // 记录 op 并且回到 _B 等待用户输入
break;
case _D:
st=_B;
m_dPreNum=GetCurrentNum();
op=_op;
break;
default:;
}
}
double CCCalculatorDlg::GetValue(double m,double n) // 各种 op 运算得到结果
{ double dr=0;
double br=m;
double cr=1/m;//求第一个操作数的倒数用来求x^y
int i;
switch(op)
{
case Add:
dr=m+n;
break;
case Multi:
dr=m*n;
break;
case Minus:
dr=m-n;
break;
case Div:
if(n==0.0)
{
AfxMessageBox(_T("分母不能为0!"));
OnCe();
}
else
{
dr=m/n;
}
break;
case Mod:
dr=(int)m%(int)n;//这里简单起见,转换为整数求余数
break;
case Exp:
if(n>=0)//n为正数
for(i=0;i<n;i++)
{
br=br*10;//乘以10的n次幂
}
else//n为负数
{ n=-n;
for(i=0;i<n;i++)
{
br=br*0.1;//乘以0.1的n次幂
}
}
dr=br;
break;
case SQUAR:
if(n>=0)
for (i=0;i<n-1;i++)
{
br=br*m;
}
else
{ br=1/br;
n=-n;
for(i=0;i<n-1;i++)
{
br=br*cr;//乘以0.1的n次幂
}
}dr=br;
break;
default:;
}
return dr; }
只能解释这么多了……好累