課程設(shè)計計算器樣本_第1頁
課程設(shè)計計算器樣本_第2頁
課程設(shè)計計算器樣本_第3頁
課程設(shè)計計算器樣本_第4頁
課程設(shè)計計算器樣本_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+程序設(shè)計課程設(shè)計報告題目:用VC+制作多功能計算器學(xué)生姓名:學(xué) 號:院 (系):專 業(yè):2011 年 9 月 9 日目錄摘要21引言21.1課題背景21.2課程設(shè)計目的22 開發(fā)工具的介紹3 2.1關(guān)于Visual C+32.2可行性分析42.3需求分析43 功能說明44 系統(tǒng)的實現(xiàn)54.1窗體設(shè)計54.2編輯資源64.3實現(xiàn)高級按鈕控件類84.4實現(xiàn)高級編輯控件類124.5對話框界面設(shè)計154.6數(shù)值計算功能的實現(xiàn)205 程序結(jié)果的演示215.1測試的研究與選擇215.2測試環(huán)境215.3實例測試結(jié)果22結(jié)束語23參考文獻(xiàn) 23用VC+制作多功能計算器摘 要本課程設(shè)計將實現(xiàn)一個簡單計算器

2、。其類似于Windows附件中自帶的計算器。這個計算器不僅實現(xiàn)了簡單的四則運算功能,還實現(xiàn)了高級的科學(xué)計算功能,而且具有簡潔大方的圖文外觀。它的設(shè)計按軟件工程的方法進(jìn)行,系統(tǒng)具有良好的界面、必要的交互信息和較好的健壯性使用人員能快捷簡單地進(jìn)行操作。即時準(zhǔn)確地獲得需要的計算的結(jié)果,充分降低了數(shù)字計算的難度和節(jié)約了時間,對人們的生活有一定的幫助。在課程設(shè)計中,系統(tǒng)開發(fā)平臺為Windows 2000XP,程序設(shè)計設(shè)計語言采用Visual C+,在程序設(shè)計中,采用了結(jié)構(gòu)化與面向?qū)ο髢煞N解決問題的方法。關(guān)鍵詞 程序設(shè)計;計算器;MFC;按鈕控件1 引 言本課程設(shè)計主要在運算過程中,如果通過計算器來完成,

3、就會減少計算量,該程序即可以在簡單計算器鍵面下進(jìn)行簡單運算,也可以在科學(xué)計算器鍵面下進(jìn)行高級的科學(xué)計算。并且可以分別計算弧度、角度的三角函數(shù)的計算等較為復(fù)雜的運算。1.1 課題背景計算器是日常生活中十分便捷有效的工具,能實現(xiàn)加、減、乘、除、開方、求倒數(shù)等簡單運算的工具。要實現(xiàn)計算功能,可以用VC+的知識編寫程序來解決此問題。該計算器大大的降低了數(shù)字計算的難度及提高了計算的準(zhǔn)確度和精確度。該計算器使用非常簡單和方便,對廣大中小學(xué)生的學(xué)習(xí)有巨大幫助作用,也對在職人員的工作有點幫助作用。1.2 課程設(shè)計目的在程序設(shè)計中,通過設(shè)計、編制、調(diào)試一個模擬計算器的程序,加深對語法及語義分析原理的理解,并實現(xiàn)

4、對命令語句的靈活應(yīng)用。在程序設(shè)計中,可以用兩種方法解決問題:一是傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計方法,二是更先進(jìn)的面向?qū)ο蟪绦蛟O(shè)計方法。由于多個函數(shù)均需要訪問某些數(shù)據(jù),這些數(shù)據(jù)常被設(shè)計為全局變量。而在面向?qū)ο蟪绦蛟O(shè)計中關(guān)鍵是如何將問題域中的實體(即日常所見的概念)抽取出來,作為C+程序中的類,而屬性與行為作為類的兩類要素通常是必不可少的,甚至還應(yīng)考慮類必須滿足的約束。2 開發(fā)工具的介紹2.1關(guān)于Visual C+Visual C+6.0 是Microsoft公司在1998年推出的基于Windows 9X和Windows NT的優(yōu)秀集成開發(fā)環(huán)境。該環(huán)境為用戶提供了良好的可視化編程環(huán)境,程序員可以里利用該開發(fā)

5、環(huán)境輕松地訪問C+源代碼編輯器,資源編輯器和使用內(nèi)部調(diào)試器,并且可以創(chuàng)建項目文件。Visual C+6.0不僅包括編譯器,而且它還包括許多有用組件,通過這些組件的協(xié)同工作,可以在Visual C+6.0集成環(huán)境中輕松地完成創(chuàng)建源文件,編輯資源,以及對程序的編譯,連接和調(diào)試等各項工作。VC+6.0是Windows 95/98、XP或Windows NT下的一個應(yīng)用程序,本身對軟硬件沒有特殊要求。就是說它對環(huán)境的要求與Windows 95/98、Windows NT要求是一致的。硬件要求:一般在586以上的處理器、16MB以上內(nèi)存、100MB以上的硬盤。軟件要求:Windows 95/98或Win

6、dows NT3.51以上版本。VC+ 6.0系統(tǒng)可以在一張CD盤上,也可以在“Visual Studio( Visual C+、Visual Foxpro)”等產(chǎn)品的第一張CD盤上。一般都有一個VC的自動安裝程序,也可以執(zhí)行VC6目錄下的setup.exe,在安裝包的提示下進(jìn)行,對初學(xué)者可采用“典型安裝”方式。在安裝好VC 6.0系統(tǒng)后,有時根據(jù)需要添加或刪除某些部件,可插入CD盤重新執(zhí)行setup.exe安裝程序,安裝程序會檢測當(dāng)前系統(tǒng)安裝VC6的足件,用戶單擊“添加刪除”按鈕后,在“安裝維護(hù)”對話框中選定要添加的部件或撤消選定要刪除的部件。與一般的應(yīng)用軟件一樣,有以下兩種啟動方式:(1)

