首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 計算機界面實現:按鈕累加顯示與運算邏輯分離

     編輯:程式設計綜合問答

MFC 對話框計算機經典入門:數字鍵 0-9、運算符 + - * / %、顯示框累加輸入、等號計算結果。本文提供完整實現邏輯與代碼架構。

界面設計

  • 編輯框 IDC_EDIT_DISPLAY → 變量 CString m_strDisplay(顯示用)
  • 按鈕:IDC_BTN_0~IDC_BTN_9、IDC_BTN_ADD、IDC_BTN_SUB...、IDC_BTN_EQ、IDC_BTN_CLEAR

核心變量


class CCalcDlg : public CDialogEx {
    CString m_strDisplay;      // 顯示緩衝
    double m_dCurrentVal;      // 當前輸入值
    double m_dPrevVal;         // 前一運算元
    char m_chOp;               // 當前運算符 '+','-','*','/','%'
    bool m_bOpPressed;         // 是否剛按下運算符
    // ...
};

數字鍵統一處理


void CCalcDlg::OnNumber(UINT nID) {
    CString strNum;
    strNum.Format(_T("%d"), nID - IDC_BTN_0); // 假設 ID 連續
    
    if (m_bOpPressed || m_strDisplay == _T("0")) {
        m_strDisplay = strNum;  // 運算符後或初始狀態,替換
        m_bOpPressed = false;
    } else {
        m_strDisplay += strNum; // 累加顯示
    }
    UpdateData(FALSE);
}

// 消息映射
ON_COMMAND_RANGE(IDC_BTN_0, IDC_BTN_9, OnNumber)

運算符處理


void CCalcDlg::OnOperator(UINT nID) {
    // 先計算上一個運算(若有)
    if (m_chOp != 0) OnEqual();
    
    m_dPrevVal = _tstof(m_strDisplay); // 保存左運算元
    m_bOpPressed = true;
    
    switch (nID) {
        case IDC_BTN_ADD: m_chOp = '+'; break;
        case IDC_BTN_SUB: m_chOp = '-'; break;
        case IDC_BTN_MUL: m_chOp = '*'; break;
        case IDC_BTN_DIV: m_chOp = '/'; break;
        case IDC_BTN_MOD: m_chOp = '%'; break;
    }
}
ON_COMMAND_RANGE(IDC_BTN_ADD, IDC_BTN_MOD, OnOperator)

等號計算


void CCalcDlg::OnEqual() {
    if (m_chOp == 0) return; // 無運算符
    
    m_dCurrentVal = _tstof(m_strDisplay); // 右運算元
    double result = 0;
    
    switch (m_chOp) {
        case '+': result = m_dPrevVal + m_dCurrentVal; break;
        case '-': result = m_dPrevVal - m_dCurrentVal; break;
        case '*': result = m_dPrevVal * m_dCurrentVal; break;
        case '/': 
            if (m_dCurrentVal != 0) result = m_dPrevVal / m_dCurrentVal;
            else { m_strDisplay = _T("Error"); UpdateData(FALSE); return; }
            break;
        case '%': 
            result = fmod(m_dPrevVal, m_dCurrentVal); break;
    }
    
    m_strDisplay.Format(_T("%.10g"), result); // 格式化輸出
    UpdateData(FALSE);
    
    m_dPrevVal = result; // 連續運算支持
    m_chOp = 0;
    m_bOpPressed = true;
}

清除鍵


void CCalcDlg::OnClear() {
    m_strDisplay = _T("0");
    m_dPrevVal = m_dCurrentVal = 0;
    m_chOp = 0;
    m_bOpPressed = false;
    UpdateData(FALSE);
}

關鍵設計要點

  1. 顯示與計算分離:m_strDisplay 只負責顯示,運算用 double 變量
  2. 狀態機:m_bOpPressed 區分「輸入數字中」與「剛按完運算符」
  3. 連續運算:按運算符時自動結算上一步(OnOperator 調用 OnEqual)
  4. 格式化輸出:%.10g 去除多餘尾隨零,避免科學計數法

擴展建議

  • 小數點處理:檢查 m_strDisplay.Find('.') == -1 才允許加點
  • 鍵盤支持:PreTranslateMessage 攔截數字鍵、Enter、Esc
  • 歷史記錄:CListBox 記錄每步運算

總結

MFC 計算機核心是狀態管理:數字累加顯示、運算符觸發計算並保存狀態、等號輸出結果。用 ON_COMMAND_RANGE 統一處理同類按鈕,變量分離顯示與計算,邏輯清晰易維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved