2017畢業(yè)論文-大學(xué)物理實(shí)驗(yàn)中示波器的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
已閱讀1頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  大學(xué)物理實(shí)驗(yàn)中示波器的設(shè)計(jì)與實(shí)現(xiàn)</p><p><b>  摘 要</b></p><p>  仿真是求解隨機(jī)問題的技術(shù)。隨著具有存儲(chǔ)功能的計(jì)算機(jī)的出現(xiàn),計(jì)算機(jī)仿真技術(shù)越來越受到重視,現(xiàn)已被應(yīng)用于各個(gè)領(lǐng)域。本系統(tǒng)主要用于教育領(lǐng)域,形象了演示了示波器的功能,方便了老師的教學(xué)。</p><p>  本文主要描述了仿真技術(shù)的

2、基本概念以及仿真技術(shù),介紹仿真技術(shù)在現(xiàn)實(shí)生活中的應(yīng)用實(shí)例,討論了仿真理論目前的發(fā)展?fàn)顩r、前景以及論文研究的目的和意義。</p><p>  本文所設(shè)計(jì)實(shí)現(xiàn)的基于仿真技術(shù)的示波器仿真實(shí)驗(yàn)系統(tǒng)是在Visual C++6.0開發(fā)環(huán)境下編程實(shí)現(xiàn)的,利用MFC類庫和Visual C++提供的高度可視的應(yīng)用程序開發(fā)工具,在其開發(fā)的小型應(yīng)用程序平臺上實(shí)現(xiàn)示波器控制面板的繪制、位圖資源的加載,可以分別選擇單蹤波和雙蹤波的通道來實(shí)

3、現(xiàn)不同波形的動(dòng)態(tài)演示,以及實(shí)現(xiàn)雙蹤波幅值分離的設(shè)計(jì)實(shí)現(xiàn)和波形周期的增加和減小。本文的最后對設(shè)計(jì)研究工作進(jìn)行了總結(jié),指出了研究上的不足和系統(tǒng)需要改進(jìn)的地方,說明了需要進(jìn)一步深入討論的內(nèi)容。</p><p>  關(guān)鍵詞:模擬仿真;隨機(jī)問題; MFC類庫;可視化</p><p>  Man-machine Interaction Equipment-Oscilloscope Simulation

4、</p><p><b>  Abstract</b></p><p>  Simulation technology is a skill to solve random problem. With the memory function of the computer, computer simulation technology has been widely

5、applied in various fields. The system is mainly used for teaching and the visualized demonstration of the oscilloscope functions will facilitate the teacher's teaching. </p><p>  The thesis describes the

6、 basic concepts of simulation technology. And with application examples in real life about simulation, it discusses the current development situation and prospects of simulation technology, as well as the purpose and sig

7、nificance of the research in the thesis. </p><p>  The oscilloscope simulation system which based on simulation technology in the thesis is in Visual C + + 6.0 Programming environments. Using MFC and Visual

8、C + + which provide a high degree of visual application development tools, the system can achieve such functions: the drawing of oscilloscope‘s control panel, the loading of bitmap resources, the dynamic displaying of

9、different waveform with single-track and double-track channel respectively, and the achievement of amplitude separation and </p><p>  Key words: Simulation; Random Problem; MFC; Visualization 目 錄</p>

10、;<p><b>  論文總頁數(shù):29頁</b></p><p><b>  1引言1</b></p><p>  1.1仿真理論的發(fā)展1</p><p>  1.2計(jì)算機(jī)仿真技術(shù)1</p><p>  1.3計(jì)算機(jī)仿真應(yīng)用實(shí)例2</p><p>

11、;  1.4論文的目的及意義2</p><p>  2系統(tǒng)的總體設(shè)計(jì)3</p><p>  2.1系統(tǒng)功能說明3</p><p>  2.2開發(fā)運(yùn)行平臺選擇及分析3</p><p>  2.2.1實(shí)現(xiàn)系統(tǒng)的硬件環(huán)境3</p><p>  2.2.2實(shí)現(xiàn)系統(tǒng)的軟件環(huán)境4</p>&l

12、t;p>  2.2.3實(shí)現(xiàn)系統(tǒng)的理論基礎(chǔ)4</p><p>  3示波器仿真系統(tǒng)的實(shí)現(xiàn)4</p><p>  3.1應(yīng)用程序平臺基本框架的建立4</p><p>  3.1.1添加消息處理函數(shù)6</p><p>  3.1.2添加成員變量8</p><p>  3.1.3添加RECOURCE

13、資源9</p><p>  3.1.4定時(shí)器成員函數(shù)10</p><p>  3.1.5通道的選擇10</p><p>  3.1.6BUTTON單擊事件的設(shè)計(jì)11</p><p>  3.2曲線面板的設(shè)計(jì)14</p><p>  3.2.1位圖資源及其應(yīng)用14</p><p&

14、gt;  3.2.2圖形刷新16</p><p>  3.2.3獲取設(shè)備環(huán)境18</p><p>  3.2.4映射模式19</p><p>  3.2.5繪圖工具21</p><p>  3.3本章小節(jié)23</p><p>  4系統(tǒng)運(yùn)行結(jié)果及工作總結(jié)23</p><p&g

15、t;  4.1系統(tǒng)運(yùn)行結(jié)果23</p><p>  4.2遇到的問題及解決方法25</p><p>  4.3系統(tǒng)改進(jìn)方法26</p><p><b>  結(jié) 論26</b></p><p><b>  參考文獻(xiàn)26</b></p><p><b&

16、gt;  引言</b></p><p><b>  仿真理論的發(fā)展</b></p><p>  仿真技術(shù)最早可以追溯到1773年法國自然學(xué)家G.L.L.Buffon為了估計(jì)∏的值而采用隨機(jī)數(shù)做實(shí)驗(yàn)來求解隨機(jī)問題。仿真又稱做蒙特卡羅方法。比較早而且著名的蒙特卡羅方法使用者是W.S.Gosset。他在1908年以“Student”為筆名發(fā)表論文時(shí),使用了蒙特卡

17、羅方法來證明他的t分布法。盡管蒙特卡羅方法起源于1876年,但是直到75年之后才被命名。現(xiàn)代化的具有程序儲(chǔ)存功能的計(jì)算機(jī)使冗長的計(jì)算成為可能,而這種計(jì)算正式蒙特卡羅所要求的。</p><p>  如今計(jì)算機(jī)仿真技術(shù)被廣泛運(yùn)用于眾多的領(lǐng)域之中。在國外,1876年,美國統(tǒng)計(jì)學(xué)家第一次使用仿真模擬方法做隨機(jī)實(shí)驗(yàn)。進(jìn)入20世紀(jì)80年代,仿真模擬技術(shù)在高科技中所處的地位日益提高。一些發(fā)達(dá)國家非常重視仿真模擬技術(shù)的開發(fā)利用,