7、通過“開始”按鈕,選擇“程序”菜單,然后打開“Microsoft Visual studio 6.0中文版”子菜單中的“Microsoft Visual C+ 6.0 中文版”程序。(2)用戶也可以使用命令行啟動VC。單擊“開始”按鈕后選擇“運行”命令,在“運行”對話框中輸入c:Program FilesMicrosoft Visual StudioVC98VC6.exe(按默認(rèn)盤符和路徑安裝)即可。2.2 可行性分析本設(shè)計是簡單計算器。日常計算機(jī)使用中,常常涉及到一些有關(guān)計算的問題,一個小型的計算器軟件變得非常有用,該校型計算器需要空間資源較少,對電腦其他程序的應(yīng)用影響較小。它的設(shè)計按軟件工

8、程的方法進(jìn)行,系統(tǒng)具有良好的界面、必要的交互信息和較好的健壯性;醒目美觀的軟件封面。使用人員能快捷簡單地進(jìn)行操作。即時準(zhǔn)確地獲得需要的計算的結(jié)果,充分降低了數(shù)字計算的難度和節(jié)約了時間,對人們的生活有一定的幫助。2.3需求分析本軟件主要用于計算機(jī)windows 2000/XP以上版本的用戶的使用,這次課程設(shè)計一般是實現(xiàn)簡單計算器的功能。要程序能實現(xiàn):加,減,乘,除,開方,倒數(shù)等運算功能;還要實現(xiàn)數(shù)據(jù)的輸入,輸出,計算,顯示及程序退出等功能。另外還可以實現(xiàn)多種科學(xué)計算的功能,如:三角函數(shù)的計算,弧度與角度間的轉(zhuǎn)換,對數(shù)指數(shù)的計算等等。3 功能說明它的設(shè)計按軟件工程的方法進(jìn)行,系統(tǒng)具有良好的界面;必

9、要的交互信息;簡約美觀的效果。使用人員能快捷簡單地進(jìn)行操作。即可單機(jī)按鈕進(jìn)行操作,也可直接通過鍵盤直接輸入。即時準(zhǔn)確地獲得需要的計算的結(jié)果,充分降低了數(shù)字計算的難度和節(jié)約了時間,對人們的生活有一定的幫助。(1)包含的功能有:加、減、乘、除運算,開方、求倒數(shù)等功能1(2)計算器上數(shù)字09為一個控件數(shù)組,加、減、乘、除為一個控件數(shù)組,其余為單一的控件。(3)給對話框添加菜單。(4)制定高級按鈕控件,該按鈕具有不規(guī)則的形狀,可以根據(jù)用戶鼠標(biāo)的位置和單擊狀態(tài)的不同,顯示不同的顏色3。(5)制定高級編輯控件,該編輯控件可以指定文本文字的字體和顏色。(6)輸入的原始數(shù)據(jù)、運算中間數(shù)據(jù)和結(jié)果都顯示在窗口頂部

10、的同一個標(biāo)簽中。(7)實現(xiàn)對話框的擴(kuò)展功能2。(8)計算功能基本上是用系統(tǒng)內(nèi)部函數(shù)。(9)程序可以能自動判斷輸入數(shù)據(jù)的正確性,保證不出現(xiàn)多于一個小數(shù)點、以0開頭等不正?,F(xiàn)象。(10)“CE”按鈕可以清除所有已輸入的數(shù)據(jù)從頭計算功能模塊的實現(xiàn):(1)首先,添加高級按鈕控件類,在這個類中實現(xiàn)高級的按鈕控件。在此類中對于所有的對于按鈕的繪制工作都是在DrawItem函數(shù)中完成的,實現(xiàn)按鈕對鼠標(biāo)不同的位置和動作改變不同的顏色,并且按鈕的客戶區(qū)域變成一個橢圓。(2)其次,添加一個高級編輯控件類,在此類的基礎(chǔ)上實現(xiàn)高級編輯控件。在OnDisplay函數(shù)中設(shè)置編輯框的顯示文本,再調(diào)用OnDraw函數(shù)將其顯示

11、出來,并用指定的畫刷填充客戶區(qū),并且用指定的顏色繪制顯示文本。(3)最后,實現(xiàn)主對話框界面功能,主要是加載菜單資源和對話框擴(kuò)展功能的實現(xiàn)。在CCalculatorDlg:OnCreate函數(shù)中設(shè)定對話框的初始大小與位置,可以在這個對話框中進(jìn)行窗口風(fēng)格修改,位置設(shè)置等操作,然后添加菜單項ID_EXTEND的響應(yīng)函數(shù)OnExtend。4 系統(tǒng)的實現(xiàn)4.1窗體設(shè)計利用MFC AppWinzard生成計算器應(yīng)用程序框架具體步驟如下:(1)執(zhí)行VC程序,選擇File|New命令,彈出New對話框.單擊Projects標(biāo)簽,轉(zhuǎn)到Projects選項卡,選擇MFC AppWizard(exe)選項,然后在P

