IDC_DISPLAY,關聯 CEdit m_EditIDC_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 = "";
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 函式。double m_memory 變數。PreTranslateMessage 攔截鍵盤訊息映射至按鈕處理。CListBox 記錄每次運算式與結果。透過狀態機設計(m、n、m_sign、strItem、m_string)管理輸入與運算流程,配合 MFC 對話方塊架構,可快速構建功能完整的計算機應用。核心在於「連續運算邏輯」與「狀態重置時機」的精確控制。