18、在科學(xué)研究、工業(yè)、交通、軍事、教育等領(lǐng)域得到大量應(yīng)用。</p><p><b>  計(jì)算機(jī)仿真技術(shù)</b></p><p>  所謂計(jì)算機(jī)仿真是指在實(shí)體尚不存在、或者不易在實(shí)體上進(jìn)行實(shí)驗(yàn)的情況下,先通過對考察對象進(jìn)行建模,用數(shù)學(xué)方程式表達(dá)出其物理特性,然后編制計(jì)算機(jī)程序,并通過計(jì)算機(jī)運(yùn)算出考察對象在系統(tǒng)參數(shù)以及內(nèi)外環(huán)境條件改變的情況下,其主要參數(shù)如何變化,從而達(dá)到全面

19、了解和掌握考察對象特性的目的。</p><p>  計(jì)算機(jī)仿真技術(shù)是作為分析和研究系統(tǒng)運(yùn)行行為、揭示系統(tǒng)動(dòng)態(tài)過程和運(yùn)動(dòng)規(guī)律的一種重要手段和方法。近年來,隨著系統(tǒng)科學(xué)研究的深入、控制理論、計(jì)算技術(shù)、計(jì)算機(jī)科學(xué)與技術(shù)的發(fā)展,計(jì)算機(jī)仿真技術(shù)已發(fā)展成一門新的學(xué)科。信息處理技術(shù)的突飛猛進(jìn),更使得仿真技術(shù)得到迅速發(fā)展。</p><p><b>  計(jì)算機(jī)仿真的特點(diǎn)</b><

20、/p><p><b>  模型參數(shù)任意調(diào)整</b></p><p>  模型參數(shù)可根據(jù)要求通過計(jì)算機(jī)程序隨時(shí)進(jìn)行調(diào)整,修改或補(bǔ)充,使人們能夠掌握各種可能的仿真結(jié)果,為進(jìn)一步完善研究方案提供了極大的方便。</p><p><b>  系統(tǒng)模型快速求解</b></p><p>  借助于先進(jìn)的計(jì)算機(jī)系統(tǒng),人

21、們在較短時(shí)間內(nèi)就能知道仿真運(yùn)算的結(jié)果(數(shù)據(jù)或圖像),從而為人們的實(shí)踐活動(dòng)提供強(qiáng)有力的指導(dǎo)。這是通常的數(shù)學(xué)模型方法所無法實(shí)現(xiàn)的。</p><p><b>  運(yùn)算結(jié)果準(zhǔn)確可靠</b></p><p>  只要系統(tǒng)模型、仿真模型和仿真程序是科學(xué)合理的,那么計(jì)算機(jī)的運(yùn)算結(jié)果一定準(zhǔn)確無誤(除非機(jī)器有故障)。因此,人們可毫無顧慮地應(yīng)用計(jì)算機(jī)仿真的結(jié)果。</p>&

22、lt;p><b>  實(shí)物仿真形象直觀</b></p><p>  只要系統(tǒng)模型、仿真模型和仿真程序是科學(xué)合理的,那么計(jì)算機(jī)的運(yùn)算結(jié)果一定準(zhǔn)確無誤(除非機(jī)器有故障)。因此,人們可毫無顧慮地應(yīng)用計(jì)算機(jī)仿真的結(jié)果。</p><p><b>  計(jì)算機(jī)仿真應(yīng)用實(shí)例</b></p><p>  因工作需要,要求一油缸保持穩(wěn)定

23、的工作壓力,具體參數(shù)如下:油缸設(shè)定壓力10bar,壓力允許誤差為15%,蓄能器體積6.3L,充氣壓力2bar,其它參數(shù)如電機(jī)轉(zhuǎn)速、泵排量、缸徑、泄露量等皆為已知,圖一為該系統(tǒng)的仿真模型,其保壓原理是通過檢測液壓缸內(nèi)的工作壓力并與設(shè)定的壓力進(jìn)行比較從而決定是否啟動(dòng)電機(jī)帶動(dòng)泵運(yùn)行。當(dāng)對仿真模型中的每個(gè)圖形模塊設(shè)置我們所期望的參數(shù)值后,運(yùn)行該仿真模型便可得出多種仿真結(jié)果。 </p><p><b>  壓力對

24、比</b></p><p>  為了比較采用保壓控制和不保壓控制這兩個(gè)方案,仿真的結(jié)果告訴我們,由于沒有采用保壓控制,在泄漏的影響下,系統(tǒng)的壓力一直在下降,經(jīng)過一段時(shí)間后,缸內(nèi)的壓力就達(dá)不到壓力要求了,而采用了保壓系統(tǒng)的方案,缸內(nèi)的壓力可以一直維持在要求的壓力上。 </p><p><b>  仿真結(jié)果</b></p><p>  

25、通過仿真計(jì)算,還可以直接做出采用保壓控制方案后缸內(nèi)壓力隨時(shí)間的變化,可以知道:缸內(nèi)壓力建立需要的時(shí)間是25秒,進(jìn)一步放大圖中直線部分,我們可以清楚地看到缸內(nèi)壓力的波動(dòng)情況,壓力波動(dòng)的振幅為0.008bar。此外我們也可以將電機(jī)啟動(dòng)停止情況和壓力波動(dòng)情況繪在一張圖上,電機(jī)在100秒的仿真時(shí)間內(nèi)起停了三次。</p><p><b>  參數(shù)優(yōu)化</b></p><p> 

26、 如果需要考察氣囊式蓄能器預(yù)充氣壓力對壓力波動(dòng)、壓力建立時(shí)間及其保壓時(shí)間等參數(shù)的影響,可以利用AMESim的Batch仿真運(yùn)行模式,分別將預(yù)充氣壓力設(shè)定為2bar、5bar和8bar,從圖七中可以明顯看出:充氣壓力小時(shí),壓力波動(dòng)值較小,但是壓力建立時(shí)間長,保壓時(shí)間短;充氣壓力高時(shí),壓力雖可迅速建立,保壓時(shí)間也較長,但是壓力波動(dòng)也較大。因此在產(chǎn)品設(shè)計(jì)階段我們可以根據(jù)要求在壓力波動(dòng)、壓力建立時(shí)間及其保壓時(shí)間之間折衷以確定最佳的預(yù)充氣壓力。&

