1. 程式人生 > >【基於VS2010的MFC程式設計】四則運算計算器

【基於VS2010的MFC程式設計】四則運算計算器

平臺/工具:VS2010
目的:利用VS2010平臺建立一個MFC工程,實現四則運算計算器的程式編寫和介面設計
專案分析:實現 “+”“-”“”“/” 四則運算,需要幾個要素:運算子“+”“-”“”“/”、數字0~9,用於顯示參與運算的兩個數的編輯框、用於顯示運算結果的編輯框、一些輔助功能按鈕。基於這些要素分析,採用VS2010建立一個基於對話方塊的MFC工程,並在對話方塊中新增相應的控制元件,新增一定的訊息響應函式及編寫實現程式,從而編出一個帶有簡要說明的能進行四則運算的計算器。
方法步驟
Step 1:建立一個名為“Calculator_MFCBased”的基於對話方塊的MFC專案,方法之前在“簡易加法器”總結中已經講過,此處不再贅述。

Step 2:建好基於對話方塊的MFC專案後,會看到Calculator_MFCBased主對話方塊介面,刪除對話方塊原有的“TODO:在此放置對話方塊控制元件”以及“確定”“取消”按鈕,在對話方塊任意空白處單擊右鍵->屬性,將右側出現的屬性欄中Caption屬性改為“四則運算計算器”,則看到對話方塊名稱變為“四則運算計算器”。重新自定義、設計對話方塊。

新增控制元件
(1)從工具欄將Static Text工具拖到對話方塊的適當位置,新增四個靜態文字框(Static Text),依次選中->右鍵->屬性,將Caption屬性依次改為“歡迎使用軟體”“請在以下編輯框中分別輸入數字:”“運算結果”“運算子”,ID不改
(2)從工具欄將Edit Control工具拖到對話方塊的適當位置,新增三個編輯框(Edit Control),ID分別為IDC_EDIT1、IDC_EDIT2、IDC_EDIT3
(3)從工具欄將Button工具拖到對話方塊的適當位置,新增0~9這十個數字,將Caption屬性分別改為數字0~9,ID分別改為IDC_NUM_0、IDC_NUM_1、…IDC_NUM_9;繼續新增按鈕到對話方塊中適當位置,Caption屬性分別改為“+”“-”“*”“/”,對應ID分別為IDC_ADD、IDC_DEC、IDC_multiplication、IDC_division
(4)新增輔助按鈕到對話方塊:再新增三個按鈕到對話方塊中相應位置,Caption屬性分別為“關於軟體”“清零”“退出”,ID分別為:IDC_ABOUT_BUTTON、IDC_CLEAR_BUTTON、IDC_QUIT_BUTTON。三個按鈕分別實現如下功能:當按下“關於軟體”按鈕時,跳出關於該四則運算計算器的說明;當按下“清零”按鈕時,將對應編輯框中數字清零,實現重新輸入功能;當按下“退出”按鈕時退出對話方塊,結束程式。

設定控制元件
將該有的控制元件新增到對話方塊完畢後,開始對三個編輯框控制元件新增變數,方法是:
選中編輯框->右鍵->新增變數->在“新增成員變數嚮導”對話方塊中勾選“控制元件變數”,類別均為Value(因為編輯框是用來顯示值的),變數型別均為double,變數名分別為m_num1(ID為IDC_EDIT1的編輯框,位於主對話方塊左側第一個位置,用於顯示參與運算的第一個數值)、m_num2(ID為IDC_EDIT2的編輯框,位於上一個編輯框之下,用於顯示參與運算的第二個數值)、m_result(ID為IDC_EDIT3的編輯框,用於顯示運算結果)

Step 3: 控制元件訊息響應函式具體程式碼新增部分


在主對話方塊中雙擊“+”“-”“*”“/”,則跳轉進入主程式Calculator_MFCBasedDlg.cpp中這些控制元件的訊息響應函式處,在其函式體中新增實現對應功能的程式碼,具體如下:
void CCalculator_MFCBasedDlg::OnBnClickedAdd() //“加”
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(TRUE); //將各種控制元件中的資料儲存到相應的變數
m_result=m_num1 + m_num2; //做加法
UpdateData(FALSE); //根據各變數的值更新相應的控制元件,計算結果編輯框會顯示m_result的值
}

void CCalculator_MFCBasedDlg::OnBnClickedDec() //“減”
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(TRUE); //將各種控制元件中的資料儲存到相應的變數
m_result=m_num1 - m_num2; //做減法
UpdateData(FALSE); //根據各變數的值更新相應的控制元件,計算結果編輯框會顯示m_result的值
}

void CCalculator_MFCBasedDlg::OnBnClickedmultiplication() //“乘”
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(TRUE); //將各種控制元件中的資料儲存到相應的變數
m_result=m_num1*m_num2; //做乘法
UpdateData(FALSE); //根據各變數的值更新相應的控制元件,計算結果編輯框會顯示m_result的值
}

void CCalculator_MFCBasedDlg::OnBnClickeddivision() //“除”
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(TRUE); //將各種控制元件中的資料儲存到相應的變數
m_result=m_num1/m_num2; //做除法
UpdateData(FALSE); //根據各變數的值更新相應的控制元件,計算結果編輯框會顯示m_result的值
}

注意:由於有兩個運算數,對應兩個供顯示的編輯框,那麼如何判斷在哪個編輯框中進行了操作?解決方案是給程式加入一個判斷功能,具體思想是:通過滑鼠左鍵點選編輯框,從而判斷當前選擇的是該編輯框,為此,加入一個滑鼠左鍵點選WM_LBUTTONDOWN訊息和一個EN_SETFOCUS事件來響應這個滑鼠訊息。EN_SETFOCUS為判斷焦點事件(通俗來說就是判斷游標在什麼地方),這樣一來,作用過程就比較明晰了:當用戶用滑鼠選擇並點選編輯框的時候,我們用WM_LBUTTONDOWN訊息去響應,與此同此,把響應的訊息和EN_SETFOCUS聯絡起來,預設一個int型全域性變數nEditFlag(在初始化函式BOOL CCalculator_MFCBasedDlg::OnInitDialog()之前定義)作為在EN_SETFOCUS函式裡的一個 標記,並在滑鼠點下的時候用nEditFlag 去表示編輯框目前被選定的狀態,“nEditFlag ==1”表示使用者選擇了編輯框1,“nEditFlag ==2”說明編輯框2被選定。

如何新增EN_SETFOCUS事件
(1) 設定
在主對話方塊中,選擇“示例編輯框”->右鍵->新增事件處理程式->在出來的嚮導框中“訊息型別”選擇EN_SETFOCUS,其他一般會預設(如果沒有,請按下圖修改) ->新增編輯。編輯框1的事件新增如下圖所示(編輯框2類似):
這裡寫圖片描述
(2)初始化
設定好後,需要做一些必要的初始化工作:在程式執行之初,先初始化nEditFlag = 0(在主程式中的初始化函式BOOL CCalculator_MFCBasedDlg::OnInitDialog()中進行),即將“nEditFlag = 0;”寫入到該函式的函式體中,如下圖:
這裡寫圖片描述
(3)新增事件響應函式程式碼
初始化完畢,為兩個事件響應函式OnEnSetfocusEdit1()和OnEnSetfocusEdit2()新增程式碼:
void CCalculator_MFCBasedDlg::OnEnSetfocusEdit1() //響應第一個編輯框
{
// TODO: 在此新增控制元件通知處理程式程式碼
nEditFlag = 1; //新增的程式碼
}

void CCalculator_MFCBasedDlg::OnEnSetfocusEdit2() //響應第二個編輯框
{
// TODO: 在此新增控制元件通知處理程式程式碼
nEditFlag = 2; //新增的程式碼
}

對於滑鼠訊息WM_LBUTTONDOWN,做以下操作
首先在主程式的訊息響應函式中新增“ON_WM_LBUTTONDOWN()”,如下圖:
這裡寫圖片描述
然後在上述兩個事件響應函式之前新增如下程式碼段:
void CCalculator_MFCBasedDlg::OnLButtonDown(UINT nFlags,CPoint point)
//必須在CCalculator_MFCBasedDlg.h標頭檔案的保護成員中宣告OnLButtonDown,否則出錯
{
//TODO:在此新增控制元件通知處理程式程式碼
this->SetFocus();
nEditFlag=0;
CDialog::OnLButtonDown(nFlags,point);
}

此外需注意:一定要在主程式標頭檔案,即CCalculator_MFCBasedDlg.h中的保護成員(protected)中宣告OnLButtonDown(),如下圖:
這裡寫圖片描述

Step 4:(按鍵0~9的響應部分)(以數字按鈕“1”,“0”為例,其他類似)
void CCalculator_MFCBasedDlg::OnBnClickedNum1() //數字“1”的按鈕
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+1;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+1;
}
UpdateData(FALSE);
}

void CCalculator_MFCBasedDlg::OnBnClickedNum0() //數字“0”的按鈕
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(TRUE);
if(nEditFlag==1)
{
m_num1=m_num1*10+0;
}
else if(nEditFlag==2)
{
m_num2=m_num2*10+0;
}
UpdateData(FALSE);
}

