zoukankan      html  css  js  c++  java
  • mfc基于对话框的简单四则运算计算器

    1.①创建mfc对话框窗口,对话框中所有控件都delete。

       ②绘制界面,按键都button,显示区域edit control,计算器名字用static text。

       ③所有控件ID改成语义化ID(可不改),如数字1 IDC_BUTTON_NUM1,改变caption值(显示)。

       ④edit control属性中,外观中align text表示显示对齐位置(计算器靠右对齐,选择right),行为中的read only选择true(文本框只用来显示,故只读),最上方的static text标题属性align text选择居中(center)。

       ⑤在edit control右键添加变量,选择value Cstring,变量名字(如:mmm)。

    2.①双击所有控件代码编辑。

       ②在calculatorDlg.h中添加

            //运算符
            enum CALCULATOR_FLAG {
            FLAG_JIA = 0,
            FLAG_JIAN,
            FLAG_CHENG,
            FLAG_CHU,
            };

           private:
           //输入的2个值
           double mNum1;
           double mNum2;
           //运算符号
           CALCULATOR_FLAG mFlag;

        没有的话加

           void SaveFirstValue(); //保存第一个输入值
           void Calculator();//计算

      ③在calculatorDlg.cpp里添加

         Calculator()函数具体如下:

        

    void CcalculatorDlg::Calculator()   //注意CcalculatorDlg大小写
    {
    UpdateData(TRUE);
    mNum2 = _wtof(mmm);
    double result = 0.0f;
    switch (mFlag)
    {
    case FLAG_JIA: //加
    result = mNum1 + mNum2;
    break;
    case FLAG_JIAN: //减
    result = mNum1 - mNum2;
    break;
    case FLAG_CHENG: //乘
    result = mNum1 * mNum2;
    break;
    case FLAG_CHU: //除
    if (mNum2 == 0.0f)
    {
    result = mNum1;
    }
    else
    {
    result = mNum1 / mNum2;
    }
    break;
    default:
    break;
    }
    //如果浮点数其实是个整数,就显示为整数
    if (result - int(result) <= 1e-5)
    {
    mmm.Format(L"%d", (int)result);
    }
    else
    {
    mmm.Format(L"%f", result);
    }
    UpdateData(FALSE);
    mNum1 = result;
    mNum2 = 0.0f;
    }

      SaveFirstValue()函数具体如下:

    void CcalculatorDlg::SaveFirstValue()    //注意CcalculatorDlg大小写
    {
    UpdateData(TRUE);
    mNum1 = _wtof(mmm);
    mmm= L"";
    UpdateData(FALSE);
    }

      数字键:

    void CcalculatorDlg::OnBnClickedButtonNum0()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"0";
    UpdateData(FALSE);

    }                                //不同的数字只改变L“0”中0的位置

      运算键:

      +:

    void CcalculatorDlg::OnBnClickedButtonNumjia()
    {
    // TODO: 在此添加控件通知处理程序代码
    SaveFirstValue();
    mFlag = FLAG_JIA;
    }

      -:

    void CcalculatorDlg::OnBnClickedButtonNumjian()
    {
    // TODO: 在此添加控件通知处理程序代码
    SaveFirstValue();
    mFlag = FLAG_JIAN;
    }

      *:

    void CcalculatorDlg::OnBnClickedButtonNumcheng()
    {
    // TODO: 在此添加控件通知处理程序代码
    SaveFirstValue();
    mFlag = FLAG_CHENG;
    }

      /:

    void CcalculatorDlg::OnBnClickedButtonNumchu()
    {
    // TODO: 在此添加控件通知处理程序代码
    SaveFirstValue();
    mFlag = FLAG_CHU;
    }

      其他键:

      小数点:

    void CcalculatorDlg::OnBnClickedButtonNumdian()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    //如果没有小数点,则加上一个小数点,如果已有小数点就忽略此次的小数点,保证最多只有1个
    if (-1 == mmm.Find(L'.'))
    {
    mmm += L".";
    }
    UpdateData(FALSE);
    }

      等于:

    void CcalculatorDlg::OnBnClickedButtonNumdeng()
    {
    // TODO: 在此添加控件通知处理程序代码
    Calculator();
    }

      AC清屏:

    void CcalculatorDlg::OnBnClickedButtonNumqing()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm = L"";
    mNum1 = 0.0f;
    mNum2 = 0.0f;
    mFlag = FLAG_JIA;

    UpdateData(FALSE);
    }

    具体代码:

    calculatorDlg.h

    // calculatorDlg.h : 头文件
    //

    #pragma once
    //运算符
    enum CALCULATOR_FLAG {
    FLAG_JIA = 0,
    FLAG_JIAN,
    FLAG_CHENG,
    FLAG_CHU,
    };

     

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

    // 对话框数据
    #ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_CALCULATOR_DIALOG };
    #endif
    void SaveFirstValue(); //保存第一个输入值
    void Calculator();//计算

    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:
    CString mmm;
    afx_msg void OnBnClickedButtonNumdeng();
    afx_msg void OnBnClickedButtonNum0();
    afx_msg void OnBnClickedButtonNum1();
    afx_msg void OnBnClickedButtonNum2();
    afx_msg void OnBnClickedButtonNum3();
    afx_msg void OnBnClickedButtonNum4();
    afx_msg void OnBnClickedButtonNum5();
    afx_msg void OnBnClickedButtonNum6();
    afx_msg void OnBnClickedButtonNum7();
    afx_msg void OnBnClickedButtonNum8();
    afx_msg void OnBnClickedButtonNum9();
    afx_msg void OnBnClickedButtonNumjia();
    afx_msg void OnBnClickedButtonNumjian();
    afx_msg void OnBnClickedButtonNumcheng();
    afx_msg void OnBnClickedButtonNumchu();
    afx_msg void OnBnClickedButtonNumqing();
    private:
    //输入的2个值
    double mNum1;
    double mNum2;
    //运算符号
    CALCULATOR_FLAG mFlag;
    public:
    afx_msg void OnBnClickedButtonNumdian();
    };

     calculatorDlg.cpp

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

    #include "stdafx.h"
    #include "calculator.h"
    #include "calculatorDlg.h"
    #include "afxdialogex.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif


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

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

    // 对话框数据
    #ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_ABOUTBOX };
    #endif

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

    // 实现
    protected:
    DECLARE_MESSAGE_MAP()
    };

    CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
    {
    }

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

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()


    // CcalculatorDlg 对话框

     

    CcalculatorDlg::CcalculatorDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_CALCULATOR_DIALOG, pParent)
    , mmm(_T(""))
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

    void CcalculatorDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, mmm);
    }

    BEGIN_MESSAGE_MAP(CcalculatorDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON_NUMDENG, &CcalculatorDlg::OnBnClickedButtonNumdeng)
    ON_BN_CLICKED(IDC_BUTTON_NUM0, &CcalculatorDlg::OnBnClickedButtonNum0)
    ON_BN_CLICKED(IDC_BUTTON_NUM1, &CcalculatorDlg::OnBnClickedButtonNum1)
    ON_BN_CLICKED(IDC_BUTTON_NUM2, &CcalculatorDlg::OnBnClickedButtonNum2)
    ON_BN_CLICKED(IDC_BUTTON_NUM3, &CcalculatorDlg::OnBnClickedButtonNum3)
    ON_BN_CLICKED(IDC_BUTTON_NUM4, &CcalculatorDlg::OnBnClickedButtonNum4)
    ON_BN_CLICKED(IDC_BUTTON_NUM5, &CcalculatorDlg::OnBnClickedButtonNum5)
    ON_BN_CLICKED(IDC_BUTTON_NUM6, &CcalculatorDlg::OnBnClickedButtonNum6)
    ON_BN_CLICKED(IDC_BUTTON_NUM7, &CcalculatorDlg::OnBnClickedButtonNum7)
    ON_BN_CLICKED(IDC_BUTTON_NUM8, &CcalculatorDlg::OnBnClickedButtonNum8)
    ON_BN_CLICKED(IDC_BUTTON_NUM9, &CcalculatorDlg::OnBnClickedButtonNum9)
    ON_BN_CLICKED(IDC_BUTTON_NUMJIA, &CcalculatorDlg::OnBnClickedButtonNumjia)
    ON_BN_CLICKED(IDC_BUTTON_NUMJIAN, &CcalculatorDlg::OnBnClickedButtonNumjian)
    ON_BN_CLICKED(IDC_BUTTON_NUMCHENG, &CcalculatorDlg::OnBnClickedButtonNumcheng)
    ON_BN_CLICKED(IDC_BUTTON_NUMCHU, &CcalculatorDlg::OnBnClickedButtonNumchu)
    ON_BN_CLICKED(IDC_BUTTON_NUMQING, &CcalculatorDlg::OnBnClickedButtonNumqing)
    ON_BN_CLICKED(IDC_BUTTON_NUMDIAN, &CcalculatorDlg::OnBnClickedButtonNumdian)
    END_MESSAGE_MAP()


    // CcalculatorDlg 消息处理程序

    BOOL CcalculatorDlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog();

    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。

    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: 在此添加额外的初始化代码

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

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

    // 如果向对话框添加最小化按钮,则需要下面的代码
    // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
    // 这将由框架自动完成。

    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::OnBnClickedButtonNumdeng()
    {
    // TODO: 在此添加控件通知处理程序代码
    Calculator();
    }


    void CcalculatorDlg::OnBnClickedButtonNum0()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"0";
    UpdateData(FALSE);

    }


    void CcalculatorDlg::OnBnClickedButtonNum1()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"1";
    UpdateData(FALSE);
    }


    void CcalculatorDlg::OnBnClickedButtonNum2()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"2";
    UpdateData(FALSE);
    }


    void CcalculatorDlg::OnBnClickedButtonNum3()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"3";
    UpdateData(FALSE);
    }


    void CcalculatorDlg::OnBnClickedButtonNum4()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"4";
    UpdateData(FALSE);
    }


    void CcalculatorDlg::OnBnClickedButtonNum5()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"5";
    UpdateData(FALSE);
    }


    void CcalculatorDlg::OnBnClickedButtonNum6()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"6";
    UpdateData(FALSE);
    }


    void CcalculatorDlg::OnBnClickedButtonNum7()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"7";
    UpdateData(FALSE);
    }


    void CcalculatorDlg::OnBnClickedButtonNum8()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"8";
    UpdateData(FALSE);
    }


    void CcalculatorDlg::OnBnClickedButtonNum9()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm += L"9";
    UpdateData(FALSE);
    }


    void CcalculatorDlg::OnBnClickedButtonNumjia()
    {
    // TODO: 在此添加控件通知处理程序代码
    SaveFirstValue();
    mFlag = FLAG_JIA;
    }


    void CcalculatorDlg::OnBnClickedButtonNumjian()
    {
    // TODO: 在此添加控件通知处理程序代码
    SaveFirstValue();
    mFlag = FLAG_JIAN;
    }


    void CcalculatorDlg::OnBnClickedButtonNumcheng()
    {
    // TODO: 在此添加控件通知处理程序代码
    SaveFirstValue();
    mFlag = FLAG_CHENG;
    }


    void CcalculatorDlg::OnBnClickedButtonNumchu()
    {
    // TODO: 在此添加控件通知处理程序代码
    SaveFirstValue();
    mFlag = FLAG_CHU;
    }


    void CcalculatorDlg::OnBnClickedButtonNumqing()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    mmm = L"";
    mNum1 = 0.0f;
    mNum2 = 0.0f;
    mFlag = FLAG_JIA;
    UpdateData(FALSE);
    }


    void CcalculatorDlg::OnBnClickedButtonNumdian()
    {
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);
    //如果没有小数点,则加上一个小数点,如果已有小数点就忽略此次的小数点,保证最多只有1个
    if (-1 == mmm.Find(L'.'))
    {
    mmm += L".";
    }
    UpdateData(FALSE);
    }


    //保存第一个输入值
    void CcalculatorDlg::SaveFirstValue()
    {
    UpdateData(TRUE);
    mNum1 = _wtof(mmm);
    mmm= L"";
    UpdateData(FALSE);
    }
    void CcalculatorDlg::Calculator()
    {
    UpdateData(TRUE);
    mNum2 = _wtof(mmm);
    double result = 0.0f;
    switch (mFlag)
    {
    case FLAG_JIA: //加
    result = mNum1 + mNum2;
    break;
    case FLAG_JIAN: //减
    result = mNum1 - mNum2;
    break;
    case FLAG_CHENG: //乘
    result = mNum1 * mNum2;
    break;
    case FLAG_CHU: //除
    if (mNum2 == 0.0f)
    {
    result = mNum1;
    }
    else
    {
    result = mNum1 / mNum2;
    }
    break;
    default:
    break;
    }
    //如果浮点数其实是个整数,就显示为整数
    if (result - int(result) <= 1e-5)
    {
    mmm.Format(L"%d", (int)result);
    }
    else
    {
    mmm.Format(L"%f", result);
    }
    UpdateData(FALSE);
    mNum1 = result;
    mNum2 = 0.0f;
    }

      

  • 相关阅读:
    JAVA-复数计算器
    第十三周总结
    java多线程
    写作的意义
    mysql删除有外键表数据
    Linux firewall防火墙设置
    linux安装ftp
    SELECT list is not in GROUP BY clause and contains nonaggregated
    primordials is not defined
    maven手动添加jar包
  • 原文地址:https://www.cnblogs.com/slay/p/10147214.html
Copyright © 2011-2022 走看看