27、lt;/p><p><b>  論文的目的及意義</b></p><p>  本系統(tǒng)的目的是利用VC++進(jìn)行簡單仿真實(shí)現(xiàn)的人機(jī)交互設(shè)備,完成了一個(gè)小型的應(yīng)用程序及簡單示波器仿真系統(tǒng)。論文主要涉及到仿真模擬技術(shù),通過對次系設(shè)計(jì)開發(fā)對仿真理論的發(fā)展及主要內(nèi)容有了基本的認(rèn)識與了解。</p><p>  通過對仿真系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),筆者熟悉了VC++的MF

28、C開發(fā)模式流程,掌握了仿真技術(shù)的思想,完成了簡單的示波器仿真系統(tǒng),驗(yàn)證了仿真在連續(xù)系統(tǒng)仿真下的可行性。</p><p><b>  系統(tǒng)的總體設(shè)計(jì)</b></p><p>  系統(tǒng)設(shè)計(jì)的基本思想是以示波器的工作原理為基礎(chǔ),通過Visual C++語言設(shè)計(jì)實(shí)現(xiàn)完成一個(gè)小型的示波器仿真系統(tǒng)。</p><p><b>  系統(tǒng)功能說明<

29、;/b></p><p>  本系統(tǒng)是利用VC++的MFC類庫設(shè)計(jì)搭建的應(yīng)用程序基本框架,在其基礎(chǔ)上添加一些相關(guān)的類和消息處理機(jī)制。本系統(tǒng)在運(yùn)行以后,就可以點(diǎn)擊相關(guān)的按鈕來選擇單蹤波和雙蹤波的演示。并在此基礎(chǔ)上可以點(diǎn)擊相應(yīng)的按鈕來調(diào)節(jié)波形幅度和波形周期,另外,如果選擇的是雙蹤波的演示,我們可以點(diǎn)擊相應(yīng)的按鈕來實(shí)現(xiàn)雙蹤波的分離,使兩個(gè)波的幅度差越來越大。直觀上充分的說明了示波器的工作原理。功能模塊劃分如下:&

30、lt;/p><p><b>  圖1 功能模塊圖</b></p><p>  開發(fā)運(yùn)行平臺選擇及分析</p><p>  本系統(tǒng)是以VC++6.0結(jié)合圖形可視化的思想作為系統(tǒng)的開發(fā)環(huán)境。</p><p><b>  實(shí)現(xiàn)系統(tǒng)的硬件環(huán)境</b></p><p>  實(shí)現(xiàn)本系統(tǒng)的硬件

31、配置如表1所示:</p><p><b>  表1硬件配置</b></p><p>  筆者所搭建的僅是一個(gè)小型的實(shí)驗(yàn)?zāi)M系統(tǒng),因此一般的用戶PC機(jī)都可暢通無阻的運(yùn)行本程序。</p><p><b>  實(shí)現(xiàn)系統(tǒng)的軟件環(huán)境</b></p><p>  Visual C++自誕生以來,一直是Windo

32、ws環(huán)境下最主要的應(yīng)用開發(fā)系統(tǒng)之一。Visual C++不僅是C++語言的集成開發(fā)環(huán)境,而且與Win32緊密相連,利用Visual C++開發(fā)系統(tǒng),可以完成各種各樣的應(yīng)用程序開發(fā),從底層軟件直到上層直接面向用戶的軟件。而且,Visual C++強(qiáng)大的調(diào)試功能也為大型復(fù)雜軟件的開發(fā)提供了有效的排錯(cuò)手段。</p><p>  進(jìn)入20實(shí)際90年代以來,隨著多媒體技術(shù)和圖形圖像技術(shù)的不斷發(fā)展,可視化(Visual)技術(shù)

33、得到廣泛的重視,越來越多的計(jì)算機(jī)專業(yè)人員都開始研究并應(yīng)用可視化技術(shù)。Visual C++是一個(gè)很好的可視化編程工具,使用Visual C++環(huán)境來開發(fā)基于Windows的應(yīng)用程序大大縮短了開發(fā)時(shí)間,而且它的界面更友好,便于程序員操作。</p><p><b>  實(shí)現(xiàn)系統(tǒng)的理論基礎(chǔ)</b></p><p>  Visual C++是一個(gè)很好的可視化編程工具,使用Vis

34、ual C++環(huán)境來開發(fā)基于Windows的應(yīng)用程序大大縮短了開發(fā)時(shí)間,而且它的界面更友好,便于操作。開發(fā)環(huán)境是編程者同Visual C++的交互界面,通過它可以訪問C++源代碼編輯器、資源編輯器、使用內(nèi)部調(diào)試器,還可以創(chuàng)建項(xiàng)目文件。</p><p>  示波器仿真系統(tǒng)的實(shí)現(xiàn)</p><p>  應(yīng)用程序平臺基本框架的建立</p><p>  筆者使用VC++6.0

35、結(jié)合圖形可視化技術(shù)實(shí)現(xiàn)了示波器的仿真試驗(yàn)系統(tǒng)。打開Visual C++6.0操作界面,建立工程類型為MFC AppWizard [exe] 的對話框文檔的新工程,系統(tǒng)自動(dòng)為用戶創(chuàng)建CMyApp, CMyDlg兩個(gè)類。創(chuàng)建過程如圖所示:</p><p>  圖2 創(chuàng)建工程的界面</p><p>  圖3 選擇工程類型的界面</p><p>  圖4 創(chuàng)建好的工程信息界

36、面</p><p>  在Resource View中的Dialog文件目錄下有兩個(gè)對話框,分別為IDD-ABOUTBOX和IDD-MY-DIALOG,如下圖所示:</p><p>  圖5 IDD-ABOUTBOX</p><p>  在IDD-MY-DLALOG對話框中進(jìn)行設(shè)置,在對話框中添加一個(gè)STATIC TEXT控件和四個(gè)GROUP BOX控件,然后再在每

37、個(gè)GROUP BOX控件中添加相應(yīng)的BUTTON按紐,結(jié)果如圖所示:</p><p>  圖6 IDD_MY_DIALOG</p><p><b>  添加消息處理函數(shù)</b></p><p>  為每個(gè)按紐創(chuàng)建類向?qū)?,右鍵單擊,選擇“CLASS WIZARD”,就會(huì)出現(xiàn)如圖所示的對話框:</p><p>  圖7 CL

38、ASS WIZARD對話框</p><p>  此對話框主要是用來為每個(gè)用ID標(biāo)志的按紐添加消息處理函數(shù),如對應(yīng)的ID為IDC-BMINUS的按扭,有兩個(gè)相應(yīng)的消息處理函數(shù),如BN_CLICKED與BN_DOUBLECLICKED,而我們在此工程中用到的是BN_CLICKED,點(diǎn)擊有邊的添加消息處理函數(shù)就可以了,雙擊相應(yīng)的消息處理函數(shù)名就可以進(jìn)入相應(yīng)的消息處理函數(shù)的編輯,如對應(yīng)的幅值增加按扭的消息處理函數(shù)為:&l

