首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 實作 Windows 風格計算機完整教學

     編輯:關於VC++

專案架構規劃

  • 基於對話方塊的 MFC 應用程式
  • 兩個主對話方塊:標準模式(四則運算、開根號、倒數、平方)、科學模式(擴充功能)
  • 菜單切換模式、關於對話方塊
  • 使用 Tab 控制項實現雙模式介面切換

介面設計與控制項 ID 規劃

  • 編輯控制項(顯示區):IDC_DISPLAY,關聯 CEdit m_Edit
  • 數字鍵 0-9:IDC_BTN_0 ~ IDC_BTN_9,關聯 CString 變數
  • 運算子鍵 + - * / %:IDC_BTN_ADD 等
  • 功能鍵:等號 IDC_BTN_EQ、清除 IDC_BTN_CLR、退格 IDC_BTN_BS、正負號 IDC_BTN_SIGN

核心成員變數設計


public:
    char m_sign;        // 當前運算子:+ - * / %
    int  m;             // 控制編輯框連續輸入狀態
    int  n;             // 連續運算計數器
    CString strItem;    // 當前編輯框輸入字串
    CString m_string;   // 累積運算結果字串

建構函式初始化


m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m = n = 0;
m_string = "";
strItem = "";

數字鍵處理(以 0 為例)


void CCalcDlg::OnBtn0() {
    if (!m) { m_Edit.SetWindowText(""); m++; } // 首次輸入清空舊值
    m_Edit.GetWindowText(strItem);
    strItem += "0";
    m_Edit.SetWindowText(strItem);
}

所有數字鍵邏輯相同,僅字串常數不同。

運算子處理(以加法為例)


void CCalcDlg::OnBtnAdd() {
    if (!n) { // 第一次按運算子
        m_string = strItem;
        if (m_string.IsEmpty()) { m_string = ""; return; }
    } else { // 連續運算:先計算前一個運算
        double num1 = atof(m_string);
        double num2 = atof(strItem);
        switch (m_sign) {
            case '+': num1 += num2; break;
            case '-': num1 -= num2; break;
            case '*': num1 *= num2; break;
            case '/': 
                if (num2 == 0) { AfxMessageBox("除數不能為 0!"); return; }
                num1 /= num2; break;
            case '%': 
                if (num2 == 0) { AfxMessageBox("除數不能為 0!"); return; }
                num1 = (int)num1 % (int)num2; break;
        }
        m_string.Format("%.6f", num1);
    }
    m_sign = '+';
    strItem = "";
    n++;
    if (m > 0) m--; // 允許輸入新數字
    m_Edit.SetWindowText(m_string); // 顯示中間結果
}

減法、乘法、除法、取模邏輯同理,只需修改 m_sign 與 switch 對應 case。

等號鍵:最終計算與顯示


void CCalcDlg::OnBtnEq() {
    if (!n) {
        m_string = strItem;
    } else {
        double num1 = atof(m_string);
        double num2 = atof(strItem);
        switch (m_sign) {
            case '+': num1 += num2; break;
            case '-': num1 -= num2; break;
            case '*': num1 *= num2; break;
            case '/': 
                if (num2 == 0) { AfxMessageBox("除數不能為 0!"); return; }
                num1 /= num2; break;
            case '%': 
                if (num2 == 0) { AfxMessageBox("除數不能為 0!"); return; }
                num1 = (int)num1 % (int)num2; break;
        }
        m_string.Format("答案: %.6f", num1);
    }
    m_Edit.SetWindowText(m_string);
    // 重置所有狀態
    m_string = ""; strItem = ""; n = 0; m = 0; m_sign = ' ';
}

輔助功能實作

退格鍵


void CCalcDlg::OnBtnBs() {
    m_Edit.GetWindowText(strItem);
    if (strItem.IsEmpty()) {
        AfxMessageBox("內容已為空!");
    } else {
        strItem.Delete(strItem.GetLength() - 1, 1);
        m_Edit.SetWindowText(strItem);
    }
}

清除鍵


void CCalcDlg::OnBtnClr() {
    strItem = ""; m_string = ""; n = 0; m = 0; m_sign = ' ';
    m_Edit.SetWindowText("");
}

擴充建議

  • 科學模式:新增 sin、cos、log、x^y 等按鈕,對應 math.h 函式。
  • 記憶體功能:MC、MR、MS、M+ 按鈕,額外增加 double m_memory 變數。
  • 鍵盤支援:PreTranslateMessage 攔截鍵盤訊息映射至按鈕處理。
  • 歷史記錄:CListBox 記錄每次運算式與結果。

總結

透過狀態機設計(m、n、m_sign、strItem、m_string)管理輸入與運算流程,配合 MFC 對話方塊架構,可快速構建功能完整的計算機應用。核心在於「連續運算邏輯」與「狀態重置時機」的精確控制。

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