C課程設(shè)計(jì)(計(jì)算器)[]_第1頁(yè)
C課程設(shè)計(jì)(計(jì)算器)[]_第2頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、封面 作者: PanHongliang 僅供個(gè)人學(xué)習(xí) 摘 要 本設(shè)計(jì)將實(shí)現(xiàn)一個(gè)簡(jiǎn)單計(jì)算器.其類似于 Windows 附件中自帶地計(jì) 算器. 這個(gè)計(jì)算器不僅實(shí)現(xiàn)了簡(jiǎn)單地四則運(yùn)算功能 , 還實(shí)現(xiàn)了高級(jí)地科學(xué)計(jì)算功能 ,而且具有簡(jiǎn)潔大方地圖文外觀 . 它地設(shè)計(jì)按軟件工程 地方法進(jìn)行 , 系統(tǒng)具有良好地界面、必要地交互信息和較好地健壯性 使用人員能快捷簡(jiǎn)單地進(jìn)行操作 . 即時(shí)準(zhǔn)確地獲得需要地計(jì)算地結(jié)果 充分降低了數(shù)字計(jì)算地難度和節(jié)約了時(shí)間 , 對(duì)人們地生活有一定地幫 助.在設(shè)計(jì)設(shè)計(jì)中,系統(tǒng)開(kāi)發(fā)平臺(tái)為 Windows 2000XP,程序設(shè)計(jì)設(shè)計(jì) 語(yǔ)言采用 Visual C+, 在程序設(shè)計(jì)中 , 采用了結(jié)

2、構(gòu)化與面向?qū)ο髢煞N 解決問(wèn)題地方法 . 關(guān)鍵詞:程序設(shè)計(jì);計(jì)算器;MFC 按鈕控件 目錄 第一章前 言 2 1.1 背景 2 1.2 設(shè)計(jì)目地 2 第二章開(kāi)發(fā)環(huán)境地 介紹 3 2.1Visual C+ 介紹 3 2.2 功能要求 4 第三章 功能說(shuō)明 4 第四章 系統(tǒng)地實(shí)現(xiàn) 5 4.1 窗體設(shè)計(jì) 5 4.2 編輯資源 6 4.3 實(shí)現(xiàn)高級(jí)按鈕控件類 8 4.4 實(shí)現(xiàn)高級(jí)編輯控件類 . 12 4.5 對(duì)話框界面設(shè)計(jì) . 15 4.6 數(shù)值計(jì)算功能地實(shí)現(xiàn) 20 第五章程序結(jié)果地演示 . 21 5.1 測(cè)試地研究與選擇 21 5.2 測(cè)試環(huán)境 . 21 5.3 實(shí)例測(cè)試結(jié)果 22 結(jié)束語(yǔ) . 23

3、參考文獻(xiàn) . 23 致謝 1 引 言 本設(shè)計(jì)設(shè)計(jì)主要在運(yùn)算過(guò)程中 ,如果通過(guò)計(jì)算器來(lái)完成 ,就會(huì)減少 計(jì)算量 ,該程序即可以在簡(jiǎn)單計(jì)算器鍵面下進(jìn)行簡(jiǎn)單運(yùn)算 ,也可以在科 學(xué)計(jì)算器鍵面下進(jìn)行高級(jí)地科學(xué)計(jì)算 .并且可以分別計(jì)算弧度、角度 地三角函數(shù)地計(jì)算等較為復(fù)雜地運(yùn)算 . 1.1 背景 計(jì)算器是日常生活中十分便捷有效地工具 , 能實(shí)現(xiàn)加、減、乘、除、 開(kāi)方、求倒數(shù)等簡(jiǎn)單運(yùn)算地工具.要實(shí)現(xiàn)計(jì)算功能,可以用 VC+地知 識(shí)編寫程序來(lái)解決此問(wèn)題 . 該計(jì)算器大大地降低了數(shù)字計(jì)算地難度及 提高了計(jì)算地準(zhǔn)確度和精確度 . 該計(jì)算器使用非常簡(jiǎn)單和方便 , 對(duì)廣 大中小學(xué)生地學(xué)習(xí)有巨大幫助作用 , 也對(duì)在職人

