2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  多功能計(jì)算器的設(shè)計(jì)與實(shí)現(xiàn)</p><p>  學(xué)生姓名: 指導(dǎo)老師: </p><p>  摘 要 : 本課程設(shè)計(jì)將實(shí)現(xiàn)一個(gè)簡單計(jì)算器。其類似于Windows附件中自帶的計(jì)算器。這個(gè)計(jì)算器不僅實(shí)現(xiàn)了簡單的四則運(yùn)算功能,還實(shí)現(xiàn)了高級(jí)的科學(xué)計(jì)算功能,而且具有簡潔大方的圖文外觀。它的設(shè)計(jì)按軟件工程的方法進(jìn)行,系統(tǒng)具有良好的界面、必要的交互信息和較好的

2、健壯性使用人員能快捷簡單地進(jìn)行操作。即時(shí)準(zhǔn)確地獲得需要的計(jì)算的結(jié)果,充分降低了數(shù)字計(jì)算的難度和節(jié)約了時(shí)間,對(duì)人們的生活有一定的幫助。在課程設(shè)計(jì)中,系統(tǒng)開發(fā)平臺(tái)為Windows 2000XP,程序設(shè)計(jì)設(shè)計(jì)語言采用Visual C++,在程序設(shè)計(jì)中,采用了結(jié)構(gòu)化與面向?qū)ο髢煞N解決問題的方法。</p><p>  關(guān)鍵詞 : 程序設(shè)計(jì);計(jì)算器;MFC;按鈕控件</p><p><b>

3、  1 引 言</b></p><p>  本課程設(shè)計(jì)主要在運(yùn)算過程中,如果通過計(jì)算器來完成,就會(huì)減少計(jì)算量,該程序即可以在簡單計(jì)算器鍵面下進(jìn)行簡單運(yùn)算,也可以在科學(xué)計(jì)算器鍵面下進(jìn)行高級(jí)的科學(xué)計(jì)算。并且可以分別計(jì)算弧度、角度的三角函數(shù)的計(jì)算等較為復(fù)雜的運(yùn)算。</p><p><b>  1.1 課題背景</b></p><p> 

4、 計(jì)算器是日常生活中十分便捷有效的工具,能實(shí)現(xiàn)加、減、乘、除、開方、求倒數(shù)等簡單運(yùn)算的工具。要實(shí)現(xiàn)計(jì)算功能,可以用VC++的知識(shí)編寫程序來解決此問題。該計(jì)算器大大的降低了數(shù)字計(jì)算的難度及提高了計(jì)算的準(zhǔn)確度和精確度。該計(jì)算器使用非常簡單和方便,對(duì)廣大中小學(xué)生的學(xué)習(xí)有巨大幫助作用,也對(duì)在職人員的工作有點(diǎn)幫助作用。</p><p>  1.2 課程設(shè)計(jì)目的</p><p>  在程序設(shè)計(jì)中,通過

5、設(shè)計(jì)、編制、調(diào)試一個(gè)模擬計(jì)算器的程序,加深對(duì)語法及語義分析原理的理解,并實(shí)現(xiàn)對(duì)命令語句的靈活應(yīng)用。在程序設(shè)計(jì)中,可以用兩種方法解決問題:一是傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)方法,二是更先進(jìn)的面向?qū)ο蟪绦蛟O(shè)計(jì)方法。</p><p>  由于多個(gè)函數(shù)均需要訪問某些數(shù)據(jù),這些數(shù)據(jù)常被設(shè)計(jì)為全局變量。</p><p>  而在面向?qū)ο蟪绦蛟O(shè)計(jì)中關(guān)鍵是如何將問題域中的實(shí)體(即日常所見的概念)抽取出來,作為C++

6、程序中的類,而屬性與行為作為類的兩類要素通常是必不可少的,甚至還應(yīng)考慮類必須滿足的約束。</p><p><b>  2 開發(fā)工具的介紹</b></p><p>  2.1 關(guān)于Visual C++</p><p>  Visual C++6.0 是Microsoft公司在1998年推出的基于Windows 9X和Windows NT的優(yōu)秀集成

7、開發(fā)環(huán)境。該環(huán)境為用戶提供了良好的可視化編程環(huán)境,程序員可以里利用該開發(fā)環(huán)境輕松地訪問C++源代碼編輯器,資源編輯器和使用內(nèi)部調(diào)試器,并且可以創(chuàng)建項(xiàng)目文件。Visual C++6.0不僅包括編譯器,而且它還包括許多有用組件,通過這些組件的協(xié)同工作,可以在Visual C++6.0集成環(huán)境中輕松地完成創(chuàng)建源文件,編輯資源,以及對(duì)程序的編譯,連接和調(diào)試等各項(xiàng)工作。</p><p>  VC++6.0是Windows

8、95/98、XP或Windows NT下的一個(gè)應(yīng)用程序,本身對(duì)軟硬件沒有特殊要求。就是說它對(duì)環(huán)境的要求與Windows 95/98、Windows NT要求是一致的。</p><p>  硬件要求:一般在586以上的處理器、16MB以上內(nèi)存、100MB以上的硬盤。</p><p>  軟件要求:Windows 95/98或Windows NT3.51以上版本。</p><

9、;p>  VC++ 6.0系統(tǒng)可以在一張CD盤上,也可以在“Visual Studio( Visual C++、Visual Foxpro)”等產(chǎn)品的第一張CD盤上。一般都有一個(gè)VC的自動(dòng)安裝程序,也可以執(zhí)行VC6目錄下的setup.exe,在安裝包的提示下進(jìn)行,對(duì)初學(xué)者可采用“典型安裝”方式。</p><p>  在安裝好VC 6.0系統(tǒng)后,有時(shí)根據(jù)需要添加或刪除某些部件,可插入CD盤重新執(zhí)行setup.

10、exe安裝程序,安裝程序會(huì)檢測當(dāng)前系統(tǒng)安裝VC6的足件,用戶單擊“添加/刪除”按鈕后,在“安裝維護(hù)”對(duì)話框中選定要添加的部件或撤消選定要?jiǎng)h除的部件。</p><p>  與一般的應(yīng)用軟件一樣,有以下兩種啟動(dòng)方式:</p><p>  (1)通過“開始”按鈕,選擇“程序”菜單,然后打開“Microsoft Visual studio 6.0中文版”子菜單中的“Microsoft Visual

11、 C++ 6.0 中文版”程序。</p><p>  (2)用戶也可以使用命令行啟動(dòng)VC。單擊“開始”按鈕后選擇“運(yùn)行”命令,在“運(yùn)行”對(duì)話框中輸入c:\Program Files\Microsoft Visual Studio\VC98\VC6.exe(按默認(rèn)盤符和路徑安裝)即可。</p><p><b>  2.2關(guān)于MFC</b></p><

12、p>  MFC是Win API與C++的結(jié)合,API,即微軟提供的WinDOS下應(yīng)用程序的編程語言接口,是一種軟件編程的規(guī)范,但不是一種程序開發(fā)語言本身,可以允許用戶使用各種各樣的第三方(如我是一方,微軟是一方,Borland就是第三方)的編程語言來進(jìn)行對(duì)WinDOS下應(yīng)用程序的開發(fā),使這些被開發(fā)出來的應(yīng)用程序能在WinDOS下運(yùn)行,比如VB,VC++,Java,Dehpi編程語言函數(shù)本質(zhì)上全部源于API,因此用它們開發(fā)出來的應(yīng)用

13、程序都能工作在WinOS的消息機(jī)制和繪圖里,遵守WinDOS作為一個(gè)操作系統(tǒng)的內(nèi)部實(shí)現(xiàn),這其實(shí)也是一種必要,微軟如果不提供API,這個(gè)世上對(duì)Win編程的工作就不會(huì)存在,微軟的產(chǎn)品就會(huì)迅速從時(shí)尚變成垃圾,上面說到MFC是微軟對(duì)API函數(shù)的專用C++封裝,這種結(jié)合一方面讓用戶使用微軟的專業(yè)C++ SDK來進(jìn)行Win下應(yīng)用程序的開發(fā)變得容易,因?yàn)镸FC是對(duì)API的封裝,微軟做了大量的工作,隱藏了好多程序開發(fā)人員在Win下用C++ &

14、MFC編制軟件時(shí)的大量內(nèi)節(jié),如應(yīng)用程序?qū)崿F(xiàn)消息的處理,設(shè)備環(huán)境繪圖,這種結(jié)合是以方便為目的的,必定要付出一定代價(jià)(這是微軟的一向作風(fēng)),因此就</p><p>  MFC不只是一個(gè)功能單純的界面開發(fā)系統(tǒng),它提供的類絕大部分用來進(jìn)行界面開發(fā),關(guān)聯(lián)一個(gè)窗口的動(dòng)作,但它提供的類中有好多類不與一個(gè)窗口關(guān)聯(lián),即類的作用不是一個(gè)界面類,不實(shí)現(xiàn)對(duì)一個(gè)窗口對(duì)象的控制(如創(chuàng)建,銷毀),而是一些在WinDOS(用MFC編寫的程序絕大

15、部分都在WinDOS中運(yùn)行)中實(shí)現(xiàn)內(nèi)部處理的類。</p><p><b>  2.3 可行性分析</b></p><p>  本設(shè)計(jì)是簡單計(jì)算器。日常計(jì)算機(jī)使用中,常常涉及到一些有關(guān)計(jì)算的問題,一個(gè)小型的計(jì)算器軟件變得非常有用,該校型計(jì)算器需要空間資源較少,對(duì)電腦其他程序的應(yīng)用影響較小。它的設(shè)計(jì)按軟件工程的方法進(jìn)行,系統(tǒng)具有良好的界面、必要的交互信息和較好的健壯性;醒

16、目美觀的軟件封面。使用人員能快捷簡單地進(jìn)行操作。即時(shí)準(zhǔn)確地獲得需要的計(jì)算的結(jié)果,充分降低了數(shù)字計(jì)算的難度和節(jié)約了時(shí)間,對(duì)人們的生活有一定的幫助。</p><p>  2.4 需求分析 </p><p>  本軟件主要用于計(jì)算機(jī)windows 2000/XP以上版本的用戶的使用,這次課程設(shè)計(jì)一般是實(shí)現(xiàn)簡單計(jì)算器的功能。要程序能實(shí)現(xiàn):加,減,乘,除,開方,倒數(shù)等運(yùn)算功能;還要實(shí)現(xiàn)數(shù)據(jù)的輸

17、入,輸出,計(jì)算,顯示及程序退出等功能。另外還可以實(shí)現(xiàn)多種科學(xué)計(jì)算的功能,如:三角函數(shù)的計(jì)算,弧度與角度間的轉(zhuǎn)換,對(duì)數(shù)指數(shù)的計(jì)算等等。</p><p><b>  3 功能說明</b></p><p>  計(jì)算器的設(shè)計(jì)按軟件工程的方法進(jìn)行,系統(tǒng)具有良好的界面;必要的交互信息;簡約美觀的效果。使用人員能快捷簡單地進(jìn)行操作。即可單機(jī)按鈕進(jìn)行操作,也可直接通過鍵盤直接輸入。即

18、時(shí)準(zhǔn)確地獲得需要的計(jì)算的結(jié)果,充分降低了數(shù)字計(jì)算的難度和節(jié)約了時(shí)間,對(duì)人們的生活有一定的幫助。</p><p>  (1)包含的功能有:加、減、乘、除運(yùn)算,開方、求倒數(shù)等功能[1].</p><p>  (2)計(jì)算器上數(shù)字0—9為一個(gè)控件數(shù)組,加、減、乘、除為一個(gè)控件數(shù)組,其余為單一的控件。</p><p>  (3)給對(duì)話框添加菜單。</p><

19、;p>  (4)制定高級(jí)按鈕控件,該按鈕具有不規(guī)則的形狀,可以根據(jù)用戶鼠標(biāo)的位置和單擊狀態(tài)的不同,顯示不同的顏色[3]。</p><p>  (5)制定高級(jí)編輯控件,該編輯控件可以指定文本文字的字體和顏色。</p><p>  (6)輸入的原始數(shù)據(jù)、運(yùn)算中間數(shù)據(jù)和結(jié)果都顯示在窗口頂部的同一個(gè)標(biāo)簽中。</p><p>  (7)實(shí)現(xiàn)對(duì)話框的擴(kuò)展功能[2]。<

20、;/p><p>  (8)計(jì)算功能基本上是用系統(tǒng)內(nèi)部函數(shù)。</p><p>  (9)程序可以能自動(dòng)判斷輸入數(shù)據(jù)的正確性,保證不出現(xiàn)多于一個(gè)小數(shù)點(diǎn)、以0開頭等不正?,F(xiàn)象。</p><p>  (10)“CE”按鈕可以清除所有已輸入的數(shù)據(jù)從頭計(jì)算</p><p><b>  功能模塊的實(shí)現(xiàn):</b></p>&l