說明
(1)if語句判斷標記常量 nEditFlag的值, 從而確定是對m_num1(編輯框1內的數字)還是對m_num2(編輯框2內的數字)進行操作;
(2)“m_num2=m_num2*10+1;”中為何乘以10再加上按鈕數字?
例如,使用者想在編輯框2中打出自然數“234”,第一次點的數字是2,那麼此時對應執行是這段程式碼:m_num2=m_num2*10+2;由於初始化時m_num2 = 0,因此m_num2 = 0*10 +2 ,之後如果點選數字3按鈕,則執行的程式碼是: m_num2=m_num2*10+3;此時經過第一步m_num2已經為2了,再點了3,因而結果為m_num2= 2*10+3 = 23,最後點選數字4 按鈕,執行的程式碼是: m_num2=m_num2*10+4;(23*10 +4=234),因此要先乘以10再加上數字按鈕對應的數字。

Step 5:功能完善部分
(1)“清零”按鈕
我們希望當用戶輸入的數字不是想要的數字時,能夠及時修改,為此,在主對話方塊中新增 “清零”按鈕,當該按鈕按下時,將游標當前所在的編輯框中數字清零,使用者可以按下數字按鈕以重新輸入想要的數字。實現方法是:雙擊“清零”按鈕跳轉到主程式中該按鈕對應的訊息響應函式處,在void CCalculator_MFCBasedDlg::OnBnClickedClearButton()函式體中新增如下程式碼:

UpdateData(TRUE);
if(nEditFlag==1) //當滑鼠左鍵選中第一個編輯框時,將框中資料清零
{
m_num1=0;
}
else if(nEditFlag==2) //當滑鼠左鍵選中第一個編輯框時,將框中資料清零
{
m_num2=0;
}
UpdateData(FALSE);
(2)“退出”按鈕
我們希望主對話方塊中有一個按鈕,當按下它時退出整個對話方塊,結束程式(功能類似於單擊對話方塊中的×),實現方法是:雙擊“退出”按鈕跳轉到主程式中該按鈕對應的訊息響應函式處,在void CCalculator_MFCBasedDlg::OnBnClickedQuitButton()函式體中新增如下程式碼:
exit(0);
(3)“關於軟體”按鈕
我們希望使用者單擊此按鈕時,跳出關於該計算器的一些說明,實現方法有多種,可以是新增屬性頁的方法,可以是彈出模態對話方塊的方法,本文采用後者。具體如下:
① 在“資源檢視(Resource View)”中的“Dialog”上點右鍵選擇“插入Dialog (Insert Dialog)”,建立一個新的對話方塊模板,修改其ID為IDD_INSTRUCT_DIALOG,Caption屬性改為“關於該計算器的說明”。
② 在對話方塊模板上新增5個靜態文字框(Static Text)(具體個數按照文字長短而定),Caption依次改為“此計算器能進行四則運算”,“當滑鼠選中任一編輯框,單擊數字按鈕時,編輯框中將顯示相應數字”,“當按下任一運算子按鈕時,結果編輯框才會顯示相應結果”,“當游標處於某一編輯框中時單擊“清零”按鈕,則框中資料清零”,“單擊“退出”按鈕,退出軟體”,完成後的對話方塊如下:
這裡寫圖片描述
③ 在對話方塊任一空白處單擊右鍵選擇“新增類”,彈出新增類的對話方塊,設定“類名(Class name)”為CAboutCalculatorDlg,點“完成”。在“解決方案資源管理器 (Solution Explorer)”中可以看到生成了CAboutCalculatorDlg類的標頭檔案AboutCalculatorDlg.h和原始檔AboutCalculatorDlg.cpp。
④ 在Calculator_MFCBasedDlg.cpp中包含CAboutCalculatorDlg的標頭檔案:#include “AboutCalculatorDlg.h”(Calculator_MFCBased為你建立的專案名,不同專案可能不同)。
⑤ 單擊“使用軟體”按鈕,跳轉到該按鈕對應的程式,將下面的程式碼加到函式void CCalculator_MFCBasedDlg::OnBnClickedAboutButton() 的函式體中:
//—————————————————
INT_PTR nRes; // 用於儲存DoModal函式的返回值
CTipDlg tipDlg; // 構造對話方塊類CAboutCalculatorDlg類的例項
nRes = tipDlg.DoModal(); // 彈出對話方塊
if (IDCANCEL == nRes) // 判斷對話方塊退出後返回值是否為IDCANCEL,如果是則return,否則繼續向下執行
return;
//————————————————–

至此,整個計算器編寫設計完成。執行程式,效果如下(編輯框1中輸入14,編輯框2中輸入70,做乘法):
這裡寫圖片描述
這裡寫圖片描述