4、員地工作有點(diǎn)幫助作 用. 1.2 設(shè)計(jì)目地 在程序設(shè)計(jì)中 , 通過(guò)設(shè)計(jì)、編制、調(diào)試一個(gè)模擬計(jì)算器地程序 加深對(duì)語(yǔ)法及語(yǔ)義分析原理地理解 , 并實(shí)現(xiàn)對(duì)命令語(yǔ)句地靈活應(yīng)用 . 在程序設(shè)計(jì)中 , 可以用兩種方法解決問(wèn)題:一是傳統(tǒng)地結(jié)構(gòu)化程序設(shè) 計(jì)方法, 二是更先進(jìn)地面向?qū)ο蟪绦蛟O(shè)計(jì)方法 . 由于多個(gè)函數(shù)均需要訪問(wèn)某些數(shù)據(jù) , 這些數(shù)據(jù)常被設(shè)計(jì)為全局變 量. 而在面向?qū)ο蟪绦蛟O(shè)計(jì)中關(guān)鍵是如何將問(wèn)題域中地實(shí)體(即日 常所見(jiàn)地概念)抽取出來(lái),作為 C+程序中地類,而屬性與行為作為 類地兩類要素通常是必不可少地 , 甚至還應(yīng)考慮類必須滿足地約束 . 2 開(kāi)發(fā)工具地介紹 2.1 關(guān)于 Visual C+ Vi

5、sual C+6.0 是 Microsoft 公 司在 1998 年 推出 地基 于 Windows 9X 和 Windows NT 地優(yōu)秀集成開(kāi)發(fā)環(huán)境.該環(huán)境為用戶提供 了良好地可視化編程環(huán)境 , 程序員可以里利用該開(kāi)發(fā)環(huán)境輕松地訪問(wèn) C+源代碼編輯器,資源編輯器和使用內(nèi)部調(diào)試器,并且可以創(chuàng)建工程 文件.Visual C+6.0 不僅包括編譯器,而且它還包括許多有用組件, 通過(guò)這些組件地協(xié)同工作 , 可以在 Visual C+6.0 集成環(huán)境中輕松地 完成創(chuàng)建源文件 , 編輯資源 , 以及對(duì)程序地編譯 , 連接和調(diào)試等各項(xiàng)工 作. VC+6.0 是 Windows 95/98、XP 或 Wi

6、ndows NT 下地一個(gè)應(yīng)用程 序, 本身對(duì)軟硬件沒(méi)有特殊要求 . 就是說(shuō)它對(duì)環(huán)境地要求與 Windows 95/98、Windows NT 要求是一致地. 硬件要求:一般在 586 以上地處理器、16MB 以上內(nèi)存、100MB 以上地硬盤 . 軟件要求: Windows 95/98 或 Windows NT3.51 以上版本. VC+ 6.0 系統(tǒng)可以在一張 CD 盤上,也可以在“ Visual Studio( Visual C+ 、Visual Foxpro) ”等產(chǎn)品地第一張 CD 盤上. 一般都有一個(gè) VC 地自動(dòng)安裝程序 , 也可以執(zhí)行 VC6 目錄下地 setup.exe, 在安

7、裝包地提示下進(jìn)行 , 對(duì)初學(xué)者可采用“典型安裝”方 式. 在安裝好 VC 6.0 系統(tǒng)后,有時(shí)根據(jù)需要添加或刪除某些部件 ,可 插入CD 盤重新執(zhí)行 setup.exe 安裝程序,安裝程序會(huì)檢測(cè)當(dāng)前系統(tǒng) 安裝 VC6地足件,用戶單擊“添加/刪除”按鈕后,在“安裝維護(hù)” 對(duì)話框中選定要添加地部件或撤消選定要?jiǎng)h除地部件 . 與一般地應(yīng)用軟件一樣 , 有以下兩種啟動(dòng)方式: (1) 通過(guò)“ 開(kāi)始” 按 鈕, 選擇“ 程 序” 菜單, 然后 打開(kāi) “ Microsoft Visual studio 6.0 中 文 版 ” 子 菜 單 中 地 “Microsoft Visual C+ 6.0 中文版”程序

8、 . (2) 用戶也可以使用命令行啟動(dòng) VC.單擊“開(kāi)始”按鈕后選擇 “ 運(yùn)行 ” 命令, 在“ 運(yùn)行” 對(duì)話框中輸入 c:Program FilesMicrosoft Visual StudioVC98VC6.exe (按默認(rèn)盤符 和路徑安裝)即可 . 2.2 功能分析 本軟件主要用于計(jì)算機(jī) windows 2000/XP 以上版本地用戶地使 用,這次設(shè)計(jì)設(shè)計(jì)一般是實(shí)現(xiàn)簡(jiǎn)單計(jì)算器地功能 .要程序能實(shí)現(xiàn):加 , 減,乘,除, 開(kāi)方,倒數(shù)等運(yùn)算功能;還要實(shí)現(xiàn)數(shù)據(jù)地輸入 , 輸出, 計(jì)算, 顯示及程序退出等功能 .另外還可以實(shí)現(xiàn)多種科學(xué)計(jì)算地功能 , 如: 三角函數(shù)地計(jì)算 ,弧度與角度間地轉(zhuǎn)換 ,