21、t;p>  (1)首先,添加高級(jí)按鈕控件類,在這個(gè)類中實(shí)現(xiàn)高級(jí)的按鈕控件。在此類中對(duì)于所有的對(duì)于按鈕的繪制工作都是在DrawItem函數(shù)中完成的,實(shí)現(xiàn)按鈕對(duì)鼠標(biāo)不同的位置和動(dòng)作改變不同的顏色,并且按鈕的客戶區(qū)域變成一個(gè)橢圓。</p><p>  (2)其次,添加一個(gè)高級(jí)編輯控件類,在此類的基礎(chǔ)上實(shí)現(xiàn)高級(jí)編輯控件。在OnDisplay函數(shù)中設(shè)置編輯框的顯示文本,再調(diào)用OnDraw函數(shù)將其顯示出來,并用指定的畫

22、刷填充客戶區(qū),并且用指定的顏色繪制顯示文本。</p><p>  (3)最后,實(shí)現(xiàn)主對(duì)話框界面功能,主要是加載菜單資源和對(duì)話框擴(kuò)展功能的實(shí)現(xiàn)。在CCalculatorDlg::OnCreate函數(shù)中設(shè)定對(duì)話框的初始大小與位置,可以在這個(gè)對(duì)話框中進(jìn)行窗口風(fēng)格修改,位置設(shè)置等操作,然后添加菜單項(xiàng)ID_EXTEND的響應(yīng)函數(shù)OnExtend。</p><p><b>  4 系統(tǒng)的實(shí)現(xiàn)

23、</b></p><p><b>  4.1 窗體設(shè)計(jì)</b></p><p>  利用MFC AppWinzard生成計(jì)算器應(yīng)用程序框架具體步驟如下:</p><p>  (1)執(zhí)行VC程序,選擇File|New命令,彈出New對(duì)話框.單擊Projects標(biāo)簽,轉(zhuǎn)到Projects選項(xiàng)卡,選擇MFC AppWizard(exe)選

24、項(xiàng),然后在Project name文本框中輸入Calculator 。Lacation文本框是指項(xiàng)目的本地路徑。</p><p>  (2)單擊OK按鈕,彈出MFC AppWinzard_Step1對(duì)話框。選中單選按鈕,如圖所示。</p><p>  (3)單擊Next按鈕,彈出MFC AppWinzard_Step2 of4對(duì)話框,如圖所示。</p><p>  

25、(4)單擊Next按鈕,彈出MFC AppWinzard_Step3 of4對(duì)話框,如圖所示。</p><p>  (5)單擊Next按鈕,彈出MFC AppWinzard_Step4 of4對(duì)話框,如圖所示。單擊Finish按鈕,創(chuàng)建框架。</p><p><b>  4.2 編輯資源</b></p><p>  (1)編輯對(duì)話框及控件資源

26、</p><p>  利用Visual C++提供的資源編輯器對(duì)對(duì)話框資源進(jìn)行編輯。刪除對(duì)話框中默認(rèn)的OK和Cancel按鈕。添加一個(gè)Edit控件,其控件ID為IDC_DSPEDIT。添加若干按鈕控件,其ID如表4-1所示。</p><p>  表4-1 按鈕控件資源清單</p><p>  添加2個(gè)單選按鈕,按鈕資源清單如表4-2所示。</p>&

27、lt;p>  表4-2 單選按鈕控件資源清單</p><p>  添加4個(gè)靜態(tài)框,將編輯控件,普通計(jì)算,高級(jí)計(jì)算分別分組。其效果如圖4.1所示。</p><p>  圖4.1編輯對(duì)話框資源</p><p><b>  (2)編輯菜單資源</b></p><p>  在Visual C++中的Workspace工具

28、欄中,選中ResourceView選項(xiàng)卡。在其中的Menu項(xiàng)上右擊,在彈出的快捷菜單中選擇Insert命令,如圖4.2所示。</p><p>  圖4.2添加菜單資源</p><p>  將添加的菜單資源的ID更改為IDR_MENU。利用資源編輯器對(duì)菜單進(jìn)行編輯,編輯后的菜單如圖4.3所示。</p><p>  圖4.3 編輯菜單資源</p><

29、p>  4.3 實(shí)現(xiàn)高級(jí)按鈕控件類 </p><p>  利用ClassWizard添加一個(gè)新類,如圖4.4所示。</p><p>  圖4.4添加CAdvButton類</p><p>  (1)添加成員變量和成員函數(shù) </p><p>  為實(shí)現(xiàn)高級(jí)按鈕控件對(duì)鼠標(biāo)的移動(dòng)和單擊作出相應(yīng)的顏色變化。首先在CAdvButton的頭文件中加

30、入幾種預(yù)定義顏色,其代碼如下:</p><p>  #define DesiableColor RGB(192,192,192) //灰色, 按鈕不可用</p><p>  #define FocusColor RGB(255,0,0) //紅色, 按鈕擁有焦點(diǎn)</p><p>  #define SelectColor RGB(0,2

31、55,0) //綠色, 按鈕被按下</p><p>  #define DefaultColor RGB(0,0,255) //藍(lán)色, 默認(rèn)</p><p>  #define TextColor RGB(128,128,128) //淺灰色, 文本顏色</p><p>  接下來,添加成員變量:</p>&

32、lt;p><b>  public:</b></p><p>  CRect m_ClientRect; //用來保存按鈕的客戶的矩形區(qū)域</p><p>  CRgn m_ClientRgn ; //用來保存按鈕的客戶區(qū)域,非矩形</p><p>  UINT m_State;//按鈕所處狀態(tài)</p>

33、<p>  CPoint m_Point; //當(dāng)前鼠標(biāo)位置</p><p>  BOOL m_IsTimerOn; //標(biāo)識(shí)計(jì)時(shí)器是否已經(jīng)打開</p><p>  利用ClassWizard添加消息映射和響應(yīng)函數(shù),如圖4.5所示:</p><p>  圖4.5添加響應(yīng)函數(shù)</p><p>  再利用ClassWiz

34、ard覆蓋父類中的兩個(gè)關(guān)鍵的虛函數(shù):</p><p>  //{{AFX_VIRTUAL(CAdvButton)</p><p><b>  public:</b></p><p>  virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);</p><p>  