12、roject name文本框中輸入Calculator 。Lacation文本框是指項目的本地路徑。(2)單擊OK按鈕,彈出MFC AppWinzard_Step1對話框。選中單選按鈕,如圖所示。(3)單擊Next按鈕,彈出MFC AppWinzard_Step2 of4對話框,如圖所示。(4)單擊Next按鈕,彈出MFC AppWinzard_Step3 of4對話框,如圖所示。(5)單擊Next按鈕,彈出MFC AppWinzard_Step4 of4對話框,如圖所示。單擊Finish按鈕,創(chuàng)建框架。4.2編輯資源(1)編輯對話框及控件資源利用Visual C+提供的資源編輯器對對話框資源

13、進(jìn)行編輯。刪除對話框中默認(rèn)的OK和Cancel按鈕。添加一個Edit控件,其控件ID為IDC_DSPEDIT。添加若干按鈕控件,其ID如表4-1所示。表4-1 按鈕控件資源清單按鈕名稱按鈕ID用途0BTN_0按鍵01BTN_1按鍵12BTN_2按鍵23BTN_3按鍵34BTN_4按鍵45BTN_5按鍵56BTN_6按鍵67BTN_7按鍵78BTN_8按鍵89BTN_9按鍵9。BTN_10小數(shù)點=BTN_11求值+BTN_12加號-BTN_13減號*BTN_14乘號/BTN_15除號CEBTN_16清屏SqrtBTN_17開方1/xBTN_18倒數(shù)sinBTN_19正弦cosBTN_20余弦ta

14、nBTN_21正切x2BTN_22平方x3BTN_23立方xyBTN_24以X為底的y次冪expBTN_25以e為底的冪lnBTN_26以e為底的對數(shù)logBTN_27對數(shù)-/+BTN_29正負(fù)號10xBTN_3010的x次方n!BTN_31N的階層添加2個單選按鈕,按鈕資源清單如下表4-2單選按鈕控件資源清單控件名設(shè)置IDDEGREEBTN_DEGREERADIANBTN_RAD添加4個靜態(tài)框,將編輯控件,普通計算,高級計算分別分組。其效果如圖4-1所示。圖4-1編輯對話框資源(2)編輯菜單資源在Visual C+中的Workspace工具欄中,選中ResourceView選項卡。在其中的M

15、enu項上右擊,在彈出的快捷菜單中選擇Insert命令,如圖4-2所示。圖4-2添加菜單資源將添加的菜單資源的ID更改為IDR_MENU。利用資源編輯器對菜單進(jìn)行編輯,編輯后的菜單如圖4-3所示。圖4-3 編輯菜單資源4.3 實現(xiàn)高級按鈕控件類利用ClassWizard添加一個新類,如圖4-5所示。圖4-5添加CAdvButton類(1)添加成員變量和成員函數(shù) 為實現(xiàn)高級按鈕控件對鼠標(biāo)的移動和單擊作出相應(yīng)的顏色變化。首先在CAdvButton的頭文件中加入幾種預(yù)定義顏色,其代碼如下:#define DesiableColor RGB(192,192,192) /灰色, 按鈕不可用#define

16、 FocusColor RGB(255,0,0) /紅色, 按鈕擁有焦點#define SelectColor RGB(0,255,0) /綠色, 按鈕被按下#define DefaultColor RGB(0,0,255) /藍(lán)色, 默認(rèn)#define TextColor RGB(128,128,128) /淺灰色, 文本顏色接下來,添加成員變量:public:CRect m_ClientRect; /用來保存按鈕的客戶的矩形區(qū)域CRgn m_ClientRgn ; /用來保存按鈕的客戶區(qū)域,非矩形UINT m_State;/按鈕所處狀態(tài)CPoint m_Point; /當(dāng)前鼠標(biāo)位置BOOL

17、 m_IsTimerOn; /標(biāo)識計時器是否已經(jīng)打開利用ClassWizard添加消息映射和響應(yīng)函數(shù):圖4-6添加響應(yīng)函數(shù)再利用ClassWizard覆蓋父類中的兩個關(guān)鍵的虛函數(shù):/AFX_VIRTUAL(CAdvButton)public:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);protected:virtual void PreSubclassWindow();/AFX_VIRTUAL其中對于所有的對于按鈕的繪制工作都是在DrawItem函數(shù)中完成的。(2)添加創(chuàng)建按鈕控件代碼按鈕的創(chuàng)建分兩步完成。首先,調(diào)用構(gòu)造函數(shù)

18、對按鈕對象進(jìn)行初始化;其次,調(diào)用Create函數(shù)創(chuàng)建按鈕。代碼如附錄1所示。(3)設(shè)置按鈕形狀、外觀、顏色、標(biāo)題PreSubclassWindow函數(shù)在窗口被創(chuàng)建之前就被調(diào)用,因此,在PreSubclassWindow函數(shù)中,將按鈕的風(fēng)格設(shè)為BS_OWNERDRAW。實現(xiàn)代碼如下:/修改按鈕控件風(fēng)格ModifyStyle(0,BS_OWNERDRAW|BS_PUSHBUTTON);要使按鈕能對鼠標(biāo)的移動與單擊作出不同的變化,那么按鈕就需要時刻知道鼠標(biāo)的位置與動作。所以,必須在鼠標(biāo)的單擊、彈起及移動消息的響應(yīng)函數(shù)中填加相應(yīng)的代碼,以獲取鼠標(biāo)的位置與動作。 在鼠標(biāo)左鍵按下時,得到按鈕窗口客戶區(qū)域的