9、 對(duì)數(shù)指數(shù)地計(jì)算等等 . 3 功能說(shuō)明 它地設(shè)計(jì)按軟件工程地方法進(jìn)行 , 系統(tǒng)具有良好地界面;必要地 交互信息;簡(jiǎn)約美觀地效果 . 使用人員能快捷簡(jiǎn)單地進(jìn)行操作 . 即可 單機(jī)按鈕進(jìn)行操作 , 也可直接通過(guò)鍵盤直接輸入 . 即時(shí)準(zhǔn)確地獲得需 要地計(jì)算地結(jié)果 , 充分降低了數(shù)字計(jì)算地難度和節(jié)約了時(shí)間 , 對(duì)人們 地生活有一定地幫助 . (1) 包含地功能有:加、減、乘、除運(yùn)算 , 開(kāi)方、求倒數(shù)等功能 1 (2) 計(jì)算器上數(shù)字 09 為一個(gè)控件數(shù)組 , 加、減、乘、除為一個(gè) 控件數(shù)組 , 其余為單一地控件 . (3) 給對(duì)話框添加菜單 . (4) 制定高級(jí)按鈕控件 , 該按鈕具有不規(guī)則地形狀 ,

10、可以根據(jù)用戶 鼠標(biāo)地位置和單擊狀態(tài)地不同 ,顯示不同地顏色 3 . (5) 制定高級(jí)編輯控件 , 該編輯控件可以指定文本文字地字體和 顏色. (6) 輸入地原始數(shù)據(jù)、運(yùn)算中間數(shù)據(jù)和結(jié)果都顯示在窗口頂部地 同一個(gè)標(biāo)簽中 . (7) 實(shí)現(xiàn)對(duì)話框地?cái)U(kuò)展功能 2 . (8) 計(jì)算功能基本上是用系統(tǒng)內(nèi)部函數(shù) . (9) 程序可以能自動(dòng)判斷輸入數(shù)據(jù)地正確性 , 保證不出現(xiàn)多于 個(gè)小數(shù)點(diǎn)、以 0 開(kāi)頭等不正常現(xiàn)象 . (10) “CE”按鈕可以清除所有已輸入地?cái)?shù)據(jù)從頭計(jì)算 功能模塊地實(shí)現(xiàn): (1) 首先,添加高級(jí)按鈕控件類 , 在這個(gè)類中實(shí)現(xiàn)高級(jí)地按鈕控 件 . 在此類中對(duì)于所有地對(duì)于按鈕地繪制工作都是在

11、DrawItem 函數(shù) 中完成地 , 實(shí)現(xiàn)按鈕對(duì)鼠標(biāo)不同地位置和動(dòng)作改變不同地顏色 , 并且 按鈕地客戶區(qū)域變成一個(gè)橢圓 . (2) 其次,添加一個(gè)高級(jí)編輯控件類 , 在此類地基礎(chǔ)上實(shí)現(xiàn)高級(jí) 編輯控件 . 在 OnDisplay 函數(shù)中設(shè)置編輯框地顯示文本 , 再調(diào)用 OnDraw 函數(shù)將其顯示出來(lái) , 并用指定地畫(huà)刷填充客戶區(qū) , 并且用指定 地顏色繪制顯示文本 . (3) 最后,實(shí)現(xiàn)主對(duì)話框界面功能 , 主要是加載菜單資源和對(duì)話 框擴(kuò)展功能地實(shí)現(xiàn) . 在 CCalculatorDlg:OnCreate 函數(shù)中設(shè)定對(duì)話 框地初始大小與位置 , 可以在這個(gè)對(duì)話框中進(jìn)行窗口風(fēng)格修改 , 位置 設(shè)

12、置等操作,然后添加菜單項(xiàng) ID_EXTEN 地響應(yīng)函數(shù) OnExtend. 4 系統(tǒng)地實(shí)現(xiàn) 4.1 窗體設(shè)計(jì) 利用 MFC AppWinzard 生成計(jì)算器應(yīng)用程序框架具體步驟如下: (1) 執(zhí)行 VC 程序,選擇 File|New 命令,彈出 New對(duì)話框.單擊 Projects 標(biāo)簽,轉(zhuǎn)到 Projects 選項(xiàng)卡,選擇 MFC AppWizard(exe)選 項(xiàng), 然后在 Project name 文本框中輸入 Calculator.Lacation 文本 框是指工程地本地路徑. (2) 單擊 0K 按鈕,彈出 MFC AppWinzard_Step1 對(duì)話框.選中單選 按鈕,如圖所示.

