zoukankan      html  css  js  c++  java
  • 利用MFC编写计算器

    端午节这两天没什么事,就用MFC写了一个简单的计算器,界面做的也比较简单,如下图1,可以进行简单的加、减、乘和除功能,小数点显示这块做的不是很好,比如输入1.2,不会一个个的显示,而是先显示“1”,后同时显示“.2”,还有就是遇到0.00时,显示的也不够人性化,哎,就这样吧。。。

                                                                                                                  图1

    1、建立工程:New -> Projects,选择Win32 MFC AppWizard(exe),并输入工程(counter)名字及设置好路径,点击OK,选择“Dialog based”,基于对话框,直接点finish。

    2、将对话框进行简单的处理,把无关的按钮删掉,添加自己的按钮及Edit Box,如图2。

                                                                              图2

    3、对按钮及Edit Box进行属性设置,比如按钮1属性设置为“IDC_BUTTON_1”,2设置为IDC_BUTTON_2,一直类推。Edit Box不仅要设置ID(IDC_DISPLAY),还要设置相关连的成员变量,右键,选择ClasssWizard..,在点击Add Variable..,这里设置为double m_display。

    4、对每个按钮添加消息处理函数,只需双击该按钮,按照提示点OK,就进入到了该函数入口处。

      1设置void CCounterDlg::OnButton1();

      2设置void CCounterDlg::OnButton2();

      ....

      其他类推。

          加 void CCounterDlg::OnButtonAdd();

      减void CCounterDlg::OnButtonSub();

          乘void CCounterDlg::OnButtonMult();

          除void CCounterDlg::OnButtonDiv();

          = void CCounterDlg::OnButtonEqual();

    5、定义成员变量

     int count;  //计数
     BOOL dot_flg; //小数点标志
     BOOL continue_flg;//没按运算符,是否一直连续按数字按钮标志
     BOOL str_flag;//有没按运算符标志
     CString str;//记录当前按的运算符
     double result; //num1和num2运算的结果
     double num1; //按运算符之前的第一个数

     double num2; //按运算符之后的第二个数

    6、定义成员函数,该函数主要是对按下的数字进行叠加,跟踪num1和num2:

    double CCounterDlg::buttonDownNum(int numSize);

    7、当按下之后数字要及时显示出来,需要用到:

    UpdateData(FALSE);  //该函数是对Edit Box的内容进行更新,FALSE是有内部数成员的数据值更新到界面上,TRUE是从界面上更新到内部的数据成员上。

    GetDlgItem(IDC_DISPLAY)->SetWindowText("小数点");//可以利用这个语句直接在Edit Box上显示内容“小数点”。只是提示自己也可以用这个来显示,程序中注释掉了。

    8、代码实现:

    //贴出自己添加的代码,其他代码默认有的
    #include "math.h"
    
    // CCounterDlg dialog
    CCounterDlg::CCounterDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CCounterDlg::IDD, pParent)
    {
        //{{AFX_DATA_INIT(CCounterDlg)
        //初始化
        m_display = 0.0;
        num1 = 0;
        num2 = 0;
        result = 0.0;
        str = "";
        str_flag = FALSE;
        continue_flg = FALSE;
        downDot = FALSE;
        count = 1;
    
        //}}AFX_DATA_INIT
        // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    double CCounterDlg::buttonDownNum(int numSize)
    {
        if (!str_flag) //运算符没有被按下,那就是num1
        {
            if (!continue_flg) //按下一次
            {
                num1 = numSize;
                continue_flg =TRUE;
            }
            else
            {
                num1 = num1*pow(10,count) + numSize;
                if (downDot)
                {
                    num1 = num1/(pow(10,count));
                    count++;
                }
            }
            
            return num1;
        }
        else  //有运算符被按下
        {
            if (!continue_flg) //是否连续按下
            {
                num2 = numSize;
                continue_flg =TRUE;
            }
            else
            {
                num2 = num2*pow(10,count) + numSize;
                if (downDot)
                {
                    num2 = num2/(pow(10,count));
                    count++;
                }
            }
            
            return num2;
        }
    }
    
    
    void CCounterDlg::OnButton0() 
    {
        // TODO: Add your control notification handler code here
        
        m_display = buttonDownNum(0);    
        UpdateData(FALSE);    
    }
    
    void CCounterDlg::OnButton1() 
    {
        // TODO: Add your control notification handler code here
        m_display = buttonDownNum(1);
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButton2() 
    {
        // TODO: Add your control notification handler code here
        
        m_display = buttonDownNum(2);
        
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButton3() 
    {
        // TODO: Add your control notification handler code here
        m_display = buttonDownNum(3);
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButton4() 
    {
        // TODO: Add your control notification handler code here
        m_display = buttonDownNum(4);
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButton5() 
    {
        // TODO: Add your control notification handler code here
        m_display = buttonDownNum(5);
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButton6() 
    {
        // TODO: Add your control notification handler code here
        m_display = buttonDownNum(6);
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButton7() 
    {
        // TODO: Add your control notification handler code here
        m_display = buttonDownNum(7);
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButton8() 
    {
        // TODO: Add your control notification handler code here
        m_display = buttonDownNum(8);
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButton9() 
    {
        // TODO: Add your control notification handler code here
        m_display = buttonDownNum(9);
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButtonDot() //小数点
    {
        // TODO: Add your control notification handler code here
        downDot = TRUE; 
    //    GetDlgItem(IDC_DISPLAY)->SetWindowText("小数点"); //可以利用该函数在编辑框中显示信息
    }
    
    void CCounterDlg::OnButtonAdd() //
    {
        // TODO: Add your control notification handler code here
        str = "+";    
        str_flag = TRUE;
        continue_flg = FALSE;
        downDot = FALSE;
        count = 1;
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButtonSub()  //
    {
        // TODO: Add your control notification handler code here
        str = "-";    
        str_flag = TRUE;
        continue_flg = FALSE;
        downDot = FALSE;
        count = 1;
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButtonMult()  //
    {
        // TODO: Add your control notification handler code here
        str = "*";    
        str_flag = TRUE;
        continue_flg = FALSE;
        downDot = FALSE;
        count = 1;
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButtonDiv()  //
    {
        // TODO: Add your control notification handler code here
        str = "/";    
        str_flag = TRUE;
        continue_flg = FALSE;
        downDot = FALSE;
        count = 1;
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButtonEqual() 
    {
        // TODO: Add your control notification handler code here
        if(str == "+")
            result = num1 + num2;
        else if(str == "-")
            result = num1 - num2;
        else if(str == "*")
            result = num1 * num2;
        else if(str == "/")
        {
            result = double(num1) / double(num2);
        }
    
        num1 = result;
        m_display = result;
        str_flag = FALSE;
        continue_flg = FALSE;
        downDot = FALSE;
        count = 1;
        UpdateData(FALSE);
    }
    
    void CCounterDlg::OnButtonClear() 
    {
        // TODO: Add your control notification handler code here
    
        num1 = 0;
        num2 = 0;
        m_display = 0;
        continue_flg = FALSE;
        str_flag = FALSE;
        downDot = FALSE;
        count = 1;
        UpdateData(FALSE);
    }
    View Code
  • 相关阅读:
    MT【319】分段递推数列
    MT【318】分式不等式双代换
    Centos7环境变量
    VI快捷键
    Centos7 开机自动运行命令
    Centos7 编辑本地DNS解析配置文件
    Centos7修改主机名
    xadmin 自定义过滤器选项
    Centos7网卡配置文件
    Centos7 挂载
  • 原文地址:https://www.cnblogs.com/wen2376/p/3763917.html
Copyright © 2011-2022 走看看