19、屏幕坐標(biāo)位置和鼠標(biāo)的屏幕坐標(biāo)位置。當(dāng)鼠標(biāo)坐標(biāo)位落于窗口客戶區(qū)域內(nèi),且當(dāng)前按鈕控件處于非選中狀態(tài)時,將按鈕狀態(tài)標(biāo)識設(shè)為選中狀態(tài),即將m_State設(shè)為2。接著,調(diào)用Invalidate函數(shù),使客戶區(qū)無效,框架會自動調(diào)用DrawItem函數(shù),重繪客戶區(qū)。實現(xiàn)代碼如下:/當(dāng)鼠標(biāo)在按鈕的客戶區(qū)內(nèi)按下時,改變按鈕狀態(tài)void CAdvButton:OnLButtonDown(UINT nFlags, CPoint point) CRect rect;GetWindowRect(&rect); /得到按鈕客戶區(qū)域的屏幕坐標(biāo)位置GetCursorPos(&m_Point); /得到鼠標(biāo)的屏幕

20、坐標(biāo)位置if(rect.PtInRect(m_Point)&&(m_State != 2)m_State = 2;/2:select stateInvalidate(); /重繪客戶區(qū)CButton:OnLButtonDown(nFlags, point);在鼠標(biāo)左鍵抬起時,得到按鈕窗口客戶區(qū)域的屏幕坐標(biāo)位置和鼠標(biāo)的屏幕坐標(biāo)位置。當(dāng)鼠標(biāo)坐標(biāo)位置落于窗口客戶區(qū)域內(nèi),且當(dāng)前按鈕控件處于選中狀態(tài)時,將按鈕狀態(tài)標(biāo)識設(shè)為非選中狀態(tài),即將m_State設(shè)為1。接著,調(diào)用Invalidate函數(shù),使客區(qū)無效,框架會自動調(diào)用DrawItem函數(shù),重繪客戶區(qū)。其代碼如附錄1所示。在用戶移動鼠標(biāo)時

21、,如果計時器沒有啟動,則啟動計時器,并將計時器啟動標(biāo)識m_IsTimerOn設(shè)為TRUE。其實現(xiàn)代碼如下:if(!m_IsTimerOn) /如果計時器沒用啟動SetTimer(1000,100,NULL); /啟動計時器m_IsTimerOn = TRUE;如果鼠標(biāo)已經(jīng)移出了按鈕的客戶區(qū),則消毀計時器,并將計時器的起始標(biāo)識m_IsTimerOn設(shè)為FALSE。OnTimer函數(shù)的實現(xiàn)代碼如附錄1所示。實現(xiàn)客戶區(qū)的繪置函數(shù)DrawItem。在DrawItem函數(shù)中,首先得到窗口的有效矩形區(qū)域,在此矩形區(qū)域內(nèi)創(chuàng)建橢圓。調(diào)用SetWindowRgn函數(shù),設(shè)置窗口的有效區(qū)域為橢圓。從參數(shù)lpDraw

22、ItemStruct結(jié)構(gòu)中得到按鈕控件客戶區(qū)域的設(shè)備環(huán)境變量指針。根據(jù)按鈕當(dāng)前狀態(tài),創(chuàng)建不同的畫筆。調(diào)用設(shè)備環(huán)境類的成員函數(shù),設(shè)置背景模式為透明,選擇畫筆,在按鈕客戶區(qū)內(nèi)繪制橢圓及顯示文本。其實現(xiàn)代碼如附錄1所示。通過上面操作,按鈕已經(jīng)具有對鼠標(biāo)不同的位置和動作改變不同的顏色。并且,按鈕的客戶區(qū)域已經(jīng)是一個橢圓,而不再是一個矩形。正是下面的代碼將按鈕的客戶區(qū)域設(shè)定為橢圓形: GetClientRect(&m_ClientRect); /通到窗口的有效矩形區(qū)域m_ClientRgn.DeleteObject(); /刪除區(qū)域?qū)ο?m_ClientRgn.CreateEllipticRgn

23、Indirect(&m_ClientRect); /在矩形區(qū)域內(nèi)創(chuàng)建橢圓 /設(shè)置窗口的有效區(qū)域為橢圓 SetWindowRgn(m_ClientRgn,FALSE);至此,一個完整的高級按鈕類全部完成。其效果如圖4-7所示。圖4-7運行結(jié)果4.4實現(xiàn)高級編輯控件類利用ClassWizard添加一個新類,如圖4-8所示.圖4-8添加CAdvEdit(1)添加成員變量和成員函數(shù)為CAdvEdit類添加一個字符串類型的成員變量m_Caption,用來記錄編輯框中的文本內(nèi)容。其實現(xiàn)代碼如下:/CAdvEdit頭文件public: CString m_Caption; /編輯框文本利用AppWi

24、zard添加消息函數(shù)OnPaint。如圖4-9所示。圖4-9添加函數(shù)添加兩個public類型的成員函數(shù),分別用來繪制編輯控件客戶區(qū)和設(shè)置編輯控件的顯示文本。實現(xiàn)代碼如下:public:void OnDraw(); /繪制編輯控件客戶區(qū)void OnDisplay(LPCTSTR lpszStr); /設(shè)置編輯控件顯示文本protected:/AFX_MSG(CAvEdit)Afx_msg void OnPaint(); /WM_ON_PAINT消息的響應(yīng)函數(shù)/AFX_MSG圖4-10添加成員變量(2)添加編輯控件代碼在OnDisplay函數(shù)中設(shè)置編輯框的顯示文本。實現(xiàn)代碼如下:m_Captio