39、t;/p><p>  Void CMy22Dlg::OnVoltplus ()</p><p>  ID_VOLTMINUS (對應(yīng)的幅值減小的按扭):</p><p>  Void CMy22Dlg::OnVoltminus ()</p><p>  在相應(yīng)的DLG..H文件中的CLASS CMY22Dlg: public CDialog中就會(huì)

40、出現(xiàn)相應(yīng)的消息處理函數(shù)的聲明</p><p>  {{AFX_MSG (CMy22Dlg)</p><p>  Virtual BOOL OnInitDialog ();</p><p>  afx_msg void OnSysCommand(UINT nID, LPARAM lParam);</p><p>  afx_msg void O

41、nPaint();</p><p>  afx_msg HCURSOR OnQueryDragIcon();</p><p>  afx_msg void OnVoltplus();</p><p>  afx_msg void OnVoltminus();</p><p>  afx_msg void OnTimeplus();</p

42、><p>  afx_msg void OnTimeminus();</p><p>  afx_msg void OnAplus();</p><p>  afx_msg void OnAminus();</p><p>  afx_msg void OnBplus();</p><p>  afx_msg void O

43、nBminus();</p><p>  afx_msg void OnRadio1();</p><p>  afx_msg void OnRadio2();</p><p>  afx_msg void OnRadio3();</p><p>  }}//AFX_MSG</p><p>  DECLARE_MESS

44、AGE_MAP ()</p><p><b>  添加成員變量</b></p><p>  同樣右鍵單擊“CLASS WIZARD”,在彈出來的對話框中點(diǎn)擊“Member Variables”,就可對相應(yīng)的控件添加相應(yīng)的成員變量,如圖所示:</p><p>  圖8添加成員變量的界面</p><p>  在相應(yīng)的DLG.

45、.H文件中的CLASS CMY22Dlg: public CDialog中就會(huì)出現(xiàn)以下代碼:</p><p>  // Dialog Data</p><p>  //{{AFX_DATA(CMy22Dlg)</p><p>  enum { IDD = IDD_MY22_DIALOG };</p><p>  CButtonm_btnami

46、nus;</p><p>  CButtonm_btnaplus;</p><p>  CButtonm_btnbminus;</p><p>  CButtonm_btnbplus;</p><p>  CButtonm_btntimeminus;</p><p>  CButtonm_btnvoltplus;<

47、;/p><p>  CButtonm_btnvoltminus;</p><p>  CButtonm_btntimeplus;</p><p>  CStringm_wndscope;</p><p>  //}}AFX_DATA</p><p>  添加RECOURCE資源</p><p> 

48、 在“RECOURCE VIEW”中,展開“ICON”目錄,右鍵單擊,選擇“IMPORT”選項(xiàng),則會(huì)彈出以下對話框:</p><p>  圖9 導(dǎo)入位圖資源界面</p><p>  選擇你所要導(dǎo)入的圖標(biāo)所在文件的目錄及相應(yīng)的圖標(biāo),然后在“ICON”目錄下就會(huì)顯示剛剛導(dǎo)入的圖標(biāo),導(dǎo)入之后并設(shè)置相應(yīng)的屬性如“ID”。添加相應(yīng)的圖標(biāo)之后,在Dlg.cpp文件中的BOOL CMy22Dlg::On

49、InitDialog()函數(shù)中添加以下代碼為每個(gè)按扭加載圖標(biāo)</p><p>  m_btnvoltplus.SetIcon (IDI_LEFT); //為“幅值增加”按扭設(shè)置圖標(biāo)m_btnvoltminus.SetIcon (IDI_RIGHT); //為“幅值減小”按扭設(shè)置圖標(biāo)</p><p>  m_btntimeplus.SetIcon (IDI_LEFT); //為“時(shí)間增加”按

50、扭設(shè)置圖標(biāo)m_btntimeminus.SetIcon (IDI_RIGHT); //為“時(shí)間減少”按扭設(shè)置圖標(biāo)</p><p>  m_btnaplus.SetIcon (IDI_UP); </p><p>  m_btnAMinus.SetIcon (IDI_DOWN);</p><p>  m_btnbplus.SetIcon (IDI_UP);</p&

51、gt;<p>  m_btnbminus.SetIcon (IDI_DOWN);</p><p>  同時(shí)對STATIC TEXT對象m_wndscope設(shè)置標(biāo)題和度量單位顯示的設(shè)置</p><p>  m_wndscope.SetTitle("虛擬示波器");//顯示標(biāo)題</p><p>  m_wndscope.SetValue

52、String ("電壓","伏");//設(shè)置波形顯示時(shí)的幅值單位</p><p>  SetTimer (1, 20, NULL);</p><p><b>  定時(shí)器成員函數(shù)</b></p><p>  在Dlg.cpp文件中添加定時(shí)器函數(shù)OnTimer(UINT nIDEvent),在定時(shí)器函數(shù)中實(shí)現(xiàn)

53、正弦波和余弦波以及方波的的波形實(shí)現(xiàn)函數(shù)</p><p>  方波的波形實(shí)現(xiàn):首先要定義一個(gè)Double類型的變量dTime,調(diào)用系統(tǒng)提供的一個(gè)全局函數(shù)::timeGetTime()來獲取系統(tǒng)當(dāng)前的時(shí)間,然后把獲取的系統(tǒng)當(dāng)前時(shí)間賦值給dTime。因?yàn)榉讲ǖ闹挥袃蓚€(gè)邏輯值,那就是低電平和高電平的顯示。所以本文作者在本系統(tǒng)中申明了一個(gè)Int類型的變量iTime,通過iTime對2取余,即可實(shí)現(xiàn)只有0和1兩種值的功能完整

54、的代碼實(shí)現(xiàn):</p><p>  Double dTime =: timeGetTime ()/1000.0;//獲取系統(tǒng)當(dāng)前時(shí)間</p><p>  int iTime = dTime;//對“dTime”類型進(jìn)行強(qiáng)制類型轉(zhuǎn)換</p><p>  dValue[0] = 4*(iTime%2);//實(shí)現(xiàn)只取邏輯值0和1的表達(dá)式</p><p&g

55、t;  余弦波的波形實(shí)現(xiàn):余弦波的波形實(shí)現(xiàn)與方波的實(shí)現(xiàn)有些類似,但是在實(shí)現(xiàn)正弦波的時(shí)候,本文作者需要用到數(shù)學(xué)中的一個(gè)sin()函數(shù),因此在Dlg.cpp中就要引用<math.h>頭文件。但是Sin () 函數(shù)中的參數(shù)是直接獲取的系統(tǒng)當(dāng)前時(shí)間。完整的代碼實(shí)現(xiàn):</p><p>  Double dTime =: timeGetTime ()/1000.0;//獲取系統(tǒng)時(shí)間</p><

