vs2005MFC計算器制作_第1頁
vs2005MFC計算器制作_第2頁
vs2005MFC計算器制作_第3頁
vs2005MFC計算器制作_第4頁
vs2005MFC計算器制作_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、制作計算器本文采用動態(tài)創(chuàng)建控件的方法,使用 vs2005 MFC,仿照windows自帶的計算器進行制作。通過這個程序可以使你了解:1 如何使用文本框、按鈕2 如何通過控件的ID獲取控件指針3 得到控件指針后可以對控件做些什么4 字符串如何處理(拼接、查找、轉(zhuǎn)換等)5 如何給控件綁定響應事件6 如何重載原有的函數(shù)7 其他自己體會界面分析:不要上面的菜單欄,也不要第一排的按鈕,這些按鈕都不要,只要一個文本框和下面右圖中的按鈕,布局方式也按照這個圖布局。仔細數(shù)一數(shù),共有23個按鈕和一個編輯框。 功能分析:用一下windows的計

2、算器,可以發(fā)現(xiàn):1. 初始狀態(tài)為02. 如果按下數(shù)字鍵,這個0就會變成相應的數(shù)字,如果按下小數(shù)點,就會變?yōu)椤?.”3. 除數(shù)不能為04. 連續(xù)按下多個運算符,以最后一個計算符為準5. 每次按下運算符都會把之前的結(jié)果先經(jīng)行計算,例如:你已經(jīng)輸入了 1+ 1 此時再按下 “+”,就會先把1+1進行計算,保存結(jié)果2.6. 這個計算器分兩行顯示,上面一行顯示算式,下面顯示結(jié)果.7. 當你輸入一個數(shù)字和一個運算符就按下“=”時,第二個數(shù)默認和第一個相同,例如:“3*”按下“=”,顯示“9”8. 開平方不能是負數(shù)9. 其它異常暫不處理新建項目這里我給項目命名為:Calculator應用程序的類型選擇 基于

3、對話框,點擊完成完成之后,先來觀察一下項目中都有哪些東西:資源視圖(下面右圖)是我們的界面,解決方案中的是我們的源文件(下面左圖)。我們的代碼主要寫在和中,.h文件中主要定義一些東西,.cpp文件中寫具體的東西。 準備知識初始界面打開界面,可以看到,上面已經(jīng)給我們放上去了兩個按鈕確定和取消。由于我們建立的是對話框應用程序,這兩個按鈕的功能就是接受Enter鍵和ESC鍵的響應。先不要刪除它,不然會造成不必要的麻煩:例如如果你刪除了這兩個按鈕,當你在界面上按下回車時,程序找不到響應的控件,就會導致異常。添加編輯框在工具箱中找到編輯框控件,把它拖放到界面合適的位置,并在屬性欄中把它的ID改為TEXT

4、C,便于記憶,這個編輯框的作用就是顯示數(shù)字。有的資料會給這個編輯框關(guān)聯(lián)一個值,用于處理編輯框中內(nèi)容,在這里,我們就不給他關(guān)聯(lián)值,要想給編輯框顯示一個值或者是獲取文本框中的值,通過代碼去實現(xiàn)。包括后面按鈕的處理,我們都盡量通過代碼去實現(xiàn)它的功能。至此,一行代碼還沒有寫,先運行一下看看(如下圖),如果你在文本框中按下回車鍵或者ESC鍵,就會發(fā)現(xiàn)程序會直接退出。這是因為“確定”按鈕響應回車事件,“取消”按鈕響應ESC鍵,如果不想退出,可以重載這兩個按鈕的響應事件,也可以屏蔽鍵盤的輸入,這里暫不處理。(換句話說,如果不建立對話框應用程序,不就可以了嗎?沒辦法暫時先學一學這個吧),如果覺著兩個按鈕很礙眼