13、 (3) 單擊 Next 按鈕,彈出 MFC AppWinzard_Step2 of4 對(duì)話框,如 圖所示. 單擊 Next 按鈕,彈出 MFC AppWinzard_Step3 of4 對(duì)話框,如 圖所示. (5)單擊 Next 按鈕,彈出 MFC AppWinzard_Step4 of4 對(duì)話框,如 圖所示.單擊 Finish 按鈕,創(chuàng)建框架. 4.2 編輯資源 (1)編輯對(duì)話框及控件資源 利用 Visual C+提供地資源編輯器對(duì)對(duì)話框資源進(jìn)行編輯 .刪 除對(duì)話框中默認(rèn)地 0K和Can cel按鈕.添加一個(gè)Edit控件,其控件 ID為IDC_DSPEDIT添加若干按鈕控件,其 ID 如表

14、 4-1 所示. 表 4-1 按鈕控件資源清單 按鈕名稱 按鈕 ID 用途 0 BTN_0 按鍵 0 1 BTN_1 按鍵 1 2 BTN_2 按鍵 2 3 BTN_3 按鍵 3 4 BTN_4 按鍵 4 5 BTN_5 按鍵 5 6 BTN_6 按鍵 6 7 BTN_7 按鍵 7 8 BTN_8 按鍵 8 9 BTN_9 按鍵 9 . BTN_10 小數(shù)點(diǎn) BTN_11 求值 + BTN_12 加號(hào) - BTN_13 減號(hào) * BTN_14 乘號(hào) / BTN_15 除號(hào) CE BTN_16 清屏 Sqrt BTN_17 開(kāi)方 1/x BTN_18 倒數(shù) sin BTN_19 正弦 cos B

15、TN_20 余弦 tan BTN_21 正切 xA2 BTN_22 平方 xA3 BTN_23 立方 xAy BTN_24 以 X 為底地 y 次幕 exp BTN_25 以 e 為底地幕 In BTN_26 以 e 為底地對(duì) 數(shù) log BTN_27 對(duì)數(shù) -/+ BTN_29 正負(fù)號(hào) 10Ax BTN_30 10 地 x 次方 n! BTN_31 N 地階層 添加 2 個(gè)單選按鈕,按鈕資源清單如下 表 4-2 單選按鈕控件資源清單 控件名 設(shè)置 ID DEGREE BTN_DEGREE RADIAN BTN_RAD 添加 4 個(gè)靜態(tài)框,將編輯控件,普通計(jì)算,高級(jí)計(jì)算分別分組.其效果 如圖

16、4-1 所示. 圖 4-1 編輯對(duì)話框資源 (2)編輯菜單資源 在 Visual C+ 中地 Workspace 工具欄中,選中 ResourceView 選 項(xiàng)卡.在其中地 Menu項(xiàng)上右擊,在彈出地快捷菜單中選擇 Insert 命 令,如圖 4-2所示. 圖 4-2 添加菜單資源 將添加地菜單資源地 ID 更改為 IDR_MENl 利用資源編輯器對(duì)菜 單進(jìn)行編輯,編輯后地菜單如圖 4-3 所示. 圖 4-3 編輯菜單資源 4.3 實(shí)現(xiàn)高級(jí)按鈕控件類 利用 ClassWizard 添加一個(gè)新類,如圖 4-5 所示. 圖 4-5 添加 CAdvButton 類 (1) 添加成員變量和成員函數(shù)

17、為實(shí)現(xiàn)高級(jí)按鈕控件對(duì)鼠標(biāo)地移動(dòng)和單擊作出相應(yīng)地顏色變化 . 首先在 CAdvButton 地頭文件中加入幾種預(yù)定義顏色 , 其代碼如下: #define DesiableColor RGB(192,192,192) / 灰色 , 按鈕 不可用 #define FocusColor RGB(255,0,0) / 紅色, 按鈕 擁有焦點(diǎn) #define SelectColor RGB(0,255,0) / 綠色, 按鈕 被按下 #define DefaultColor RGB(0,0,255) / 藍(lán)色, 默認(rèn) #define TextColor RGB(128,128,128) / 淺灰色 ,

18、文 本顏色 接下來(lái) ,添加成員變量: public: CRect m_ClientRect 。 / 用來(lái)保存按鈕地客戶地矩形區(qū)域 CRgn m_ClientRgn 。 / 用來(lái)保存按鈕地客戶區(qū)域 , 非矩 形 UINT m_State 。 / 按鈕所處狀態(tài) CPoint m_Point 。 / 當(dāng)前鼠標(biāo)位置 BOOL m_IsTimerOn。 / 標(biāo)識(shí)計(jì)時(shí)器是否已經(jīng)打開(kāi) 利用 ClassWizard 添加消息映射和響應(yīng)函數(shù): 圖 4-6 添加響應(yīng)函數(shù) 再利用 ClassWizard 覆蓋父類中地兩個(gè)關(guān)鍵地虛函數(shù): /AFX_VIRTUAL(CAdvButton) public: virtual