56、p>  dValue[1] = 5*sin(4*dTime) ;//實(shí)現(xiàn)余弦波的表達(dá)式</p><p>  上面兩個(gè)函數(shù)的實(shí)現(xiàn)中有用到的dValue[0]和dValue[1]是作者在OnTimer(UINT nIDEvent)函數(shù)中定義的存放方波和弦波值的一個(gè)一維數(shù)組</p><p><b>  通道的選擇</b></p><p>  在

57、本系統(tǒng)中,作者用到了三個(gè)通道來分別實(shí)現(xiàn)單蹤波A和單蹤波B以及雙蹤波的選擇,在IDD_MY_DLALOG中作者設(shè)置了三個(gè)RADIO按扭,所以在實(shí)現(xiàn)通道選擇的時(shí)候,本文作者使用GetCheckedRadioButton()函數(shù)來獲取按下的是哪一個(gè)按扭,int nID=GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO3),IDC_RADIO1為第一個(gè)按扭的ID,IDC_RADIO3為最后一個(gè)按扭的ID,然

58、后我們再判斷nID與IDC_RADIO1,IDC_RADIO2,IDC_RADIO3的關(guān)系。部分代碼如下:</p><p>  int nID=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3);</p><p>  If (nID==IDC_RADIO1)</p><p><b>  {</b><

59、/p><p>  m_wndScope.ClearB();</p><p>  //刪除正弦波相關(guān)函數(shù),釋放內(nèi)存</p><p>  m_wndScope.AddValueA(dTime,dValue[0]);</p><p>  //隨波形的變化增加波形的末斷端點(diǎn)</p><p>  m_wndScope.SetValu

60、eA(dValue[0]);</p><p>  //在對話框中產(chǎn)生一個(gè)從-4到4變化的數(shù)值</p><p><b>  }</b></p><p>  DevalueA (dTime,dValue[0])與SetValueA(dValue[0])兩個(gè)函數(shù)的具體實(shí)現(xiàn)都可以在Scope.cpp類中找到</p><p>  

61、BUTTON單擊事件的設(shè)計(jì)</p><p>  在本系統(tǒng)的對話框中設(shè)置了8個(gè)BUTTON,在本文的前章節(jié)中已經(jīng)講過了如何為這8個(gè)BUTTON添加消息處理函數(shù),分別為void CMy22Dlg::OnVoltplus(),OnVoltminus(),OnTimeplus(),OnTimeminus(),OnAplus(),OnAminus(),OnBplus(),OnBminus(),但是在前章節(jié)中并沒有寫如何對消

62、息處理的,點(diǎn)擊相應(yīng)的按扭,都會(huì)觸使m_wndscope這個(gè)TEXT對象中的波形的改變,因此在本系統(tǒng)中,作者在每個(gè)BUTTON的消息處理函數(shù)中都調(diào)用了m_wndscop.button(i)。部分代碼如下:</p><p>  Void CMyDlg::OnVoltplus () </p><p><b>  {</b></p><p>  m_w

63、ndScope.Button (0);</p><p><b>  }</b></p><p>  Void CMyDlg::OnVoltminus () </p><p><b>  {</b></p><p>  m_wndScope.Button (1);</p><p&

64、gt;<b>  }</b></p><p>  ………………………省略部分BUTTON的消息處理函數(shù)</p><p>  Void CMyDlg::OnBplus () </p><p><b>  {</b></p><p>  m_wndScope.Button (6);</p>

65、<p><b>  }</b></p><p>  Void CMyDlg::OnBminus () </p><p><b>  {</b></p><p>  m_wndScope.Button (7);</p><p><b>  }</b></p&

66、gt;<p>  在scope.cpp的button(i)中,用Switch語句來判斷按下的是哪個(gè)按扭,并寫出相應(yīng)的消息處理。部分代碼如下:</p><p>  Void CScope::Button( int i )</p><p><b>  {</b></p><p>  Switch (i)</p><

67、p>  {Case 0://如果按下的是“IDC_VOLTPLUS”按扭,則調(diào)節(jié)波形的幅值</p><p><b>  {</b></p><p>  If (m_dDimY>=1&&m_dDimY<10)</p><p>  m_dDimY+=1;</p><p>  If (m_dD

68、imY>=10&&m_dDimY<100)</p><p>  m_dDimY+=10;</p><p>  If (m_dDimY>=100&&m_dDimY<1000)</p><p>  m_dDimY+=100;</p><p>  If (m_dDimY>=1000)&l

69、t;/p><p>  m_dDimY+=1000;</p><p>  Else if (m_dDimY>=0&&m_dDimY<1)</p><p>  m_dDimY+=0.1;</p><p><b>  Break;</b></p><p>  }

70、 // 鼠標(biāo)點(diǎn)擊箭頭按鈕控制幅度的增加</p><p>  Case 1: //如果按下的是“IDC_VOLTMINUS”按扭</p><p><b>  {</b></p><p>  If (m_dDimY>1&&m_dDimY<=10)</p><p> 

71、 M_dDimY-=1;</p><p>  If (m_dDimY>10&&m_dDimY<=100)</p><p>  M_dDimY-=10;</p><p>  If (m_dDimY>100&&m_dDimY<=1000)</p><p>  M_dDimY-=100;<

72、;/p><p>  If (m_dDimY>1000)</p><p>  M_dDimY-=1000;</p><p>  If (m_dDimY<=1)</p><p>  m_dDimY=max (m_dDimY-0.1, 0.1);</p><p><b>  Break;</b>

73、</p><p><b>  }</b></p><p>  Case 2: //如果按下的是“IDC_TIMEPLUS”按扭</p><p>  {m_dDimT+=0.1; break ;} //則每按下一次按扭,時(shí)間增加幅度為“0.1”</p><p>  Case 3:

74、 //如果按下的是“IDC_TIMEPLUS”按鈕 {m_dDimT=max (m_dDimT-0.1, 0.1); break ;} </p><p>  //則如果當(dāng)前時(shí)間大于0.1,則單位時(shí)間減1,如果不是,則當(dāng)前時(shí)間取0.1</p><p>  Case 4://如果按下的是“IDC_AMINUS”</p><p><b&

75、gt;  {</b></p><p>  If (m_Amove>-60)</p><p>  m_Amove=m_Amove-10;</p><p><b>  Break;</b></p><p><b>  }//則A的</b></p><p><