25、n = lpszStr;OnDraw();在OnPaint函數(shù)中調(diào)用自定義函數(shù)OnDraw。實現(xiàn)代碼如下:CPaintDC dc(this); / device context for paintingOnDraw();在OnDraw函數(shù)中,在編輯控件客戶區(qū)域內(nèi)繪制文本。首先,得到編輯控件客戶區(qū)的矩形域;其次,得到編輯控件客戶區(qū)的設(shè)備環(huán)境變量;接著,用指定的畫刷填充客戶區(qū),并且用指定的顏色繪制顯示文本。效果如圖4-11所示,其代碼如附錄2所示。圖4-11運行結(jié)果4.5對話框界面設(shè)計對主對話框添加成員變量和函數(shù)。主要成員變量: /CCalculatorDlg.h頭文件CButton m_DspS

26、tatic; CAdvEdit m_DspEdit; /顯示計算結(jié)果的編輯框 CMenu* m_Menu; /對話框菜單按鈕BOOL m_IsExtend; /標(biāo)志對話框是否已擴(kuò)展主要成員函數(shù): /CCalculatorDlg.h頭文件 /AFX_VIRTUAL(CCalculatorDlg)Protected:virtual void DoDataExchange(CDataExchange*pDX);/數(shù)據(jù)交換函數(shù) /AFX_VIRTUALvirtual BOOL OnInitDialog();/虛函數(shù),可覆蓋用來進(jìn)行用戶初始化操作virtual void OnOK();/虛函數(shù),覆蓋用來

27、屏蔽Enter操作/AFX_MSG(CCalculatorDlg)/響應(yīng)消息 ON_WM_CTLCOLOR,用以修改對話框及其控件顏色afx_msg HBRUSH OnCtlColor(CDC*Pdc,CWnd*pWnd,UINT nCtlColor);afx_msg void OnPaint(); /響應(yīng)消息WM_ON_PAINTafx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);/響應(yīng)消息WM_ON_CREATE/AFX_MSG除以上主要成員外,還要對每個按鈕控件定義一個CAdvButton的對象與之相關(guān)聯(lián),并為每個按鈕控件建軍立一個成員

28、函數(shù)來響應(yīng)其EN_CLICKED消息。如圖4-12所示:圖4-12為按鈕控件添加消息響應(yīng)(1)加載菜單資源在3.2節(jié)中,已經(jīng)為工程新建了一個菜單資源IDR_MENU,現(xiàn)將其添加到計算器對話框上。利用CMenu類的LoadMenu函數(shù),將菜單資源加載到內(nèi)存中。再調(diào)用SetMenu函數(shù),將菜單添加到對話框上,代碼如附錄3所示。如圖4-13所示:圖4-13運行結(jié)果(2)關(guān)聯(lián)控件與對象在CCalculatorDlg類的聲明中,已經(jīng)為編輯框、靜態(tài)框及每一個按鈕聲明了相應(yīng)類型的對象與之對應(yīng)。但這些控件與對象的關(guān)聯(lián)工作是在DoDataExchange函數(shù)中DDX_Control宏來完成的。圖4-14關(guān)聯(lián)控件

29、與對象(3)實現(xiàn)對話框擴(kuò)展功能首先在CCalculatorDlg:OnCreate函數(shù)中,設(shè)定對話框的初始大小與位置。實現(xiàn)代碼如下:CRect rect;GetWindowRect(&rect); /得到對話框的窗口區(qū)域矩形/指定窗口大小與位置:寬為186像素,高度為245像素SetWindowPos(&wndTop,0,0,186,245,SWP_NOMOVE|SWP_NOZORDER);其次,添加菜單項ID_EXTEND的響應(yīng)函數(shù)OnExtend。在OnExtend函數(shù)中,首先判斷當(dāng)前對話框狀態(tài),即是否已經(jīng)被擴(kuò)展。如果對話框已被擴(kuò)展,則收縮對話框。首先得到對話框的當(dāng)前位置,

30、將其指定為新的寬度,但高度維持不變。再將其中的編輯控件和編輯控件外的靜態(tài)框收縮到合理位置。最后將菜單項ID_EXTENDR的顯示文本設(shè)置為“擴(kuò)展”,將表示對話框是否擴(kuò)展標(biāo)識變量m_IsExtend設(shè)置為FALSE。如果對話框為非擴(kuò)展,則擴(kuò)展對話框。首先得到對話框的當(dāng)前位置,將其指定為新的寬度,但高度不變。再將其中的編輯控件和編輯控件外的靜態(tài)框收縮到合理的位置。最后將菜單項ID_EXTEND的顯示文本設(shè)置為“收縮”,將表示對話框是否擴(kuò)展的標(biāo)識變量m_IsExtend設(shè)置為TURE,實現(xiàn)代碼如附錄3所示。效果如圖4-15和4-16所示:圖4-15擴(kuò)展圖圖4-16收縮圖(4)屏蔽Enter鍵直到現(xiàn)在

31、為止,雖然計算器的界面已經(jīng)完成。但是,它還有一個缺陷:當(dāng)Enter鍵按下時,對話框應(yīng)付突然關(guān)掉。這是因為對話框默認(rèn)具有焦點的控件是OK鍵,當(dāng)Enter鍵按下時,框架會自動執(zhí)行當(dāng)前擁有焦點的控件的響應(yīng)函數(shù),所以對話框自然就關(guān)閉了。要屏蔽這一功能,只要執(zhí)行下面的代碼就可以。void CCalculatorDlg:OnOK() /CDialog:OnOK(); /屏蔽掉此句代碼(5)添加背景圖為對話框添加背景圖,以增加界面的美觀性。首先為工程添加一幅位圖資源,以作為對話框的背景。然后加入一個Static控件,將其Type屬性設(shè)為Bitmap,并為Image屬性選擇位圖資源,如圖4-17所示。圖4-1