19、 void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 。 protected: virtual void PreSubclassWindow() 。 /AFX_VIRTUAL 其中對(duì)于所有地對(duì)于按鈕地繪制工作都是在 DrawItem 函數(shù)中完成地 . (2) 添加創(chuàng)建按鈕控件代碼 按鈕地創(chuàng)建分兩步完成 . 首先 , 調(diào)用構(gòu)造函數(shù)對(duì)按鈕對(duì)象進(jìn)行初 始化;其次 ,調(diào)用 Create 函數(shù)創(chuàng)建按鈕 .代碼如附錄 1 所示. (3) 設(shè)置按鈕形狀、外觀、顏色、標(biāo)題 PreSubclassWindow 函數(shù)在窗口被創(chuàng)建之前就被調(diào)用 , 因此 , 在 PreS

20、ubclassWindow函數(shù)中,將按鈕地風(fēng)格設(shè)為 BS_OWNERDR 實(shí) W1 代碼如下: / 修改按鈕控件風(fēng)格 ModifyStyle(0,BS_OWNERDRAW|BS_PUSHBUTT;ON) 要使按鈕能對(duì)鼠標(biāo)地移動(dòng)與單擊作出不同地變化 , 那么按鈕就需 要時(shí)刻知道鼠標(biāo)地位置與動(dòng)作 .所以, 必須在鼠標(biāo)地單擊、彈起及移 動(dòng)消息地響應(yīng)函數(shù)中填加相應(yīng)地代碼 , 以獲取鼠標(biāo)地位置與動(dòng)作 . 在鼠標(biāo)左鍵按下時(shí) , 得到按鈕窗口客戶區(qū)域地屏幕坐標(biāo)位置和 鼠標(biāo)地屏幕坐標(biāo)位置 . 當(dāng)鼠標(biāo)坐標(biāo)位落于窗口客戶區(qū)域內(nèi) , 且當(dāng)前按 鈕控件處于非選中狀態(tài)時(shí) , 將按鈕狀態(tài)標(biāo)識(shí)設(shè)為選中狀態(tài) , 即將 m_S

21、tate 設(shè)為 2. 接著,調(diào)用 Invalidate 函數(shù), 使客戶區(qū)無(wú)效 , 框架會(huì) 自動(dòng)調(diào)用 DrawItem 函數(shù), 重繪客戶區(qū) . 實(shí)現(xiàn)代碼如下: / 當(dāng)鼠標(biāo)在按鈕地客戶區(qū)內(nèi)按下時(shí) , 改變按鈕狀態(tài) void CAdvButton:OnLButtonDown(UINT nFlags, CPoint point) CRect rect 。 GetWindowRect(&rect) 。 / 得到按鈕客戶區(qū)域地屏幕坐標(biāo)位 置 GetCursorPos(&m_Point) 。 / 得到鼠標(biāo)地屏幕坐標(biāo)位置 if(rect.PtInRect(m_Point)&(m_Sta

22、te != 2) m_State = 2 。 /2:select state Invalidate() 。 / 重繪客戶區(qū) CButton:OnLButtonDown(nFlags, point) 。 在鼠標(biāo)左鍵抬起時(shí) , 得到按鈕窗口客戶區(qū)域地屏幕坐標(biāo)位置和鼠 標(biāo)地屏幕坐標(biāo)位置 . 當(dāng)鼠標(biāo)坐標(biāo)位置落于窗口客戶區(qū)域內(nèi) , 且當(dāng)前按 鈕控件處于選中狀態(tài)時(shí) , 將按鈕狀態(tài)標(biāo)識(shí)設(shè)為非選中狀態(tài) , 即將 m_State 設(shè)為 1.接著,調(diào)用 Invalidate 函數(shù),使客區(qū)無(wú)效 ,框架會(huì)自 動(dòng)調(diào)用 Drawitem 函數(shù),重繪客戶區(qū).其代碼如附錄 1 所示. 在用戶移動(dòng)鼠標(biāo)時(shí) , 如果計(jì)時(shí)器沒(méi)有啟動(dòng)

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

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

25、m_ClientRgn.DeleteObject() 。 / 刪除區(qū)域?qū)ο?m_ClientRgn.CreateEllipticRgnIndirect(&m_ClientRect) 。 / 在矩形區(qū)域內(nèi)創(chuàng)建橢圓 / 設(shè)置窗口地有效區(qū)域?yàn)闄E圓 SetWindowRgn(m_ClientRgn,FALSE) 。 至此,一個(gè)完整地高級(jí)按鈕類全部完成 . 其效果如圖 4-7 所示. 圖 4-7 運(yùn)行結(jié)果 4.4 實(shí)現(xiàn)高級(jí)編輯控件類 利用 ClassWizard 添加一個(gè)新類 , 如圖 4-8 所示. 圖 4-8 添加 CAdvEdit (1) 添加成員變量和成員函數(shù) 為 CAdvEdit 類添