76、;b>  Case 5:</b></p><p><b>  {</b></p><p>  If (m_Amove<60)</p><p>  m_Amove=m_Amove+10;</p><p><b>  Break;</b></p><p>

77、;<b>  }</b></p><p><b>  Case 6:</b></p><p><b>  {</b></p><p>  If (m_Bmove>-60)</p><p>  m_Bmove=m_Bmove-10;</p><p>

78、<b>  Break;</b></p><p><b>  }</b></p><p><b>  Case 7:</b></p><p><b>  {</b></p><p>  If (m_Bmove<60)</p><p

79、>  m_Bmove=m_Bmove+10;</p><p><b>  Break;</b></p><p><b>  }</b></p><p><b>  Default:</b></p><p><b>  Break;</b></p

80、><p><b>  }</b></p><p>  Invalidate ();</p><p><b>  }</b></p><p><b>  曲線面板的設(shè)計(jì) </b></p><p><b>  位圖資源及其應(yīng)用</b>&l

81、t;/p><p><b>  圖形刷新</b></p><p>  徒刑刷新是繪圖過程中必須考慮的問題,圖形刷新包括刷新的請求,系統(tǒng)對刷新請求的響應(yīng)以及具體的刷新方法。</p><p><b>  刷新請求</b></p><p>  首先考慮一種實(shí)際情況,應(yīng)用程序在窗口的用戶區(qū)繪制了一個(gè)橢圓,然后顯示

82、一個(gè)顏色列表框,用戶在列表框上選擇橢圓內(nèi)部的顏色。但是,顯示的列表框覆蓋了橢圓的一部分?,F(xiàn)在的問題是,當(dāng)用戶結(jié)束顏色選擇操作并關(guān)閉對話框后,應(yīng)用程序?qū)⑷绾位謴?fù)橢圓被覆蓋部分的顏色和形狀。</p><p>  Windows應(yīng)用程序大部分的用戶操作都集中在用戶區(qū)內(nèi),因此上述情況可能頻繁出現(xiàn),在窗口大小調(diào)整,窗口移動(dòng)或其他對象覆蓋后,都必須刷新窗口內(nèi)的內(nèi)容,以恢復(fù)用戶區(qū)內(nèi)應(yīng)有的顯示形態(tài)。但是,Windows系統(tǒng)并不總

83、是記錄窗口內(nèi)需保存的內(nèi)容,這樣做即不現(xiàn)實(shí)又沒有必要,系統(tǒng)只能在有限的幾種情況下自動(dòng)刷新。因此應(yīng)用程序必須具有及時(shí)處理刷新請求和刷新響應(yīng)的功能。</p><p>  Windows系統(tǒng)通常通過發(fā)送WM_PAINT消息將刷新請求傳遞給應(yīng)用程序。當(dāng)用戶區(qū)的內(nèi)容刷新時(shí),系統(tǒng)在應(yīng)用程序的消息隊(duì)列中加入該消息,以通知窗口函數(shù)執(zhí)行刷新處理。</p><p>  系統(tǒng)對刷新請求的響應(yīng)</p>

84、<p><b>  窗口移動(dòng)后的刷新</b></p><p>  窗口移動(dòng)后的刷新可以理解為下列事件的發(fā)生,這時(shí)系統(tǒng)將向應(yīng)用程序發(fā)送WM_PAINT消息:</p><p><b>  用戶區(qū)移動(dòng)或顯示。</b></p><p><b>  用戶窗口大小改變。</b></p>

85、<p>  程序通過滾動(dòng)條滾動(dòng)窗口。</p><p><b>  被覆蓋區(qū)域的刷新</b></p><p>  當(dāng)下面的事件發(fā)生時(shí),Windows系統(tǒng)將試圖保存被覆蓋的區(qū)域,以備以后刷新。此后如果系統(tǒng)不能有效刷新,則向應(yīng)用程序發(fā)送WM_PAINT消息:</p><p>  下拉式菜單關(guān)閉,并需要恢復(fù)被覆蓋的部分。</p>

86、<p>  因?yàn)榍宄龑υ捒蚧蛳⒖虻葘ο蠖枰謴?fù)被覆蓋的部分。</p><p>  對于這種情況,筆者有效的組織應(yīng)用程序,使其能夠在系統(tǒng)刷新失效時(shí)利用窗口處理函數(shù)刷新。</p><p>  窗口被另一個(gè)窗口覆蓋的區(qū)域被稱為無效區(qū)域。用戶區(qū)中無效的產(chǎn)生可能導(dǎo)致系統(tǒng)向應(yīng)用程序發(fā)送一條消息。</p><p>  Windows系統(tǒng)為每個(gè)窗口建立了一個(gè)PAIN

87、TSTRUCT結(jié)構(gòu),該結(jié)構(gòu)中包含了包圍無效區(qū)域的一個(gè)最小矩形的結(jié)構(gòu)RECT,這個(gè)矩形稱為無效矩形。應(yīng)用程序可以根據(jù)這個(gè)無效矩形執(zhí)行刷新操作。</p><p><b>  對象穿越后的刷新</b></p><p>  對于下面的對象穿越后的情況,Windows系統(tǒng)自動(dòng)完成刷新任務(wù),應(yīng)用程序不必考慮:</p><p><b>  光標(biāo)穿過

88、用戶區(qū)。</b></p><p><b>  圖標(biāo)拖過用戶區(qū)。</b></p><p>  因此,為了執(zhí)行有效的刷新,應(yīng)用程序必須全面分析系統(tǒng)可能發(fā)送的刷新請求,并根據(jù)不同的情況分別處理。</p><p><b>  刷新方法</b></p><p>  常用的Windows應(yīng)用程序刷新

89、窗口的方法如下:</p><p>  在內(nèi)存中保持一個(gè)顯示輸出的副本,當(dāng)需要重繪窗口時(shí),將副本復(fù)制到相應(yīng)的窗口中.該方法適用于刷新位圖等復(fù)雜圖形.</p><p>  記錄曾經(jīng)發(fā)生的事件,在窗口需要刷新時(shí)重新調(diào)用窗口執(zhí)行這個(gè)事件.</p><p>  重新繪制圖形,一般對于簡單圖形常采用重新繪制圖形方法執(zhí)行刷新.在應(yīng)用程序中,將圖形繪制處理程序放在消息WM_PAIN

90、T響應(yīng)模塊中,一旦程序接受到刷新請求即可重繪圖形.</p><p>  在本系統(tǒng)中主要是圖形的繪制和刷新結(jié)合在一起,本系統(tǒng)中的一個(gè)相關(guān)例子的代碼:</p><p>  void CScope::SetTitle(CString strTitle)//輸出大標(biāo)題文字</p><p><b>  {</b></p><p>