35、protected:</p><p>  virtual void PreSubclassWindow();</p><p>  //}}AFX_VIRTUAL</p><p>  其中對(duì)于所有的對(duì)于按鈕的繪制工作都是在DrawItem函數(shù)中完成的。</p><p>  (2)添加創(chuàng)建按鈕控件代碼</p><p>  

36、按鈕的創(chuàng)建分兩步完成。首先,調(diào)用構(gòu)造函數(shù)對(duì)按鈕對(duì)象進(jìn)行初始化;其次,調(diào)用Create函數(shù)創(chuàng)建按鈕。代碼如附錄1所示。</p><p>  (3)設(shè)置按鈕形狀、外觀、顏色、標(biāo)題</p><p>  PreSubclassWindow函數(shù)在窗口被創(chuàng)建之前就被調(diào)用,因此,在PreSubclassWindow函數(shù)中,將按鈕的風(fēng)格設(shè)為BS_OWNERDRAW。實(shí)現(xiàn)代碼如下:</p>&

37、lt;p>  //修改按鈕控件風(fēng)格</p><p>  ModifyStyle(0,BS_OWNERDRAW|BS_PUSHBUTTON);</p><p>  要使按鈕能對(duì)鼠標(biāo)的移動(dòng)與單擊作出不同的變化,那么按鈕就需要時(shí)刻知道鼠標(biāo)的位置與動(dòng)作。所以,必須在鼠標(biāo)的單擊、彈起及移動(dòng)消息的響應(yīng)函數(shù)中填加相應(yīng)的代碼,以獲取鼠標(biāo)的位置與動(dòng)作。</p><p>  在鼠

38、標(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è)為2。接著,調(diào)用Invalidate函數(shù),使客戶區(qū)無效,框架會(huì)自動(dòng)調(diào)用DrawItem函數(shù),重繪客戶區(qū)。實(shí)現(xiàn)代碼如下:</p><p>  //當(dāng)鼠標(biāo)在按鈕的客戶區(qū)內(nèi)按下時(shí),改變按鈕狀態(tài)</p><p>  v

39、oid CAdvButton::OnLButtonDown(UINT nFlags, CPoint point) </p><p><b>  {</b></p><p>  CRect rect;</p><p>  GetWindowRect(&rect); //得到按鈕客戶區(qū)域的屏幕坐標(biāo)位置</p><p&g

40、t;  GetCursorPos(&m_Point); //得到鼠標(biāo)的屏幕坐標(biāo)位置</p><p>  if((rect.PtInRect(m_Point))&&(m_State != 2))</p><p><b>  {</b></p><p>  m_State = 2;//2:select state<

41、/p><p>  Invalidate(); //重繪客戶區(qū)</p><p><b>  }</b></p><p>  CButton::OnLButtonDown(nFlags, point);</p><p><b>  }</b></p><p>  在鼠標(biāo)左鍵抬起時(shí),

42、得到按鈕窗口客戶區(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ū)無效,框架會(huì)自動(dòng)調(diào)用DrawItem函數(shù),重繪客戶區(qū)。其代碼如附錄1所示。</p><p>  在用戶移動(dòng)鼠標(biāo)時(shí),如果計(jì)時(shí)器沒有啟動(dòng),則啟動(dòng)計(jì)時(shí)器,并將計(jì)時(shí)器啟動(dòng)標(biāo)識(shí)m_IsTimerOn設(shè)為TRU

43、E。其實(shí)現(xiàn)代碼如下:</p><p>  if(!m_IsTimerOn) //如果計(jì)時(shí)器沒用啟動(dòng)</p><p><b>  {</b></p><p>  SetTimer(1000,100,NULL); //啟動(dòng)計(jì)時(shí)器</p><p>  m_IsTimerOn = TRUE;</p><

44、;p><b>  }</b></p><p>  如果鼠標(biāo)已經(jīng)移出了按鈕的客戶區(qū),則消毀計(jì)時(shí)器,并將計(jì)時(shí)器的起始標(biāo)識(shí)</p><p>  m_IsTimerOn設(shè)為FALSE。OnTimer函數(shù)的實(shí)現(xiàn)代碼如附錄1所示。</p><p>  實(shí)現(xiàn)客戶區(qū)的繪置函數(shù)DrawItem。在DrawItem函數(shù)中,首先得到窗口的有效矩形區(qū)域,在此矩

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

46、已經(jīng)是一個(gè)橢圓,而不再是一個(gè)矩形。正是下面的代碼將按鈕的客戶區(qū)域設(shè)定為橢圓形:</p><p>  GetClientRect(&m_ClientRect); //通到窗口的有效矩形區(qū)域</p><p>  m_ClientRgn.DeleteObject(); //刪除區(qū)域?qū)ο?lt;/p><p>  m_ClientRgn.CreateEllipti

47、cRgnIndirect(&m_ClientRect); //在矩形區(qū)域內(nèi)創(chuàng)建橢圓</p><p>  //設(shè)置窗口的有效區(qū)域?yàn)闄E圓</p><p>  SetWindowRgn(m_ClientRgn,FALSE);</p><p>  至此,一個(gè)完整的高級(jí)按鈕類全部完成。其效果如圖4.6所示。</p><p><b> 

48、 圖4.6運(yùn)行結(jié)果</b></p><p>  4.4 實(shí)現(xiàn)高級(jí)編輯控件類</p><p>  利用ClassWizard添加一個(gè)新類,如圖4.7所示.</p><p>  圖4.7添加CAdvEdit</p><p>  (1)添加成員變量和成員函數(shù)</p><p>  為CAdvEdit類添加一個(gè)字符串

49、類型的成員變量m_Caption,用來記錄編輯框中的文本內(nèi)容。其實(shí)現(xiàn)代碼如下:</p><p>  //CAdvEdit頭文件</p><p><b>  public:</b></p><p>  CString m_Caption; //編輯框文本</p><p>  利用AppWizard添加消息函數(shù)OnPain

50、t。如圖4.8所示。</p><p><b>  圖4.8添加函數(shù)</b></p><p>  添加兩個(gè)public類型的成員函數(shù),分別用來繪制編輯控件客戶區(qū)和設(shè)置編輯控件的顯示文本。實(shí)現(xiàn)代碼如下:</p><p><b>  public:</b></p><p>  void OnDraw();