5、,可以把他們隱藏掉:把這兩個按鈕的Visible屬性改為false即可。設(shè)置編輯框可以換行,有三個屬性要更改;Auto HScroll 設(shè)置為 FalseMultiLine  設(shè)置為 TrueWant Return 設(shè)置為 True代碼寫法:CEdit* pEdit = (CEdit*)GetDlgItem(TEXTC); /斷言,判斷是不是pEdit(類似if語句) ASSERT(pEdit && pEdit->GetSafeHwnd(); /pEdit->SetSel(-1); /追加模式 pEdit->ReplaceSel(_T("第

6、一行rn第二行"); 或者SetDlgItemText(TEXTC,_T("ArnB"); rn就是換行符GetDlgItem 這個方法很有用,要注意!讀/寫編輯框中內(nèi)容編輯框已經(jīng)添加上去,那么怎樣使用這個編輯框呢?主要就是怎樣獲取它里面的內(nèi)容或者讓它顯示指定的內(nèi)容。主要使用到兩個函數(shù):讀取控件中的內(nèi)容:寫入控件內(nèi)容:nID:控件的ID,也可以使控件的名字rString:保存到的字符串(即:將控件上的文本獲取到rString中)lpszString:要顯示出來的字符串。需要注意的是這個參數(shù)是LPCTSTR類型,不是CString類型,在使用的過程中要進行轉(zhuǎn)換:(L

7、PCTSTR)str怎樣在編輯框后面追加內(nèi)容,不刪除之前的內(nèi)容呢?后面會講到。在界面上添加按鈕定義你可以一個一個按鈕拖放上去,但這里我使用的是通過代碼進行創(chuàng)建。根據(jù)開始時候的分析,共需要23個按鈕,于是我們需要定義一個長度為23的按鈕數(shù)組,為了便于更改,這里定義一個常量NUM,表示23. 如下:public: static const int NUM = 23;public: CButton *p_ButtonNUM ;除此之外,為了便于寫代碼,再定義一個函數(shù),用了創(chuàng)建按鈕,如下:public: CButton* NewMyButton(LPCTSTR m_Caption,int nID,CR

8、ect rect);LPCTSTR m_Caption:m_Caption是按鈕上顯示的文字,LPCTSTR是參數(shù)類型int nID:是按鈕的ID號CRect rect:rect是按鈕的左上角坐標和大小,原型順便再定義幾個變量,后面寫代碼要用到:CString equation ;/算式CString inputNum ;/輸入的數(shù)字CString op;/運算符double result;/計算結(jié)果double number;/輸入的數(shù)字前面說過,定義是放在“.h”文件中的,打開文件,寫在里面就可以了。寫完之后先運行一下試試看,如果沒有報錯,就說明你寫對了,如果報錯,就這幾行定義你也能寫錯?

9、!接下來進入主題:初始化在窗體初始化的時候,就應該把按鈕添加上去。打開文件,在里面找到BOOL CCalculatorDlg:OnInitDialog() 這個函數(shù),這就是初始化的函數(shù),要不創(chuàng)建按鈕的工作就寫在這里。首先你要根據(jù)按鈕排列的特點確定算法,這里就不詳細解釋了:CString OP = _T(""),_T("CE"),_T("C"),_T("±"),_T(""),_T("7"),_T("8"),_T("9"),_T(

10、"/"),_T("%"),_T("4"),_T("5"),_T("6"),_T("*"),_T("1/x"),_T("1"),_T("2"),_T("3"),_T("-"),_T("="),_T("0"),_T("."),_T("+");/上面是按鈕上的內(nèi)容,從第一行按順序記錄 int tm=0;

11、/記錄是第幾個按鈕 int x=10;/第一個按鈕的起始x坐標IDC_D_BTN 這個常量是自己定義的,表示按鈕的起始ID,為了不和其他控件的ID沖突,就把它定義為10000.Resource.h文件中進行定義:#define IDC_D_BTN 10000 int y=60;/第一個按鈕的起始y坐標 int w = 40;/ 按鈕的寬度 int h = 33;/ 按鈕的高度 int d=3;/ 按鈕之間的間距 for(int i=0;i<NUM;i+)int r = tm/5;/對應的行int c=tm%5;/對應的列if(OPi = _T("=")/“=”按鈕比較

12、大,占了兩行p_Buttoni =NewMyButton(LPCTSTR)OPi ,IDC_D_BTN+i,CRect(x +w*c,y +h*r,x +w*(c+1)-d,y+h*(r+2)-d);else if(OPi = _T("0")/“=”按鈕比較大,占了兩列p_Buttoni =NewMyButton(LPCTSTR)OPi ,IDC_D_BTN+i,CRect(x +w*c,y +h*r,x +w*(c+2)-d,y+h*(r+1)-d);tm=tm+1;else/其他的按鈕都是正常的大小p_Buttoni =NewMyButton(LPCTSTR)OPi ,

13、IDC_D_BTN+i,CRect(x +w*c,y +h*r,x +w*(c+1)-d,y+h*(r+1)-d); tm=tm+1;/順便把其他變量也給初始化了/SetDlgItemText(TEXTC,(LPCTSTR)"0"); CEdit* pEdit = (CEdit*)GetDlgItem(TEXTC); /斷言,判斷是不是pEdit(類似if語句)ASSERT(pEdit && pEdit->GetSafeHwnd();pEdit->ReplaceSel(_T("rn0"); equation="&qu

14、ot; result = 0; op = ""inputNum="0" number = 0;上面使用了之前定義的創(chuàng)建按鈕的函數(shù):NewMyButton,下面添加這個函數(shù)在這個cpp文件中,找個位置,寫上如下函數(shù):CButton* CCalculatorDlg:NewMyButton(LPCTSTR m_Caption,int nID,CRect rect)CButton *p_B = new CButton();p_B->Create( m_Caption,WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, rect,

15、this, nID ); return p_B;注:Create方法有很多作用,可以創(chuàng)建各種控件完成以上工作后,嘗試運行一下,如果沒有錯誤,就會出現(xiàn)如下界面:稍微把窗體的大小調(diào)整合適 按鈕已經(jīng)創(chuàng)建出來了,但是別高興的太早,當你關(guān)閉這個界面的時候,會發(fā)現(xiàn)提示很多的錯誤,大意是內(nèi)存泄露,原因是程序中實例化了按鈕,關(guān)閉程序的時候卻沒有釋放它所占有的空間,所以在關(guān)閉窗體的事件中,要對new出來的對象進行釋放。下面就說一說怎樣寫這個關(guān)閉事件。重寫函數(shù)的方法:點擊選擇Calculate窗體,在屬性欄中找到,點擊紅色方框中的圖標,在下面會出現(xiàn)很多的方法,點擊對應函數(shù)后面的下拉框進行選擇即可,如下圖 窗體關(guān)閉

16、函數(shù): 點擊,即可在CalculatorDlg.cpp文件中創(chuàng)建關(guān)閉函數(shù)。在CDialog:OnClose();上面,寫上釋放空間的代碼:for(int i=0;i<NUM;i+)/循環(huán)刪除每一對象 if( p_Buttoni !=NULL)/如果該對象不是空,就進行刪除delete p_Buttoni;至此,再運行一次程序,可以發(fā)現(xiàn)錯誤消失了。接下來,就要讓這些按鈕起作用,給它們綁定一個點擊事件.綁定響應事件首先,在頭文件中定義一個函數(shù),作為按鈕的單擊事件:public: void OnButton(UINT nID);其中UINT nID 是觸發(fā)該事件控件的ID號,根據(jù)這個ID就可以

17、找到對應的按鈕。在cpp文件中,寫上這個函數(shù)的實現(xiàn):void CCalculatorDlg:OnButton(UINT nID)CString tag ;/先獲取文本框中的值,用于判斷GetDlgItemText(TEXTC,tag); /獲取按鈕上的內(nèi)容CString str;GetDlgItemText(nID,str); /接下來是對str進行判斷,做出相應的處理,這個暫略 /后面會寫這部分的代碼,暫時讓他彈出一個提示框,顯示str AfxMessageBox(str);事件已經(jīng)有了,接下來要把它綁定到每個按鈕在cpp文件中找到下面的函數(shù)在那條注釋的下一行寫上下面代碼:ON_COMMAN

18、D_RANGE(IDC_D_BTN,IDC_D_BTN+NUM,OnButton)解釋:上面的代碼段(BEGIN_MESSAGE_MAP這段)通過名字可以看得出是一個消息的MAP,類似字典。如果你拖一個按鈕到界面上,并且給它添加一個點擊事件,可以發(fā)現(xiàn),在這段代碼中會出現(xiàn)這個單擊事件的函數(shù)。ON_COMMAND_RANGE的意思是消息響應的映射,專業(yè)點的說法是“宏定義”,在這里,表示的意思是:只要ID號在IDC_D_BTN和IDC_D_BTN+NUM之間的控件,都接收OnButton這個函數(shù)。在創(chuàng)建按鈕的時候,我們?yōu)槊總€按鈕分配了一個ID,ID值就是在IDC_D_BTN和IDC_D_BTN+NU

19、M之間的,所以那些按鈕可以響應這個事件,即:點擊按鈕時,會調(diào)用OnButton函數(shù)。至此,每個按鈕的單擊事件已經(jīng)完成了,可以運行一下試試看:功能實現(xiàn)至此,基本的功能已經(jīng)實現(xiàn),下面就是純代碼了,沒有什么復雜的操作,就是基本的邏輯處理。找到void CCalculatorDlg:OnButton(UINT nID)函數(shù),在這里面寫具體的功能。算法就不詳細解釋了,實現(xiàn)的方法也因人而異,可以自己去琢磨。下面給出基本的思路和代碼的寫法:注:代碼中有些變量在上面沒有提到,主要是這些變量僅僅與計算有關(guān),與界面的設(shè)計無關(guān),可以自行查看源代碼。/按鈕的點擊事件void CCalculatorDlg:OnButt

20、on(UINT nID)/根據(jù)編輯框的名字(ID),獲取編輯框CEdit* pEdit = (CEdit*)GetDlgItem(TEXTC); /斷言,判斷是不是pEdit(類似if語句)ASSERT(pEdit && pEdit->GetSafeHwnd();CString txt ;/先獲取文本框中的值,用于判斷/CString ts0 ;/ 編輯框第一行的值/CString ts ;/ 編輯框第二行的值GetDlgItemText(TEXTC,txt);/pEdit->getint pos= txt.Find(_T("rn"); /獲取按

21、鈕上的內(nèi)容CString bs;GetDlgItemText(nID,bs); CString sNum = _T("0123456789.");/數(shù)字字符串,包括小數(shù)點bool isEdit = false;/用了標記是否可以輸入if(sNum.Find(bs)>=0)/如果按下的是數(shù)字if(bs="0")/如果按下的是,要判斷一下if(inputNum="0")/如果編輯框中已經(jīng)是,就不能再輸入isEdit=false;elseisEdit=true;else if(bs=".")/如果按下的是小數(shù)點,要

22、判斷一下if(inputNum.Find('.')>0)/如果編輯框已經(jīng)有小數(shù)點了,就再輸入isEdit=false;else/如果編輯框沒有小數(shù)點,就輸入小數(shù)點isEdit=true;/ AfxMessageBox(bs);else/其他數(shù)字不用判斷 if(inputNum="0")/如果編輯框中是,就把這個去掉SetDlgItemText(TEXTC,_T("rn"); inputNum = ""/AfxMessageBox(inputNum);isEdit=true;if(isEdit=true)/如果可以

23、輸入,就把bs追加到編輯框inputNum +=bs;SetDlgItemText(TEXTC,equation+_T("rn")+inputNum); /pEdit->ReplaceSel(bs); /上面一段if是控制輸入else/操作符,下面是進行計算處理if(inputNum="")/什么也沒有輸入else/編輯框中有數(shù)字if(bs="+" | bs="-"| bs="*"| bs="/"| bs="=")/number = _wtof(ts); /當前的數(shù)字給numberif(tag)/第一次輸入數(shù)字 result =_wtof(inputNum); tag=false;if(inputNum="")CString cs ;cs.Format(_T("%G"),result);SetDlgItemText(TEXTC,equ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論