91、;  m_strTitle = strTitle;</p><p>  CClientDC dc(this); </p><p>  Invalidate();//重畫畫面進(jìn)行刷新</p><p><b>  }</b></p><p><b>  獲取設(shè)備環(huán)境</b></p><

92、;p>  獲取設(shè)備環(huán)境是應(yīng)用程序輸出圖形的先決條件,常用的三種獲取設(shè)備環(huán)境的方法是調(diào)用函數(shù)BeginPaint,GetDC 和GetDCEx.</p><p>  調(diào)用BeginPaint函數(shù)</p><p>  應(yīng)用程序響應(yīng)WM_PAINT消息進(jìn)行突襲功能刷新時(shí),主要通過調(diào)用BeginPaint函數(shù)獲取設(shè)備環(huán)境,其形式為:</p><p>  Hdc=Beg

93、inPaint(hwnd,&ps);//ps 為PAINTSTRUCT類型結(jié)構(gòu),定義方式為:</p><p>  PAINTSTRUCT  ps</p><p>  PAINTSTRUCT數(shù)據(jù)結(jié)構(gòu)是Windows系統(tǒng)提供的標(biāo)識無效區(qū)域的結(jié)構(gòu),</p><p><b>  其定義為如下:</b></p><p> 

94、 typedef struct tagPAINTSTRUCT</p><p><b>  {</b></p><p>  HDC hdc; //設(shè)備環(huán)境句柄</p><p>  BOOL fErase; // fErase一般取真值,表示擦除無效矩形的背景</p><p>

95、  RECT rcPaint; //無效矩形標(biāo)識</p><p>  BOOL fRestore; //系統(tǒng)保留</p><p>  BOOL fInUpdate; //系統(tǒng)保留</p><p>  BYTE rgbReserved[32] //系統(tǒng)保留</p><p>  }PAINTST

96、RUCT;</p><p>  RcPaint為標(biāo)準(zhǔn)的RECT數(shù)據(jù)結(jié)構(gòu),其作用是標(biāo)識無效矩形,該結(jié)構(gòu)中 包含了無效矩形的左上角和右下角的坐標(biāo)。</p><p>  系統(tǒng)調(diào)用BeginPaint函數(shù)獲取設(shè)備環(huán)境的同時(shí),填寫ps結(jié)構(gòu),以標(biāo)識需要刷新的無效矩形區(qū),提供給后續(xù)過程進(jìn)一步處理。</p><p>  由BeginPaint函

97、數(shù)獲取的設(shè)備環(huán)境必須用EndPaint函數(shù)釋放,其原型為:</p><p>  BOOL EndPaint(HWND hwnd,PAINTSTRUCT&ps)</p><p><b>  調(diào)用GetDC函數(shù)</b></p><p>  如果Windows應(yīng)用程序的繪圖工作并非由WM_PAINT消息驅(qū)動(dòng),則需調(diào)用GetDC函數(shù)獲取設(shè)備環(huán)境

98、。其形式為:</p><p>  hdc=GetDC(hwnd);</p><p>  由GetDC函數(shù)獲取的設(shè)備環(huán)境必須用ReleaseDC函數(shù)釋放,其原型為:int ReleaseDC (HWND hwnd,HDC Hdc)</p><p>  調(diào)用GetDCEx函數(shù)</p><p>  GetDCEx函數(shù)返回指向特定窗口的客戶區(qū)域或整個(gè)

99、窗口的句柄,它是GetDC的擴(kuò)展,但提供更靈活的操作。它的釋放也是用ReleaseDC函數(shù)來釋放</p><p><b>  映射模式</b></p><p>  映射模式是設(shè)備描述表的內(nèi)容之一,其優(yōu)點(diǎn)是可以不必考慮輸出設(shè)備的坐標(biāo)系情況,而在一個(gè)統(tǒng)一的邏輯坐標(biāo)系中組成圖形的餓繪制與操作,映射模式定義了將邏輯單位轉(zhuǎn)化為設(shè)備的度量單位以及設(shè)備的X方向和Y方向。</p

100、><p><b>  坐標(biāo)系統(tǒng)</b></p><p>  在Windows應(yīng)用程序中有好幾種坐標(biāo)系統(tǒng),它們大致可以分為兩大類:設(shè)備</p><p>  坐標(biāo)系統(tǒng)和邏輯坐標(biāo)系統(tǒng)。</p><p>  在設(shè)備坐標(biāo)系統(tǒng)中又有三種相互獨(dú)立的坐標(biāo)系統(tǒng):屏幕坐標(biāo)系統(tǒng)、窗口坐標(biāo)系統(tǒng)和擁護(hù)坐標(biāo)系統(tǒng)。這些設(shè)備坐標(biāo)系統(tǒng)均以像素點(diǎn)來表示度量單位

101、。X軸的正方向?yàn)閺淖蟮接遥琘軸的正方向?yàn)閺纳舷蛳?。改變像素點(diǎn)只是改變相關(guān)的視頻模式,而改變度量單位將改變相關(guān)的設(shè)備描述表。</p><p>  屏幕坐標(biāo)系統(tǒng)使用了整個(gè)屏幕作為坐標(biāo)區(qū)域,原點(diǎn)為屏幕原點(diǎn)。</p><p>  窗口坐標(biāo)系統(tǒng)使用了邊界在內(nèi)的應(yīng)用程序的窗口作為坐標(biāo)區(qū)域。窗口邊界的左上角是坐標(biāo)系的原點(diǎn)。</p><p>  用戶區(qū)坐標(biāo)系統(tǒng)是最經(jīng)常使用的坐標(biāo)系統(tǒng)

102、。用戶區(qū)是窗口工作區(qū),不包括窗口邊界、菜單條及滾動(dòng)條等。用戶一般只操作應(yīng)用程序的用戶區(qū),因此用戶坐標(biāo)系統(tǒng)對大多數(shù)應(yīng)用程序都是使用的。</p><p>  其他的坐標(biāo)系統(tǒng)都是邏輯坐標(biāo)系統(tǒng)。其中映射模式規(guī)定了GDI函數(shù)中定義的邏輯單位如何轉(zhuǎn)化為設(shè)備坐標(biāo)。在畫一個(gè)對象以前,Windows操作系統(tǒng)會(huì)把這些邏輯單位翻譯成相應(yīng)的設(shè)備坐標(biāo)系統(tǒng)中的單位。</p><p>  在次示波器系統(tǒng)中,筆者用到了很