51、 //繪制編輯控件客戶區(qū)</p><p>  void OnDisplay(LPCTSTR lpszStr); //設(shè)置編輯控件顯示文本</p><p>  protected:</p><p>  //{{AFX_MSG(CAvEdit)</p><p>  Afx_msg void OnPaint(); //WM_ON_PA

52、INT消息的響應(yīng)函數(shù)</p><p>  //}}AFX_MSG</p><p>  (2)添加編輯控件代碼</p><p>  在OnDisplay函數(shù)中設(shè)置編輯框的顯示文本。實(shí)現(xiàn)代碼如下:</p><p>  m_Caption = lpszStr;</p><p><b>  OnDraw();<

53、/b></p><p>  在OnPaint函數(shù)中調(diào)用自定義函數(shù)OnDraw。實(shí)現(xiàn)代碼如下:</p><p>  CPaintDC dc(this); // device context for painting</p><p><b>  OnDraw();</b></p><p>  在OnDraw函數(shù)中,在編

54、輯控件客戶區(qū)域內(nèi)繪制文本。首先,得到編輯控件客戶區(qū)的矩形域;其次,得到編輯控件客戶區(qū)的設(shè)備環(huán)境變量;接著,用指定的畫刷填充客戶區(qū),并且用指定的顏色繪制顯示文本。效果如圖4.9所示,其代碼如附錄2所示。</p><p><b>  圖4.9運(yùn)行結(jié)果</b></p><p>  4.5 對(duì)話框界面設(shè)計(jì)</p><p>  對(duì)主對(duì)話框添加成員變量和函

55、數(shù)。</p><p><b>  主要成員變量:</b></p><p>  //CCalculatorDlg.h頭文件</p><p>  CButton m_DspStatic;</p><p>  CAdvEdit m_DspEdit; //顯示計(jì)算結(jié)果的編輯框</p><p>  

56、CMenu* m_Menu; //對(duì)話框菜單按鈕</p><p>  BOOL m_IsExtend; //標(biāo)志對(duì)話框是否已擴(kuò)展</p><p><b>  主要成員函數(shù):</b></p><p>  //CCalculatorDlg.h頭文件</p><p>  //{{AFX_VIRTUAL(

57、CCalculatorDlg)</p><p>  Protected:</p><p>  virtual void DoDataExchange(CDataExchange*pDX);//數(shù)據(jù)交換函數(shù)</p><p>  //}}AFX_VIRTUAL</p><p>  virtual BOOL OnInitDialog();//

58、虛函數(shù),可覆蓋用來進(jìn)行用戶初始化操作</p><p>  virtual void OnOK();//虛函數(shù),覆蓋用來屏蔽Enter操作</p><p>  //{{AFX_MSG(CCalculatorDlg)</p><p>  //響應(yīng)消息 ON_WM_CTLCOLOR,用以修改對(duì)話框及其控件顏色</p><p>  afx_msg

59、HBRUSH OnCtlColor(CDC*Pdc,CWnd*pWnd,UINT nCtlColor);</p><p>  afx_msg void OnPaint(); //響應(yīng)消息WM_ON_PAINT</p><p>  afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);//響應(yīng)消息WM_ON_CREATE</p>

60、<p>  //}}AFX_MSG</p><p>  除以上主要成員外,還要對(duì)每個(gè)按鈕控件定義一個(gè)CAdvButton的對(duì)象與之相關(guān)聯(lián),并為每個(gè)按鈕控件建軍立一個(gè)成員函數(shù)來響應(yīng)其EN_CLICKED消息。如圖4.10所示:</p><p>  圖4.10為按鈕控件添加消息響應(yīng)</p><p><b>  (1)加載菜單資源</b>

61、;</p><p>  在3.2節(jié)中,已經(jīng)為工程新建了一個(gè)菜單資源IDR_MENU,現(xiàn)將其添加到計(jì)算器對(duì)話框上。利用CMenu類的LoadMenu函數(shù),將菜單資源加載到內(nèi)存中。再調(diào)用SetMenu函數(shù),將菜單添加到對(duì)話框上,代碼如附錄3所示。如圖4.11所示:</p><p><b>  圖4.11運(yùn)行結(jié)果</b></p><p>  (2)關(guān)

62、聯(lián)控件與對(duì)象</p><p>  在CCalculatorDlg類的聲明中,已經(jīng)為編輯框、靜態(tài)框及每一個(gè)按鈕聲明了相應(yīng)類型的對(duì)象與之對(duì)應(yīng)。但這些控件與對(duì)象的關(guān)聯(lián)工作是在DoDataExchange函數(shù)中DDX_Control宏來完成的,如圖4.12所示。</p><p>  圖4.12關(guān)聯(lián)控件與對(duì)象</p><p>  (3)實(shí)現(xiàn)對(duì)話框擴(kuò)展功能</p>

63、<p>  首先在CCalculatorDlg::OnCreate函數(shù)中,設(shè)定對(duì)話框的初始大小與位置。實(shí)現(xiàn)代碼如下:</p><p>  CRect rect;</p><p>  GetWindowRect(&rect); //得到對(duì)話框的窗口區(qū)域矩形</p><p>  //指定窗口大小與位置:寬為186像素,高度為245像素</p&

64、gt;<p>  SetWindowPos(&wndTop,0,0,186,245,SWP_NOMOVE|SWP_NOZORDER);</p><p>  其次,添加菜單項(xiàng)ID_EXTEND的響應(yīng)函數(shù)OnExtend。在OnExtend函數(shù)中,首先判斷當(dāng)前對(duì)話框狀態(tài),即是否已經(jīng)被擴(kuò)展。</p><p>  如果對(duì)話框已被擴(kuò)展,則收縮對(duì)話框。首先得到對(duì)話框的當(dāng)前位置,將

65、其指定為新的寬度,但高度維持不變。再將其中的編輯控件和編輯控件外的靜態(tài)框收縮到合理位置。最后將菜單項(xiàng)ID_EXTENDR的顯示文本設(shè)置為“擴(kuò)展”,將表示對(duì)話框是否擴(kuò)展標(biāo)識(shí)變量m_IsExtend設(shè)置為FALSE。</p><p>  如果對(duì)話框?yàn)榉菙U(kuò)展,則擴(kuò)展對(duì)話框。首先得到對(duì)話框的當(dāng)前位置,將其指定為新的寬度,但高度不變。再將其中的編輯控件和編輯控件外的靜態(tài)框收縮到合理的位置。最后將菜單項(xiàng)ID_EXTEND的顯

