MFC+VS2010编写一个计算器

         每个人都有自己的编程语言爱好,每种语言都有自己的优势也都有自己的不足,可以肯定的是每种语言都只有学的深入了以后才能对这种语言进行熟练的操作,相对而言自己更喜欢C/C++。这篇文章就是根据C++和MFC来做的一个计算器(如下图1),另外一个使用方便并且效率高的IDE开发环境也是很重要的,现在很多书籍包括我们学习的时候都是采用VC6.0,不否认VC6.0很经典,但是用过VS2010以后相信你也不会失望的,另外向大家推荐一个插件Visual Assist X,她自动完成功能真是让人爱不释手。

                                (图1)

第一次用MFC进行程序编写,刚开始的时候确实没有思路,看着这个基于dialog style的mfc程序,不知道怎样来处理那些按钮和控件。Internet上面的资料很丰富,找了几个例子,但是他们却没有把思路给写出来并且功能不全面,这样就很容易让人无法真正的抓住编写的思路,所以,在借鉴前人的基础上,把自己的方法给出来:

前言:

先说一下自己用的工具Visual Studio 2010 Ultimate 英文版(装有Visual Assist X)。这里简单提一下Visual Assist X的安装方法在菜单栏选择”Tools”,然后是Extension Manager,在Extension Manager左边栏里面选择Online Gallery,然后等待从网络加载信息,拖动滚动条就可以看到Visual Assist X,或者直接搜索Visual Assist X也可以,下载安装就可以了。

建立这个程序采用的是MFC Application Warzid,选择采用Dialog Style对话框模式,在第二步选择Application Type的时候要选择Dialog baesd,然后在Advanced Features中有一项是Support Restart Manager,这个选项可以最大限度的恢复应用程序突然终止时的状态,这一特性我们在Word等应用程序中就可以感觉到,当一个Word文档崩溃以后,再打开就会恢复对该文档进行的操作,这一选项可选或者不选,不影响本程序的主要功能;其他的细节可以根据阅读向导说明自己选择。project name 是Calcex,下面是自动生成的类视图:

对添加的CCalcexDlg类的成员进行说明:

CString  m_show :edit control的成员变量,用与显示输入与结果。添加方式:在edit control上面右键,选择 Add Variable…

CString  m_num1 :CCalcexDlg的成员变量,用于存放第一个参数

CString  m_num2 :CCalcexDlg的成员变量,用于存放第一个参数

int  m_operta :CCalcexDlg的成员变量,用于存放运算符,默认为0;加法为1,减法为2 etc.

int  m_opertatemp :CCalcexDlg的成员变量,用于存放之前的一个运算符,进行多个运算数的计算

 

正文:

1、我们知道每一个button在你双击它的时候,就会自动跳到其对应的处理函数的代码,所以如果我们希望当我们按下某一个button的时候要执行某些操作,我们只要在其处理函数中添加合适的代码就行。----这说明了我们应该怎样对待一个button/contrl:它们是一个对象,可以有自己的数据成员,也可以有自己的成员函数,应该把C++中面向对象的观点拿过来对待这些按钮和控件。

2、思考我们使用计算器的过程:如a+b=/a+b+c-d= 。只有两个数相加的时候,我们可以把双目运算符(+-*/)当做操作数a和b的分界符,我们要先取得运算数,然后当按下=的时候给出结果;当有多个数运算时中间不会出现=,这就需要在每个运算符被按下的时候都要检查一下之前输入的运算数是否已经被计算,我采用的是:给CCalcexDlg类添加一个m_opertatemp变量,在没有出现=的情况下先检查m_opertatemp是否为0,若为0则说明之前的运算都已进行,否则就先执行之前的运算,再执行后面的计算,代码如下(举例说明):

这是对数字1 button的处理函数

void CCalcexDlg::OnBnClickedButton11()
{
    // TODO: Add your control notification handler code here

    if (m_show!='0')
        m_show+='1';
    else
        m_show='1';
    UpdateData(FALSE);
}

这是对 + button的处理函数

void CCalcexDlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    if (m_opertatemp)   //check if has been proceeded
    {
        m_num2=m_show;  //store current data to m_num2 to procedure
     Algrithm(m_opertatemp);   //Perform arithmetic

    }
    m_operator=1;
    m_opertatemp=m_operator;
    m_num1=m_show;
    m_show='0';   
}

3、怎样显示输入的数据和运算结果

CString类是一个很有用的类,我们可以用_tstof(CString)把一个字符串转化为一个double数据,也可以用CString::Format()把一个double数据转换成一个字符串:

void CCalcexDlg::Algrithm(int operta)
{
        double temp1,temp2;
        double temp=0;
        temp1=_tstof(m_num1);
        temp2=_tstof(m_num2);
    switch(operta)
    {
      case 1:
          temp=temp1+temp2;
          break;
      case 2:
          temp=temp1-temp2;
          break;
      case 3:
          temp=temp1*temp2;
          break;
      case 4:
          temp=temp1/temp2;
          break;
      case 5:
          temp=cos(temp1);
          break;
      case 6:
          temp=sin(temp1);
          break;
      case 7:
          temp=tan(temp1);
          break;
      case 8:
          temp=log(temp1);        //log with e
          break;
      case 9:
          temp=log10(temp1);    //log with 10
          break;
      case 10:
          temp=1.0;
          for( ;temp2>0.0;--temp2)
          {
              temp*=temp1;
          }
          break;
      case 11:
          temp=1;
          for (;temp1>0;--temp1)
          {
              temp*=temp1;
          }
      default:break;
    }
    if(temp-(int)temp==0)
        m_show.Format(_T("%.0f"),temp);
    else
        m_show.Format(_T("%.6f"),temp);   
    UpdateData(FALSE);
    m_opertatemp=0;     //reset the m_opertatemp for the next calculate
}

4、退格键的实现:CString::Left()

void CCalcexDlg::OnBnClickedButton22()
{
    // TODO: Add your control notification handler code here
    m_show=m_show.Left(m_show.GetLength()-1); //提取左边的数值并将其长度减1
    if(m_show=="")
    {
        m_show='0';
    }
    UpdateData(false);
}

5、另外就是UpdateData(false)和UpdateData()
UpdateData(false)不显示你输入到edit control里面的数据,只显示edit control的数据成员m_show的值;

UpdateData()=UpdateData(TRUE)显示你输入到edit control里面的数据,而不是edit control本身的数据成员的值

6、程序的生成

有时候我们在自己机子上运行自己编写的程序可以正常运行,但是一拿到别人机子上就会提示某个dll文件缺失,这是因为我们生成的application是用的“Use MFC in a Shared DLL”,我们只要把选项改为“Use MFC in a Static Library”就行了。具体的方法是:菜单Project--->选择本项目属性---->Configuration Properties--->General右侧Use of MFC选项即可。

好了以上就是所有关键的地方,有更好的方法希望大家分享一下:

源代码下载(release 版的):

http://download.csdn.net/source/2733548

你可能感兴趣的:(C/C++,AFX(MFC),mfc,2010,application,button,extension,dialog)