32、7添加位圖參數(shù)設(shè)置后對話框的外觀如圖4-18所示。圖4-18運行結(jié)果圖4.6 數(shù)值計算功能的實現(xiàn)具體功能的實現(xiàn)首先添加成員變量。該計算器中所有的運算都是二元運算,即需要兩個操作數(shù),一個二元運算操作符。所以必須聲明兩個浮點數(shù),分別用來表示初始操作數(shù)和結(jié)果操作數(shù),同時,必須聲明兩個字符串類型的變量,分別用來顯示初始操作數(shù)。還需要一個整形變量來記錄當(dāng)前運算符,以及一個整形變量來記錄當(dāng)前小數(shù)點按鈕是否被單擊過。實現(xiàn)代碼如下:/CCalculatorDlg.h頭文件private:char m_buffer100;/用來存貯需要顯示的數(shù)字CString m_StrBegin;/記錄初始操作數(shù)的字符串 f

33、loat DtoR; /double m_end;/記錄結(jié)果操作數(shù)double m_begin;/記錄初始操作數(shù)int m_bit;/記錄運算符int m_IsCheckPoint;/判斷是否按下了小數(shù)點符號,當(dāng)其為0時,表示沒有按下當(dāng)數(shù)字鍵09被單擊時,則將當(dāng)前所按鍵加到初始操作數(shù)末尾,并將初始操作數(shù)顯示出來。以數(shù)字鍵盤被單擊為例,實現(xiàn)代碼如下:/以按鍵0的響應(yīng)為例,其余09的響應(yīng)完全類似m_StrBegin = m_StrBegin+"0"if (!m_IsCheckPoint) /如果小數(shù)點按下了 m_DspEdit.OnDisplay(m_StrBegin+&quo

34、t;."); else /如果小數(shù)點沒有按下m_DspEdit.OnDisplay(m_StrBegin);當(dāng)小數(shù)點鍵被單擊時,首先判斷小數(shù)點鍵是否已經(jīng)被單擊過,以及當(dāng)前初始操作數(shù)字符串是否為空。如果小數(shù)點鍵沒有被單擊過,而且當(dāng)前初始操作數(shù)字符串不為空,則將小數(shù)點追加到初始操作數(shù)末尾,并且修改小數(shù)點標(biāo)識m_IsCheckPoint為TRUE。實現(xiàn)代碼如下:if (!m_IsCheckPoint && m_StrBegin != "") /如果小數(shù)點沒有按下,且字符不為空m_StrBegin = m_StrBegin+"."m_D

35、spEdit.OnDisplay(m_StrBegin); /顯示文本m_IsCheckPoint = true; /改變標(biāo)識 當(dāng)清除鍵CE被單擊時,則對所有的成員變量進(jìn)行初始化。清除小數(shù)點標(biāo)識,將保存初始操作數(shù)和結(jié)果操作數(shù)的字符串清空,將保存初始操作數(shù)和結(jié)果操作數(shù)的浮點數(shù)清0,將當(dāng)前操作符清0。實現(xiàn)代碼如下:m_IsCheckPoint = false; /消除小數(shù)點按下標(biāo)記m_StrBegin = ""m_begin = 0.0; /清0m_end = 0.0; /清0m_bit = 0; /當(dāng)前操作符為無效操作當(dāng)任何一個運算符鍵被單擊時,首先根據(jù)當(dāng)前運算符計算運算結(jié)果

36、,再修改記錄當(dāng)前運算符的變量的值。以加號鍵被按下為例,實現(xiàn)代碼如下:/以加號為例,其余的操作符也采用類似操作Result(); /計算運算結(jié)果m_bit = 1; /設(shè)置當(dāng)前運算類型;1代表加法運算計算器的核心運算函數(shù)Result。在Result中,首先將記錄當(dāng)前操作數(shù)的字符串中保存的字符串轉(zhuǎn)化為浮點數(shù);其次根據(jù)當(dāng)前操作符的類型,選擇適當(dāng)?shù)倪\算操作;再將記錄結(jié)果操作數(shù)的浮點變量中的值轉(zhuǎn)化為字符串,并顯示在結(jié)果編輯框中。Result函數(shù)實現(xiàn)代碼如附錄3所示。5程序結(jié)果的演示5.1測試的研究與選擇測試過程中要判斷測試是否成功,要分析程序界面的變化和計算數(shù)據(jù)的結(jié)果是否正確以及各功能鍵是否能正常使用。

37、5.2 測試環(huán)境測試環(huán)境如下: 測試系統(tǒng): Windows XP測試工具: Visual Studio C+ 6.0 5.3實例測試結(jié)果首先,在運行界面測試簡單運算是否能正常運算,輸入“34+87=”見結(jié)果圖5-1所示,觀察計算結(jié)果是否正確屬實圖5-1“34+78=”的運行結(jié)果其次,展開計算器,選中“度數(shù)”輸入“30”單擊“sin”觀察結(jié)果,見圖5-2所示圖5-2“sin30°”的運行結(jié)果最后,選中“弧度”輸入“15”單擊“sin”觀察結(jié)果,見圖5-3所示圖5-3“sin15”的運行結(jié)果結(jié)束語經(jīng)過一個月的努力,課程設(shè)計基本完成了。在課程設(shè)計的實踐中,學(xué)到很多有用的知識,也積累了不少寶