66、示文本設(shè)置為“收縮”,將表示對(duì)話框是否擴(kuò)展的標(biāo)識(shí)變量m_IsExtend設(shè)置為TURE,實(shí)現(xiàn)代碼如附錄3所示。效果如圖4.13和4.14所示:</p><p><b>  圖4.13擴(kuò)展圖</b></p><p><b>  圖4.14收縮圖</b></p><p>  (4)屏蔽Enter鍵</p>&

67、lt;p>  直到現(xiàn)在為止,雖然計(jì)算器的界面已經(jīng)完成。但是,它還有一個(gè)缺陷:當(dāng)Enter鍵按下時(shí),對(duì)話框應(yīng)付突然關(guān)掉。這是因?yàn)閷?duì)話框默認(rèn)具有焦點(diǎn)的控件是OK鍵,當(dāng)Enter鍵按下時(shí),框架會(huì)自動(dòng)執(zhí)行當(dāng)前擁有焦點(diǎn)的控件的響應(yīng)函數(shù),所以對(duì)話框自然就關(guān)閉了。要屏蔽這一功能,只要執(zhí)行下面的代碼就可以。</p><p>  void CCalculatorDlg::OnOK() </p><p>

68、;<b>  {</b></p><p>  //CDialog::OnOK(); //屏蔽掉此句代碼</p><p><b>  }</b></p><p><b>  (5)添加背景圖</b></p><p>  為對(duì)話框添加背景圖,以增加界面的美觀性。首先為工程添加一

69、幅位圖資源,以作為對(duì)話框的背景。然后加入一個(gè)Static控件,將其Type屬性設(shè)為Bitmap,并為Image屬性選擇位圖資源,如圖4.15所示。</p><p><b>  圖4.15添加位圖</b></p><p>  參數(shù)設(shè)置后對(duì)話框的外觀如圖4.16所示。</p><p>  圖4.16運(yùn)行結(jié)果圖</p><p>

70、;  4.6 數(shù)值計(jì)算功能的實(shí)現(xiàn)</p><p>  具體功能的實(shí)現(xiàn)首先添加成員變量。該計(jì)算器中所有的運(yùn)算都是二元運(yùn)算,即需要兩個(gè)操作數(shù),一個(gè)二元運(yùn)算操作符。所以必須聲明兩個(gè)浮點(diǎn)數(shù),分別用來表示初始操作數(shù)和結(jié)果操作數(shù),同時(shí),必須聲明兩個(gè)字符串類型的變量,分別用來顯示初始操作數(shù)。還需要一個(gè)整形變量來記錄當(dāng)前運(yùn)算符,以及一個(gè)整形變量來記錄當(dāng)前小數(shù)點(diǎn)按鈕是否被單擊過。實(shí)現(xiàn)代碼如下:</p><p&g

71、t;  //CCalculatorDlg.h頭文件</p><p><b>  private:</b></p><p>  char m_buffer[100];//用來存貯需要顯示的數(shù)字</p><p>  CString m_StrBegin;//記錄初始操作數(shù)的字符串</p><p>  float DtoR;

72、 //</p><p>  double m_end;//記錄結(jié)果操作數(shù)</p><p>  double m_begin;//記錄初始操作數(shù)</p><p>  int m_bit;//記錄運(yùn)算符</p><p>  int m_IsCheckPoint;//判斷是否按下了小數(shù)點(diǎn)符號(hào),當(dāng)其為0時(shí),表示沒有按下</p>&l

73、t;p>  當(dāng)數(shù)字鍵0—9被單擊時(shí),則將當(dāng)前所按鍵加到初始操作數(shù)末尾,并將初始操作數(shù)顯示出來。以數(shù)字鍵盤被單擊為例,實(shí)現(xiàn)代碼如下:</p><p>  //以按鍵0的響應(yīng)為例,其余0—9的響應(yīng)完全類似 </p><p>  m_StrBegin = m_StrBegin+"0";</p><p>  if (!m_IsCheckPoint

74、) //如果小數(shù)點(diǎn)按下了</p><p>  m_DspEdit.OnDisplay(m_StrBegin+".");</p><p>  else //如果小數(shù)點(diǎn)沒有按下</p><p>  m_DspEdit.OnDisplay(m_StrBegin);</p><p>  當(dāng)小數(shù)點(diǎn)鍵被單擊時(shí),

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

76、/p><p><b>  {</b></p><p>  m_StrBegin = m_StrBegin+".";</p><p>  m_DspEdit.OnDisplay(m_StrBegin); //顯示文本</p><p>  m_IsCheckPoint = true; //改變標(biāo)識(shí)&l

77、t;/p><p><b>  }</b></p><p>  當(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)前操作符清0。實(shí)現(xiàn)代碼如下:</p><p>  m_IsCheckPoint = false; //消除小數(shù)點(diǎn)按下標(biāo)記<

78、;/p><p>  m_StrBegin = "";</p><p>  m_begin = 0.0; //清0</p><p>  m_end = 0.0; //清0</p><p>  m_bit = 0; //當(dāng)前操作符為無效操作</p><p>  當(dāng)任何一個(gè)運(yùn)算符鍵被單

79、擊時(shí),首先根據(jù)當(dāng)前運(yùn)算符計(jì)算運(yùn)算結(jié)果,再修改記錄當(dāng)前運(yùn)算符的變量的值。以加號(hào)鍵被按下為例,實(shí)現(xiàn)代碼如下:</p><p>  //以加號(hào)為例,其余的操作符也采用類似操作</p><p>  Result(); //計(jì)算運(yùn)算結(jié)果</p><p>  m_bit = 1; //設(shè)置當(dāng)前運(yùn)算類型;1代表加法運(yùn)算</p><p>  計(jì)算器的核心運(yùn)

80、算函數(shù)——Result。在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所示。</p><p><b>  5 程序結(jié)果的演示</b></p><p>  5.1測試的研究與選擇</p>

81、;<p>  測試過程中要判斷測試是否成功,要分析程序界面的變化和計(jì)算數(shù)據(jù)的結(jié)果是否正確以及各功能鍵是否能正常使用。</p><p><b>  5.2 測試環(huán)境</b></p><p><b>  測試環(huán)境如下: </b></p><p>  測試系統(tǒng): Windows XP</p><