103、多屏幕坐標(biāo)的設(shè)計(jì),如基線的劃分,曲線面板中網(wǎng)格線的劃分,還有波形坐標(biāo)系的設(shè)計(jì)等。</p><p>  基線的劃分:本系統(tǒng)把橫向基線劃分100等份,以nCenterY這個(gè)中心坐標(biāo)的縱坐標(biāo)值來表示橫向基線上的輔助線,相關(guān)代碼如下:</p><p><b>  //繪制橫向基線</b></p><p>  for(i=1;i<=100;i++)

104、</p><p><b>  {</b></p><p>  pDC->MoveTo(m_rectCurve.left+i*m_rectCurve.Width()/100,nCenterY-1.5);</p><p>  pDC->LineTo(m_rectCurve.left+i*m_rectCurve.Width()/100,n

105、CenterY+3.5);//繪制橫向基線輔助線</p><p><b>  }</b></p><p>  int nPosY;</p><p>  //畫橫線,把整個(gè)面板縱向平均分為四份,然后根據(jù)當(dāng)前nPosY的當(dāng)前值進(jìn)行判斷</p><p>  for(i=1;i<4;i++)</p><

106、p><b>  {</b></p><p>  nPosY = nCenterY+m_rectCurve.Height()/4*i;</p><p>  if(nPosY<m_rectCurve.bottom)</p><p><b>  {</b></p><p>  pDC->

107、MoveTo(m_rectCurve.left,nPosY);</p><p>  pDC->LineTo(m_rectCurve.right,nPosY);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  繪圖工具<

108、/b></p><p>  Windows繪圖使用畫筆和畫刷進(jìn)行,畫筆的功能是畫直線和曲線,畫刷用于指定區(qū)域的填充。</p><p><b>  畫筆</b></p><p>  畫筆的操作包括創(chuàng)建畫筆,將畫筆選入設(shè)備環(huán)境和刪除畫筆。</p><p><b>  畫筆的創(chuàng)建</b></p

109、><p>  使用畫筆之前必須事先定義一個(gè)畫筆句柄。形式如下:</p><p><b>  HPEN Hp;</b></p><p>  定義畫筆句柄完成后,可直接調(diào)用函數(shù)GetStockObject獲取Windows 系統(tǒng)定義的四種畫筆。這四種畫筆分別為WHITE_PEN,BLACK_PEN,DC_PEN

110、和NULL_PEN.例如獲取畫筆BLACK_PEN的形式如下:</p><p>  Hp=(HPEN)GetStockObject(BLACK_PEN);</p><p>  當(dāng)然,也可創(chuàng)建新畫筆。創(chuàng)建新畫筆的形式如下:</p><p><b>  CreatePen</b></p><p><b>  (&l

111、t;/b></p><p>  int nPenStyle,//確定畫筆樣式</p><p>  int nWidth, //畫筆寬度,取0表示一個(gè)像素寬</p><p>  COLORREF rgbColor //畫筆顏色</p><p><b>  );</b></p><p>  本

112、系統(tǒng)在scope.h文件中定義了五種畫筆,分別為曲線A的畫筆,曲線B的畫筆,表格畫筆,明線畫筆,暗線畫筆。</p><p>  CPen m_PenCurveA;//曲線A畫筆</p><p>  CPen m_PenCurveB;//曲線B畫筆</p><p>  CPen m_PenGrid;//表格畫筆</p><p>

113、;  CPen m_PenBrightLine;//明線畫筆</p><p>  CPen m_PenDarkLine;//暗線畫筆</p><p>  在頭文件定義之后,在scope.cpp文件中的數(shù)據(jù)初始化的時(shí)候就開始使用各自的對象來創(chuàng)建自己的畫筆</p><p>  m_PenCurveA.CreatePen(PS_SOLID,2,RGB(0,25

114、5,0));// 曲線A畫筆</p><p>  m_PenCurveB.CreatePen(PS_SOLID,2,RGB(0,255,255)); //曲線B畫筆</p><p>  m_PenGrid.CreatePen(PS_SOLID,0,RGB(192,192,192)); 表格畫筆</p><p>  m_PenBrightLine.CreatePen(

115、PS_SOLID,0,RGB(0xff,0xff,0xff)); 明線畫筆</p><p>  m_PenDarkLine.CreatePen(PS_SOLID,0,RGB(0x55,0x55,0x55)); 暗線畫筆</p><p><b>  將畫筆選入設(shè)備環(huán)境</b></p><p>  創(chuàng)建畫筆后,必須調(diào)用SelectObject函數(shù)將

116、其選入設(shè)備環(huán)境。其形式如下:hPenOld=SelectObject(hdc,hP); //hP為所創(chuàng)建或獲取的畫筆句柄,調(diào)用該函數(shù)后,應(yīng)用程序?qū)⑹褂镁浔鷋P所指的畫筆繪圖,直到選入另外的一種畫筆為止。SelectObject函數(shù)的返回值保存上一次使用的畫筆句柄hPenOld。</p><p>  本系統(tǒng)在繪制面板的時(shí)候,筆者使用pDC->SelectObject(&m_PenBrightLine

117、)選用明線明線畫筆,來繪制曲線面板中左邊的明線和上邊的明線。相關(guān)代碼為:</p><p>  pOldPen = pDC->SelectObject(&m_PenBrightLine);//設(shè)定默認(rèn)為明線畫筆</p><p>  pDC->MoveTo(m_rectValuePanel.left,m_rectValuePanel.top);</p><

118、;p>  pDC->LineTo(m_rectValuePanel.left,m_rectValuePanel.bottom);</p><p>  pDC->MoveTo(m_rectValuePanel.left,m_rectValuePanel.top);</p><p>  pDC->LineTo(m_rectValuePanel.right,m_rectV

119、aluePanel.top);</p><p>  使用pDC->SelectObject(&m_PenBrightLine)來選用暗線畫筆來繪制曲線面板中右邊和下邊的暗線。相關(guān)代碼為:</p><p>  pDC->SelectObject(&m_PenDarkLine);//設(shè)定默認(rèn)為暗線畫筆</p><p>  pDC->Mo

120、veTo(m_rectValuePanel.right,m_rectValuePanel.top);</p><p>  pDC->LineTo(m_rectValuePanel.right,m_rectValuePanel.bottom);</p><p>  pDC->MoveTo(m_rectValuePanel.left,m_rectValuePanel.bottom)

121、;</p><p>  pDC->LineTo(m_rectValuePanel.right,m_rectValuePanel.bottom);</p><p><b>  刪除畫筆</b></p><p>  不再使用當(dāng)前畫筆時(shí),需調(diào)用函數(shù)DeleteObject刪除畫筆,以免占用內(nèi)存空間。在刪除前應(yīng)首先調(diào)用函數(shù)SelectObjec恢

溫馨提示

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

評論

0/150

提交評論