38、貴的經(jīng)驗。課程設(shè)計是以一個計算器的實現(xiàn)為基礎(chǔ),掌握一個基于對話框的應(yīng)用程序的編程方法以及對話框常用控件的高級編程。在課程設(shè)計中我了解到到對話框應(yīng)用程序的編程模式、改變按鈕的客戶區(qū)形狀、在按鈕客戶區(qū)內(nèi)作圖及對話框的擴(kuò)展等知識。在此期間,遇上了不少的技術(shù)難題,但是經(jīng)過努力,通過查找資料,難題還是一個個被解決了,我從中學(xué)到了許多課堂上沒學(xué)到的東西,這使得我很高興。經(jīng)過設(shè)計的各個環(huán)節(jié),從中學(xué)到了很多,鍛煉了自己系統(tǒng)的設(shè)計的能力,從系統(tǒng)的需求到系統(tǒng)的功能,到系統(tǒng)的測試,到系統(tǒng)的發(fā)布,可以掌握到一個完全的過程,這樣對我們以后在工作中或?qū)W習(xí)中得到很好的鍛煉,為用VC+編輯軟件奠定基礎(chǔ)。本系統(tǒng)適合于運行在Mi

39、crosoft Windows 的各個版本下,包括Windows98、Windows Me、Windows2000、Windows XP等系統(tǒng)平臺下。當(dāng)然,本論文所采取的解決問題的方法并不是非常完善的,在今后的學(xué)習(xí)、工作中,將繼續(xù)研究并改進(jìn)。參考文獻(xiàn)1嚴(yán)華峰. Visual C+課程設(shè)計案例精編. 北京:中國水利水電出版社,20022張宏軍,黨留群,趙天巨Visual C+ 6.0編程案例精解北京:電子工業(yè)出版社,20053鄭阿奇,丁有和Visual C+教程北京:機(jī)械工業(yè)出版社,2006附錄1:結(jié)構(gòu)化設(shè)計源程序清單/程序名稱:AdvButton.cpp/程序功能:實現(xiàn)高級按鈕控件類。/ 程序

40、作者:范菊花/ 最后修改日期:2005-9-21/構(gòu)造函數(shù)CAdvButton:CAdvButton()/初始化m_ClientRectm_ClientRect.left = 0;m_ClientRect.top = 0;m_ClientRect.right = 0;m_ClientRect.bottom= 0;m_ClientRgn.DeleteObject(); /刪除區(qū)域?qū)ο髆_ClientRgn.CreateEllipticRgnIndirect(&m_ClientRect); /創(chuàng)建橢圓區(qū)域m_State = 0;m_Point.x = m_Point.y = 0;m_IsT

41、imerOn = FALSE;/重載父類Create函數(shù)BOOL CAdvButton:Create(LPCTSTR lpszCaption,DWORD dwStyle,const RECT& rect,CWnd *pParentWnd,UINT nID)return CButton:Create(lpszCaption, dwStyle, rect, pParentWnd, nID);/當(dāng)鼠標(biāo)在按鈕的客戶區(qū)內(nèi)彈起時,改變按鈕狀態(tài)void CAdvButton:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message

42、 handler code here and/or call defaultCRect rect;GetWindowRect(&rect); /得到按鈕客戶區(qū)域的屏幕坐標(biāo)位置GetCursorPos(&m_Point); /得到鼠標(biāo)的屏幕坐標(biāo)位置if(rect.PtInRect(m_Point)&&(m_State != 1)m_State = 1;/1:focus stateInvalidate(); /重繪客戶區(qū)CButton:OnLButtonUp(nFlags, point);/計時器消息的響應(yīng)函數(shù)void CAdvButton:OnTimer(UINT

43、 nIDEvent) / TODO: Add your message handler code here and/or call defaultCRect rect;GetWindowRect(&rect); /得到按鈕客戶區(qū)域的屏幕坐標(biāo)位置GetCursorPos(&m_Point); /得到鼠標(biāo)的屏幕坐標(biāo)位置if(rect.PtInRect(m_Point) /如果鼠標(biāo)在按鈕的客戶區(qū)內(nèi)if(m_State != 1)&&(m_State != 2)m_State = 1;Invalidate();else /如果鼠標(biāo)已經(jīng)不在按鈕的客戶區(qū)內(nèi)了if(m_Sta

44、te != 0)m_State = 0;Invalidate(); /重繪客戶區(qū)KillTimer(nIDEvent); /關(guān)閉計時器m_IsTimerOn = FALSE;CButton:OnTimer(nIDEvent);/在按鈕控件客戶區(qū)的繪置函數(shù),也是實現(xiàn)所有高級控件的關(guān)鍵void CAdvButton:DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) /get client rectGetClientRect(&m_ClientRect); /得到窗口的有效矩形區(qū)域m_ClientRgn.DeleteObject();/m_ClientR

45、gn.CreateEllipticRgnIndirect(&m_ClientRect); /在矩形區(qū)域內(nèi)創(chuàng)建橢圓/設(shè)置窗口的有效區(qū)域為橢圓 SetWindowRgn(m_ClientRgn,FALSE); CDC* pDC = CDC:FromHandle(lpDrawItemStruct->hDC);/得到按鈕控件客戶區(qū)域的設(shè)備環(huán)境變量指針CPen* pPen = NULL;switch (m_State) /根據(jù)按鈕不同的狀態(tài),創(chuàng)建不同的畫筆case 0:pPen = new CPen(PS_SOLID,1,DefaultColor);break;case 1:pPen =

46、new CPen(PS_SOLID,1,FocusColor);break;case 2:pPen = new CPen(PS_SOLID,1,SelectColor);break;case 3:pPen = new CPen(PS_SOLID,1,DesiableColor);break;pDC->SetBkMode(TRANSPARENT);/設(shè)置背景模式為透明pPen = pDC->SelectObject(pPen);pDC->Ellipse(&m_ClientRect); /在按鈕客戶區(qū)內(nèi)繪制橢圓pPen = pDC->SelectObject(pPe

47、n);if(pPen) delete pPen;LPTSTR pCaption = new charMAXCAPTIONLEN;/int iLen = GetWindowText(pCaption,MAXCAPTIONLEN);pDC->SetTextColor(TextColor); /指定文本顏色/繪制文本,作為按鈕標(biāo)題pDC->DrawText(pCaption,iLen,&m_ClientRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);附錄2:面向?qū)ο笤O(shè)計源程序清單/ 程序名稱:CAdvEdit.cpp/ 程序功能:實現(xiàn)高級編輯控件