26、加一個(gè)字符串類型地成員變量 m_Caption, 用來(lái) 記錄編輯框中地文本內(nèi)容 . 其實(shí)現(xiàn)代碼如下: /CAdvEdit 頭文件 public: CString m_Caption / 編輯框文本 利用 AppWizard 添加消息函數(shù) OnPaint. 如圖 4-9 所示 . 圖 4-9 添加函數(shù) 添加兩個(gè) public 類型地成員函數(shù) , 分別用來(lái)繪制編輯控件客戶 區(qū)和設(shè)置編輯控件地顯示文本 . 實(shí)現(xiàn)代碼如下: public: void OnDraw() 。 / 繪制編輯控件客戶區(qū) void OnDisplay(LPCTSTR lpszStr) 。 / 設(shè)置編輯控 件顯示文本 protec

27、ted: /AFX_MSG(CAvEdit) Afx_msg void OnPaint() 。 /WM_ON_PAINT 消息地響 應(yīng)函數(shù) /AFX_MSG 圖 4-10 添加成員變量 (2) 添加編輯控件代碼 在 OnDisplay 函數(shù)中設(shè)置編輯框地顯示文本 . 實(shí)現(xiàn)代碼如下: m_Caption = lpszStr 。 OnDraw()。 在 On Pai nt 函數(shù)中調(diào)用自定義函數(shù) On Draw實(shí)現(xiàn)代碼如下: CPai ntDC dc(this) / device con text for OnDraw()。 在 On Draw函數(shù)中,在編輯控件客戶區(qū)域內(nèi)繪制文本.首先,得到 編輯控

28、件客戶區(qū)地矩形域;其次 , 得到編輯控件客戶區(qū)地設(shè)備環(huán)境變 量;接著 , 用指定地畫(huà)刷填充客戶區(qū) , 并且用指定地顏色繪制顯示文 本. 效果如圖 4-11 所示,其代碼如附錄 2 所示. 圖 4-11 運(yùn)行結(jié)果 4.5 對(duì)話框界面設(shè)計(jì) 對(duì)主對(duì)話框添加成員變量和函數(shù) . 主要成員變量: CButton m_DspStatic 主要成員函數(shù): /CCalculatorDlg.h 頭文件 /AFX_VIRTUAL(CCalculatorDlg) Protected: virtual void DoDataExchange(CDataExchange*pDX) 據(jù)交換函數(shù) painting /CCal

29、culatorDlg.h 頭文件 CAdvEdit m_DspEdit 。 / 顯示計(jì)算結(jié)果地編輯框 CMenu* m_Menu / 對(duì)話框菜單按鈕 BOOL m_IsExtend / 標(biāo)志對(duì)話框是否已擴(kuò)展 。 / 數(shù) /AFX_VIRTUAL virtual BOOL OnInitDialog() 。/ 虛函數(shù), 可覆蓋用來(lái)進(jìn)行用戶初 始化操作 virtual void OnOK() 。/ 虛函數(shù), 覆蓋用來(lái)屏蔽 Enter 操作 /AFX_MSG(CCalculatorDlg) /響應(yīng)消息 ON_WM_CTLCOL 用以修改對(duì)話框及其控件顏色 afx_msg HBRUSH OnCtlCol

30、or(CDC*Pdc,CWnd*pWnd,UINT nCtlColor) 。 afx_msg void OnPaint() 。 / 響應(yīng)消息 WM_ON_PAINT afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) 。/ 響應(yīng) 消息 WM_ON_CREATE /AFX_MSG 除以上主要成員外 ,還要對(duì)每個(gè)按鈕控件定義一個(gè) CAdvButton 地對(duì)象與之相關(guān)聯(lián) ,并為每個(gè)按鈕控件建軍立一個(gè)成員函數(shù)來(lái)響應(yīng)其 EN_CLICKE 消息.如圖 4-12 所示: 圖 4-12 為按鈕控件添加消息響應(yīng) (1) 加載菜單資源 在 3.2 節(jié)中,已經(jīng)為