82、;p>  測試工具: Visual Studio C++ 6.0 </p><p>  5.3 實(shí)例測試結(jié)果</p><p>  首先,在運(yùn)行界面測試簡單運(yùn)算是否能正常運(yùn)算,輸入“34+87=”見結(jié)果圖5.1所示,觀察計(jì)算結(jié)果是否正確屬實(shí)</p><p>  圖5.1“34+78=”的運(yùn)行結(jié)果</p><p>  其次,展開計(jì)算器,選中

83、“度數(shù)”輸入“30”單擊“sin”觀察結(jié)果,見圖5.2所示</p><p>  圖5.2“sin30°”的運(yùn)行結(jié)果</p><p>  最后,選中“弧度”輸入“15”單擊“sin”觀察結(jié)果,見圖5.3所示</p><p>  圖5.3“sin15”的運(yùn)行結(jié)果</p><p><b>  6結(jié)束語</b><

84、/p><p>  經(jīng)過努力,課程設(shè)計(jì)基本完成了。在課程設(shè)計(jì)的實(shí)踐中,學(xué)到很多有用的知識(shí),也積累了不少寶貴的經(jīng)驗(yàn)。課程設(shè)計(jì)是以一個(gè)計(jì)算器的實(shí)現(xiàn)為基礎(chǔ),掌握一個(gè)基于對(duì)話框的應(yīng)用程序的編程方法以及對(duì)話框常用控件的高級(jí)編程。在課程設(shè)計(jì)中我了解到到對(duì)話框應(yīng)用程序的編程模式、改變按鈕的客戶區(qū)形狀、在按鈕客戶區(qū)內(nèi)作圖及對(duì)話框的擴(kuò)展等知識(shí)。在此期間,遇上了不少的技術(shù)難題,但是經(jīng)過努力,通過查找資料,難題還是一個(gè)個(gè)被解決了,我從中學(xué)到

85、了許多課堂上沒學(xué)到的東西,這使得我很高興。</p><p>  經(jīng)過設(shè)計(jì)的各個(gè)環(huán)節(jié),從中學(xué)到了很多,鍛煉了自己系統(tǒng)的設(shè)計(jì)的能力,從系統(tǒng)的需求到系統(tǒng)的功能,到系統(tǒng)的測試,到系統(tǒng)的發(fā)布,可以掌握到一個(gè)完全的過程,這樣對(duì)我們以后在工作中或?qū)W習(xí)中得到很好的鍛煉,為用VC++編輯軟件奠定基礎(chǔ)。</p><p>  本系統(tǒng)適合于運(yùn)行在Microsoft Windows 的各個(gè)版本下,包括Windows

86、98、Windows Me、Windows2000、Windows XP等系統(tǒng)平臺(tái)下。</p><p>  當(dāng)然,本論文所采取的解決問題的方法并不是非常完善的,在今后的學(xué)習(xí)、工作中,將繼續(xù)研究并改進(jìn)。</p><p><b>  7參考文獻(xiàn)</b></p><p>  [1]嚴(yán)華峰. Visual C++課程設(shè)計(jì)案例精編. 北京:中國水利水電

87、出版社,2002</p><p>  [2]張宏軍,黨留群,趙天巨.Visual C++ 6.0編程案例精解.北京:電子工業(yè)出版社,2005</p><p>  [3]鄭阿奇,丁有和.Visual C++教程.北京:機(jī)械工業(yè)出版社,2006</p><p>  附錄1:結(jié)構(gòu)化設(shè)計(jì)源程序清單</p><p>  //程序名稱:AdvButt

88、on.cpp</p><p>  //程序功能:實(shí)現(xiàn)高級(jí)按鈕控件類。</p><p><b>  // 程序作者:</b></p><p>  // 最后修改日期:</p><p><b>  //構(gòu)造函數(shù)</b></p><p>  CAdvButton::CAdvButt

89、on()</p><p><b>  {</b></p><p>  //初始化m_ClientRect</p><p>  m_ClientRect.left = 0;</p><p>  m_ClientRect.top = 0;</p><p>  m_ClientRect.right

90、 = 0;</p><p>  m_ClientRect.bottom= 0;</p><p>  m_ClientRgn.DeleteObject(); //刪除區(qū)域?qū)ο?lt;/p><p>  m_ClientRgn.CreateEllipticRgnIndirect(&m_ClientRect); //創(chuàng)建橢圓區(qū)域</p><p&g

91、t;  m_State = 0;</p><p>  m_Point.x = m_Point.y = 0;</p><p>  m_IsTimerOn = FALSE;</p><p><b>  }</b></p><p>  //重載父類Create函數(shù)</p><p>  BOOL CAdv

92、Button::Create(LPCTSTR lpszCaption,DWORD dwStyle,const RECT& rect,CWnd *pParentWnd,UINT nID)</p><p><b>  {</b></p><p>  return CButton::Create(lpszCaption, dwStyle, rect, pParent

93、Wnd, nID);</p><p><b>  }</b></p><p>  //當(dāng)鼠標(biāo)在按鈕的客戶區(qū)內(nèi)彈起時(shí),改變按鈕狀態(tài)</p><p>  void CAdvButton::OnLButtonUp(UINT nFlags, CPoint point) </p><p><b>  {</b>

94、;</p><p>  // TODO: Add your message handler code here and/or call default</p><p>  CRect rect;</p><p>  GetWindowRect(&rect); //得到按鈕客戶區(qū)域的屏幕坐標(biāo)位置</p><p>  GetCurso

95、rPos(&m_Point); //得到鼠標(biāo)的屏幕坐標(biāo)位置</p><p>  if((rect.PtInRect(m_Point))&&(m_State != 1))</p><p><b>  {</b></p><p>  m_State = 1;//1:focus state</p><p

96、>  Invalidate(); //重繪客戶區(qū)</p><p><b>  }</b></p><p>  CButton::OnLButtonUp(nFlags, point);</p><p><b>  }</b></p><p>  //計(jì)時(shí)器消息的響應(yīng)函數(shù)</p>