48、類。/ 程序作者:范菊花/ 最后修改日期:2007-09-21/繪制編輯控件客戶區(qū)void CAdvEdit:OnDraw()CRect rect;GetClientRect(&rect); /得到客戶區(qū)矩形區(qū)域CDC* pDC = GetDC(); /得到編輯控件設(shè)備環(huán)境變量pDC->SetBkMode(TRANSPARENT); /設(shè)置背景模式為透明CBrush * pBrush = new CBrush(RGB(255,255,255); /創(chuàng)建白色畫刷pDC->FillRect(&rect,pBrush); /用畫刷填充客戶區(qū)pDC->SetTextC

49、olor(RGB(92,92,92);/設(shè)置文本顏色/繪制文本,用指定的顏色和字體pDC->DrawText(m_Caption,rect,DT_SINGLELINE|DT_VCENTER|DT_RIGHT);附錄3:面向?qū)ο笤O(shè)計源程序清單/ 程序名稱:CalculatorDlg.cpp/ 程序功能:實現(xiàn)對話框界面設(shè)計和計算器數(shù)值計算功能/ 程序作者:范菊花/ 最后修改日期:2007-09-21/初始化對話框函數(shù)BOOL CCalculatorDlg:OnInitDialog()CDialog:OnInitDialog(); /調(diào)用父類的初始化代碼 /其他的初始化代碼m_Menu = n

50、ew CMenu; /m_Menu->LoadMenu(IDR_MENU); /加載菜單資源模板SetMenu(m_Menu); /將菜單添加到對話框return TRUE; /return TRUE unless you set the focus to a control/菜單命令I(lǐng)D_EXTEND的響應(yīng)函數(shù)void CCalculatorDlg:OnExtend()CRect rect;GetWindowRect(&rect);if(m_IsExtend) /如果當(dāng)前對話框已被擴(kuò)展GetWindowRect(&rect); /得到對話框的窗口區(qū)域矩形/設(shè)置對話框窗口

51、位置與大小;寬為186像素,高度不變SetWindowPos(&wndTop,0,0,186,rect.Height(),SWP_NOMOVE|SWP_NOZORDER); /得到編輯框的窗口區(qū)域矩形m_DspEdit.GetWindowRect(&rect);/設(shè)置編輯框窗口位置與大小;寬為155像素,高度不變m_DspEdit.SetWindowPos(NULL,rect.left,rect.top,155,rect.Height(),SWP_NOMOVE|SWP_NOZORDER); /得到靜態(tài)框的窗口區(qū)域矩形m_DspStatic.GetWindowRect(&

52、rect);/設(shè)置表態(tài)框窗口位置與大小m_DspStatic.SetWindowPos(NULL,rect.left,rect.top,168,rect.Height(),SWP_NOMOVE|SWP_NOZORDER); /更改菜單項顯示文本m_Menu->ModifyMenu(ID_EXTEND,MF_BYCOMMAND|MF_STRING,ID_EXTEND,"擴(kuò)展");m_IsExtend = FALSE;else/設(shè)置對話框窗口位置與大小:寬為330像素,高度不變SetWindowPos(&wndTop,0,0,330,rect.Height(),S

53、WP_NOMOVE|SWP_NOZORDER); /得到編輯框的窗口區(qū)域矩形m_DspEdit.GetWindowRect(&rect); /設(shè)置編輯框窗口位置與大小:寬為155像素,高度不變m_DspEdit.SetWindowPos(NULL,rect.left,rect.top,155,rect.Height(),SWP_NOMOVE|SWP_NOZORDER); /得到靜態(tài)框的窗口區(qū)域矩形m_DspStatic.GetWindowRect(&rect);/設(shè)置靜態(tài)框窗口位置與大小m_DspStatic.SetWindowPos(NULL,rect.left,rect.t

54、op,168,rect.Height(),SWP_NOMOVE|SWP_NOZORDER);/更改菜單項顯示文本m_Menu->ModifyMenu(ID_EXTEND,MF_BYCOMMAND|MF_STRING,ID_EXTEND,"標(biāo)準(zhǔn)");m_IsExtend = TRUE;/角度和弧度間轉(zhuǎn)換的實現(xiàn)void CCalculatorDlg:OnRad() m_isDegree=1;DtoR=1;UpdateData(TRUE);void CCalculatorDlg:OnDegree() m_isDegree=0;DtoR=(2*PI)/360;UpdateData(FALSE);/按鍵1-9的響應(yīng)void CCalculatorDlg:AdvButton1()/按下1鍵時的處理函數(shù)m_StrBegin = m_StrBegin+"1"

溫馨提示

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

評論

0/150

提交評論