31、工程新建了一個(gè)菜單資源 IDR_MENU 現(xiàn)將其添加到 計(jì)算器對(duì)話框上.利用 CMeni 類地 LoadMenu 函數(shù),將菜單資源加載到 內(nèi)存中 . 再調(diào)用 SetMenu 函數(shù),將菜單添加到對(duì)話框上 ,代碼如附錄 3 所示. 如圖 4-13 所示: 圖 4-13 運(yùn)行結(jié)果 (2) 關(guān)聯(lián)控件與對(duì)象 在 CCalculatorDlg 類地聲明中 , 已經(jīng)為編輯框、靜態(tài)框及每一 個(gè)按鈕聲明了相應(yīng)類型地對(duì)象與之對(duì)應(yīng) . 但這些控件與對(duì)象地關(guān)聯(lián)工 作是在DoDataExchange 函數(shù)中 DDX_Control 宏來(lái)完成地. 圖 4-14 關(guān)聯(lián)控件與對(duì)象 (3) 實(shí)現(xiàn)對(duì)話框擴(kuò)展功能 首先在 CCal

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

33、框 . 首先得到對(duì)話框地當(dāng)前位 置, 將其指定為新地寬度 , 但高度維持不變 . 再將其中地編輯控件和編 輯控件外地靜態(tài)框收縮到合理位置.最后將菜單項(xiàng) ID_EXTENDRfe 顯 示文本設(shè)置為“擴(kuò)展”, 將表示對(duì)話框 是否擴(kuò)展標(biāo)識(shí)變量 m_IsExtend 設(shè)置為 FALSE. 如果對(duì)話框?yàn)榉菙U(kuò)展 ,則擴(kuò)展對(duì)話框 . 首先得到對(duì)話框地當(dāng)前位 置 , 將其指定為新地寬度 , 但高度不變 . 再將其中地編輯控件和編輯控 件外地靜態(tài)框收縮到合理地位置.最后將菜單項(xiàng) ID_EXTEN地顯示文 本設(shè)置為“收縮” , 將表示對(duì)話框是否擴(kuò)展地標(biāo)識(shí)變量 m_IsExtend 設(shè)置為TURE實(shí)現(xiàn)代碼如附錄3所

34、示.效果如圖 4-15 和 4-16 所示: 圖 4-15 擴(kuò)展圖 圖 4-16 收縮圖 (4) 屏蔽 Enter 鍵 直到現(xiàn)在為止 , 雖然計(jì)算器地界面已經(jīng)完成 . 但是, 它還有一個(gè)缺 陷:當(dāng) Enter 鍵按下時(shí) , 對(duì)話框應(yīng)付突然關(guān)掉 . 這是因?yàn)閷?duì)話框默認(rèn) 具有焦點(diǎn)地控件是0K 鍵,當(dāng) Enter 鍵按下時(shí),框架會(huì)自動(dòng)執(zhí)行當(dāng)前擁 有焦點(diǎn)地控件地響應(yīng)函數(shù) , 所以對(duì)話框自然就關(guān)閉了 . 要屏蔽這一功 能, 只要執(zhí)行下面地代碼就可以 . void CCalculatorDlg:OnOK() /CDialog:OnOK() 。 / 屏蔽掉此句代碼 (5) 添加背景圖 為對(duì)話框添加背景圖 ,

35、 以增加界面地美觀性 . 首先為工程添加一 幅位圖資源 , 以作為對(duì)話框地背景 .然后加入一個(gè) Static 控件, 將其 Type 屬性設(shè)為 Bitmap, 并為 Image 屬性選擇位圖資源 , 如圖 4-17 所 示. 圖 4-17 添加位圖 參數(shù)設(shè)置后對(duì)話框地外觀如圖 4-18 所示 . 圖 4-18 運(yùn)行結(jié)果圖 4.6 數(shù)值計(jì)算功能地實(shí)現(xiàn) 具體功能地實(shí)現(xiàn)首先添加成員變量 . 該計(jì)算器中所有地運(yùn)算都是 二元運(yùn)算, 即需要兩個(gè)操作數(shù) , 一個(gè)二元運(yùn)算操作符 . 所以必須聲明兩 個(gè)浮點(diǎn)數(shù), 分別用來(lái)表示初始操作數(shù)和結(jié)果操作數(shù) ,同時(shí), 必須聲明兩 個(gè)字符串類型地變量 , 分別用來(lái)顯示初始操

36、作數(shù) . 還需要一個(gè)整形變 量來(lái)記錄當(dāng)前運(yùn)算符 , 以及一個(gè)整形變量來(lái)記錄當(dāng)前小數(shù)點(diǎn)按鈕是否 被單擊過(guò) . 實(shí)現(xiàn)代碼如下: /CCalculatorDlg.h 頭文件 private: char m_buffer100 。 / 用來(lái)存貯需要顯示地?cái)?shù)字 CString m_StrBegin 。 / 記錄初始操作數(shù)地字符串 float DtoR 。 / double m_end 。 / 記錄結(jié)果操作數(shù) double m_begin 。 / 記錄初始操作數(shù)int m_bit 。 / 記錄運(yùn)算符 int m_IsCheckPoint 。 / 判斷是否按下了小數(shù)點(diǎn)符號(hào) , 當(dāng)其為 0 時(shí), 表示沒(méi)有按下