97、<p>  void CAdvButton::OnTimer(UINT nIDEvent) </p><p><b>  {</b></p><p>  // TODO: Add your message handler code here and/or call default</p><p>  CRect rect;</

98、p><p>  GetWindowRect(&rect); //得到按鈕客戶區(qū)域的屏幕坐標(biāo)位置</p><p>  GetCursorPos(&m_Point); //得到鼠標(biāo)的屏幕坐標(biāo)位置</p><p>  if(rect.PtInRect(m_Point)) //如果鼠標(biāo)在按鈕的客戶區(qū)內(nèi)</p><p><b&

99、gt;  {</b></p><p>  if((m_State != 1)&&(m_State != 2))</p><p><b>  {</b></p><p>  m_State = 1;</p><p>  Invalidate();</p><p><

100、;b>  }</b></p><p><b>  }</b></p><p>  else //如果鼠標(biāo)已經(jīng)不在按鈕的客戶區(qū)內(nèi)了</p><p><b>  {</b></p><p>  if(m_State != 0)</p><p><

101、;b>  {</b></p><p>  m_State = 0;</p><p>  Invalidate(); //重繪客戶區(qū)</p><p><b>  }</b></p><p>  KillTimer(nIDEvent); //關(guān)閉計(jì)時(shí)器</p><p>  m_I

102、sTimerOn = FALSE;</p><p><b>  }</b></p><p>  CButton::OnTimer(nIDEvent);</p><p><b>  }</b></p><p>  //在按鈕控件客戶區(qū)的繪置函數(shù),也是實(shí)現(xiàn)所有高級(jí)控件的關(guān)鍵</p><

103、;p>  void CAdvButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) </p><p><b>  {</b></p><p>  //get client rect</p><p>  GetClientRect(&m_ClientRect); //得到窗口的有效矩形

104、區(qū)域</p><p>  m_ClientRgn.DeleteObject();//</p><p>  m_ClientRgn.CreateEllipticRgnIndirect(&m_ClientRect); //在矩形區(qū)域內(nèi)創(chuàng)建橢圓</p><p>  //設(shè)置窗口的有效區(qū)域?yàn)闄E圓 </p><p>  SetWindowRgn

105、(m_ClientRgn,FALSE); </p><p>  CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);//得到按鈕控件客戶區(qū)域的設(shè)備環(huán)境變量指針</p><p>  CPen* pPen = NULL;</p><p>  switch (m_State) //根據(jù)按鈕不同的狀態(tài),創(chuàng)建不同的畫筆

106、</p><p><b>  {</b></p><p><b>  case 0:</b></p><p>  pPen = new CPen(PS_SOLID,1,DefaultColor);</p><p><b>  break;</b></p><

107、p><b>  case 1:</b></p><p>  pPen = new CPen(PS_SOLID,1,FocusColor);</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  pPen

108、= new CPen(PS_SOLID,1,SelectColor);</p><p><b>  break;</b></p><p><b>  case 3:</b></p><p>  pPen = new CPen(PS_SOLID,1,DesiableColor);</p><p>&l

109、t;b>  break;</b></p><p><b>  }</b></p><p>  pDC->SetBkMode(TRANSPARENT);//設(shè)置背景模式為透明</p><p>  pPen = pDC->SelectObject(pPen);</p><p>  pDC-&g

110、t;Ellipse(&m_ClientRect); //在按鈕客戶區(qū)內(nèi)繪制橢圓</p><p>  pPen = pDC->SelectObject(pPen);</p><p>  if(pPen) delete pPen;</p><p>  LPTSTR pCaption = new char[MAXCAPTIONLEN];//</p&

111、gt;<p>  int iLen = GetWindowText(pCaption,MAXCAPTIONLEN);</p><p>  pDC->SetTextColor(TextColor); //指定文本顏色</p><p>  //繪制文本,作為按鈕標(biāo)題</p><p>  pDC->DrawText(pCaption,iLen

112、,&m_ClientRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);</p><p><b>  }</b></p><p>  附錄2:面向?qū)ο笤O(shè)計(jì)源程序清單</p><p>  // 程序名稱:CAdvEdit.cpp</p><p>  // 程序功能:實(shí)現(xiàn)高級(jí)編輯控件類。

113、</p><p><b>  // 程序作者: </b></p><p>  // 最后修改日期:</p><p>  //繪制編輯控件客戶區(qū)</p><p>  void CAdvEdit::OnDraw()</p><p><b>  {</b></p>&

114、lt;p>  CRect rect;</p><p>  GetClientRect(&rect); //得到客戶區(qū)矩形區(qū)域</p><p>  CDC* pDC = GetDC(); //得到編輯控件設(shè)備環(huán)境變量</p><p>  pDC->SetBkMode(TRANSPARENT); //設(shè)置背景模式為透明</p><

115、p>  CBrush * pBrush = new CBrush(RGB(255,255,255)); //創(chuàng)建白色畫刷</p><p>  pDC->FillRect(&rect,pBrush); //用畫刷填充客戶區(qū)</p><p>  pDC->SetTextColor(RGB(92,92,92));//設(shè)置文本顏色</p><p&

116、gt;  //繪制文本,用指定的顏色和字體</p><p>  pDC->DrawText(m_Caption,rect,DT_SINGLELINE|DT_VCENTER|DT_RIGHT);</p><p><b>  }</b></p><p>  附錄3:面向?qū)ο笤O(shè)計(jì)源程序清單</p><p>  // 程序

117、名稱:CalculatorDlg.cpp</p><p>  // 程序功能:實(shí)現(xiàn)對(duì)話框界面設(shè)計(jì)和計(jì)算器數(shù)值計(jì)算功能</p><p><b>  // 程序作者: </b></p><p>  // 最后修改日期:</p><p>  //初始化對(duì)話框函數(shù)</p><p>  BOOL CCalc

118、ulatorDlg::OnInitDialog()</p><p><b>  {</b></p><p>  CDialog::OnInitDialog(); //調(diào)用父類的初始化代碼</p><p>  //其他的初始化代碼</p><p>  m_Menu = new CMenu; //</p>

119、<p>  m_Menu->LoadMenu(IDR_MENU); //加載菜單資源模板</p><p>  SetMenu(m_Menu); //將菜單添加到對(duì)話框</p><p>  return TRUE; //return TRUE unless you set the focus to a control</p><p> 

120、 //菜單命令I(lǐng)D_EXTEND的響應(yīng)函數(shù)</p><p>  void CCalculatorDlg::OnExtend()</p><p><b>  {</b></p><p>  CRect rect;</p><p>  GetWindowRect(&rect);</p><p>

121、;  if(m_IsExtend) //如果當(dāng)前對(duì)話框已被擴(kuò)展</p><p><b>  {</b></p><p>  GetWindowRect(&rect); //得到對(duì)話框的窗口區(qū)域矩形</p><p>  //設(shè)置對(duì)話框窗口位置與大小;寬為186像素,高度不變</p><p>  SetWind

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(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)論