37、 當(dāng)數(shù)字鍵 09 被單擊時(shí) , 則將當(dāng)前所按鍵加到初始操作數(shù)末尾 , 并將初始操作數(shù)顯示出來(lái) .以數(shù)字鍵盤被單擊為例 , 實(shí)現(xiàn)代碼如下: / 以按鍵 0 地響應(yīng)為例 ,其余 09 地響應(yīng)完全類似 m_StrBegin = m_StrBegin+0 。 if (!m_IsCheckPoint) / 如果小數(shù)點(diǎn)按下了 m_DspEdit.OnDisplay(m_StrBegin+.) 。 else / 如果小數(shù)點(diǎn)沒(méi)有按下 m_DspEdit.OnDisplay(m_StrBegin) 。 當(dāng)小數(shù)點(diǎn)鍵被單擊時(shí) , 首先判斷小數(shù)點(diǎn)鍵是否已經(jīng)被單擊過(guò) , 以 及當(dāng)前初始操作數(shù)字符串是否為空 . 如果小數(shù)

38、點(diǎn)鍵沒(méi)有被單擊過(guò) , 而 且當(dāng)前初始操作數(shù)字符串不為空 , 則將小數(shù)點(diǎn)追加到初始操作數(shù)末尾 并且修改小數(shù)點(diǎn)標(biāo)識(shí)msCheckPoint 為 TRUE 實(shí)現(xiàn)代碼如下: if (!m_IsCheckPoint & m_StrBegin != ) / 如果小數(shù)點(diǎn) 沒(méi)有按下 且字符不 為空 m_StrBegin = m_StrBegin+. 。 m_DspEdit.OnDisplay(m_StrBegin)/ 顯示文本 當(dāng)清除鍵 CE 被單擊時(shí),則對(duì)所有地成員變量進(jìn)行初始化.清除小 數(shù)點(diǎn)標(biāo)識(shí) , 將保存初始操作數(shù)和結(jié)果操作數(shù)地字符串清空 , 將保存初 始操作數(shù)和結(jié)果操作數(shù)地浮點(diǎn)數(shù)清 0, 將當(dāng)

39、前操作符清 0.實(shí)現(xiàn)代碼如 下: m_IsCheckPoint = false 。 / 消除小數(shù)點(diǎn)按下標(biāo)記 m_StrBegin = 。 m_begin = 0.0 。 / 清 0 m_end = 0.0 。 / 清 0 m_bit = 0 。 / 當(dāng)前操作符為無(wú)效操作 當(dāng)任何一個(gè)運(yùn)算符鍵被單擊時(shí) , 首先根據(jù)當(dāng)前運(yùn)算符計(jì)算運(yùn)算結(jié) 果, 再修改記錄當(dāng)前運(yùn)算符地變量地值 . 以加號(hào)鍵被按下為例 , 實(shí)現(xiàn)代 碼如下: / 以加號(hào)為例 , 其余地操作符也采用類似操作 Result() 。 / 計(jì)算運(yùn)算結(jié)果 m_bit = 1 。 / 設(shè)置當(dāng)前運(yùn)算類型; 1 代表加法運(yùn)算 計(jì)算器地核心運(yùn)算函數(shù) Res

40、ult. 在 Result 中 , 首先將記錄當(dāng) 前操作數(shù)地字符串中保存地字符串轉(zhuǎn)化為浮點(diǎn)數(shù);其次根據(jù)當(dāng)前操 作符地類型 , 選擇適當(dāng)?shù)剡\(yùn)算操作;再將記錄結(jié)果操作數(shù)地浮點(diǎn)變量 中地值轉(zhuǎn)化為字符串 , 并顯示在結(jié)果編輯框中 .Result 函數(shù)實(shí)現(xiàn)代碼 如附錄 3 所示. 5 程序結(jié)果地演示 5.1 測(cè)試地研究與選擇 測(cè)試過(guò)程中要判斷測(cè)試是否成功 , 要分析程序界面地變化和計(jì)算 數(shù)據(jù)地結(jié)果m_IsCheckPoint = true / 改變標(biāo)識(shí) 是否正確以及各功能鍵是否能正常使用 . 5.2 測(cè)試環(huán)境 測(cè)試環(huán)境如下: 測(cè)試系統(tǒng) : Windows XP 測(cè)試工具 : Visual Studio

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論