![c++大作業(yè)畫sin曲線_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/b41b64fe-dd16-45d1-a7f6-71686ce48f50/b41b64fe-dd16-45d1-a7f6-71686ce48f501.gif)
![c++大作業(yè)畫sin曲線_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/b41b64fe-dd16-45d1-a7f6-71686ce48f50/b41b64fe-dd16-45d1-a7f6-71686ce48f502.gif)
![c++大作業(yè)畫sin曲線_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/b41b64fe-dd16-45d1-a7f6-71686ce48f50/b41b64fe-dd16-45d1-a7f6-71686ce48f503.gif)
![c++大作業(yè)畫sin曲線_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/b41b64fe-dd16-45d1-a7f6-71686ce48f50/b41b64fe-dd16-45d1-a7f6-71686ce48f504.gif)
![c++大作業(yè)畫sin曲線_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/b41b64fe-dd16-45d1-a7f6-71686ce48f50/b41b64fe-dd16-45d1-a7f6-71686ce48f505.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Visual C+程序設(shè)計重慶科技學(xué)院Visual C+程序設(shè)計大作業(yè)專業(yè)班級: 應(yīng)數(shù)12級2班 學(xué) 號: 姓 名: 成 績: 1、 公共部分1. 請詳細(xì)地論述面向?qū)ο蟮姆庋b性和繼承性。封裝性:封裝(Encapsulation)就是把對象的屬性和行為結(jié)合成一個獨立的單位,并盡可能隱蔽對象的內(nèi)部細(xì)節(jié)。封裝有兩個含義:一是把對象的全部屬性和行為結(jié)合在一起,形成一個不可分割的獨立單位,對象的屬性值(除了公有的屬性值)只能由這個對象的行為來讀取和修改;二是盡可能隱蔽對象的內(nèi)部細(xì)節(jié),對外形成一道屏障,與外部的聯(lián)系只能通過外部接口實現(xiàn)。封裝的信息隱蔽作用反映了事物的相對獨立性,可以只關(guān)心它對外所提供的接口
2、,即能做什么,而不注意其內(nèi)部細(xì)節(jié),即怎么提供這些服務(wù)。例如,用陶瓷封裝起來的一塊集成電路芯片,其內(nèi)部電路是不可見的,而且使用者也不關(guān)心它的內(nèi)部結(jié)構(gòu),只關(guān)心芯片引腳的個數(shù)、引腳的電氣參數(shù)及引腳提供的功能,利用這些引腳,使用者將各種不同的芯片連接起來,就能組裝成具有一定功能的模塊。封裝的結(jié)果使對象以外的部分不能隨意存取對象的內(nèi)部屬性,從而有效地避免了外部錯誤對它的影響,大大減小了查錯和排錯的難度。另一方面,當(dāng)對象內(nèi)部進(jìn)行修改時,由于它只通過少量的外部接口對外提供服務(wù),因此同樣減小了內(nèi)部的修改對外部的影響。同時,如果一味地強(qiáng)調(diào)封裝,則對象的任何屬性都不允許外部直接存取,要增加許多沒有其他意義,只負(fù)責(zé)
3、讀或?qū)懙男袨?。這為編程工作增加了負(fù)擔(dān),增加了運行開銷,并且使得程序顯得臃腫。為了避免這一點,在語言的具體實現(xiàn)過程中應(yīng)使對象有不同程度的可見性,進(jìn)而與客觀世界的具體情況相符合。封裝機(jī)制將對象的使用者與設(shè)計者分開,使用者不必知道對象行為實現(xiàn)的細(xì)節(jié),只需要用設(shè)計者提供的外部接口讓對象去做。封裝的結(jié)果實際上隱蔽了復(fù)雜性,并提供了代碼重用性,從而降低了軟件開發(fā)的難度。 封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實現(xiàn)軟件部件的“高內(nèi)聚、低耦合”,防止程序相互依賴性而帶來的變動影響。在面向?qū)ο蟮木幊陶Z言中,對象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語言的封裝更為清晰、更為有力。面向?qū)ο蟮姆?/p>
4、裝就是把描述一個對象的屬性和行為的代碼封裝在一個“模塊”中,也就是一個類中,屬性用變量定義,行為用方法進(jìn)行定義,方法可以直接訪問同一個對象中的屬性。通常情況下,只要記住讓變量和訪問這個變量的方法放在一起,將一個類中的成員變量全部定義成私有的,只有這個類自己的方法才可以訪問到這些成員變量,這就基本上實現(xiàn)對象的封裝,就很容易找出要分配到這個類上的方法了,就基本上算是會面向?qū)ο蟮木幊塘恕0盐找粋€原則:把對同一事物進(jìn)行操作的方法和相關(guān)的方法放在同一個類中,把方法和它操作的數(shù)據(jù)放在同一個類中。繼承性:客觀事物既有共性,也有特性。如果只考慮事物的共性,而不考慮事物的特性,就不能反映出客觀世界中事物之間的層
5、次關(guān)系,不能完整地、正確地對客觀世界進(jìn)行抽象描述。運用抽象的原則就是舍棄對象的特性,提取其共性,從而得到適合一個對象集的類。如果在這個類的基礎(chǔ)上,再考慮抽象過程中各對象被舍棄的那部分特性,則可形成一個新的類,這個類具有前一個類的全部特征,是前一個類的子集,形成一種層次結(jié)構(gòu),即繼承結(jié)構(gòu)。繼承(Inheritance)是一種聯(lián)結(jié)類與類的層次模型。繼承性是指特殊類的對象擁有其一般類的屬性和行為。繼承意味著“自動地?fù)碛小保刺厥忸愔胁槐刂匦露x已在一般類中定義過的屬性和行為,而它卻自動地、隱含地?fù)碛衅湟话泐惖膶傩耘c行為。繼承允許和鼓勵類的重用,提供了一種明確表述共性的方法。一個特殊類既有自己新定義的屬
6、性和行為,又有繼承下來的屬性和行為。盡管繼承下來的屬性和行為是隱式的,但無論在概念上還是在實際效果上,都是這個類的屬性和行為。當(dāng)這個特殊類又被它更下層的特殊類繼承時,它繼承來的和自己定義的屬性和行為又被下一層的特殊類繼承下去。因此,繼承是傳遞的,體現(xiàn)了大自然中特殊與一般的關(guān)系。在軟件開發(fā)過程中,繼承性實現(xiàn)了軟件模塊的可重用性、獨立性,縮短了開發(fā)周期,提高了軟件開發(fā)的效率,同時使軟件易于維護(hù)和修改。這是因為要修改或增加某一屬性或行為,只需在相應(yīng)的類中進(jìn)行改動,而它派生的所有類都自動地、隱含地作了相應(yīng)的改動。由此可見,繼承是對客觀世界的直接反映,通過類的繼承,能夠?qū)崿F(xiàn)對問題的深入抽象描述,反映出人
7、類認(rèn)識問題的發(fā)展過程。2. 請結(jié)合例程分別詳細(xì)的論述什么是面向?qū)ο蟮撵o態(tài)多態(tài)和運行時多態(tài)。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的重要特性之一,它與封裝性和繼承性面向?qū)ο蟪绦蛟O(shè)計的三大特性。所謂多態(tài)性,是指不同類型的對象接受相同的消息時產(chǎn)生不同的行為。這里的消息主要是指對類的成員函數(shù)的調(diào)用,而不同的行為是指成員函數(shù)的不同實現(xiàn)。在c+中,多態(tài)性可分為兩種:編譯時的多態(tài)性(靜態(tài)多態(tài))和運行時的多態(tài)性。運行時多態(tài): 運行時的多態(tài)性是通過虛函數(shù)(virtual)來實現(xiàn)的,它指在程序執(zhí)行之前,根據(jù)函數(shù)和參數(shù)還無法確定應(yīng)該調(diào)用哪一個函數(shù),必須在程序的執(zhí)行過程中,根據(jù)具體的執(zhí)行情況動態(tài)地確定。 #include <
8、iostream.h> class CShape public: virtual float area() /將area定義成虛函數(shù) return 0.0; ; class CTtriangle: public CShape public: CTtriangle(float h,float w) H=h; W=w; Float area() return(float)(H*W*0.5); private: Float H,W;Class CCircle:public CShapepublic: CCircle(float r) R=r; float area() return(float
9、)(3.14159265*R*R); private: Floa R;int main() CShape*s2; s0=new CTriangle(3,4); cout<<s0->area()<<endl; s1=new CCircle(5); cout<<s1->area()<<endl; Return 0;程序運行結(jié)果如下:678.5398代碼中,虛函數(shù)area是通過在基類的area函數(shù)前面加上virtual關(guān)鍵字來實現(xiàn)的。程序中*s2是定義的基類CShape指針,語句“s0=new CTriangle(3,4);”是將s0指向派
10、生類CTriangle,因而“s0->area()”實際上是調(diào)用CTriangle類的area成員函數(shù),結(jié)果是6;同樣可以分析s1->area()的結(jié)果。從這個例子可以看出,正是通過虛函數(shù),達(dá)到了用基類指針訪問派生類對象成員函數(shù)的目的,從而使一個函數(shù)具有多種不同的版本,這一點與重載函數(shù)相似,只不過虛函數(shù)的不同版本是在該基類的派生類中重新定義的。這樣,只要聲明了基類指針就可以使不同的派生類對象產(chǎn)生不同的函數(shù)調(diào)用,實現(xiàn)了程序的運行時多態(tài)。需要說明的是:(1)虛函數(shù)在重新定義時,參數(shù)的個數(shù)和類型必須和基類中的虛函數(shù)完全匹配,這一點和函數(shù)重載完全不同。(2) 只有通過基類指針才能實現(xiàn)虛函數(shù)
11、的多態(tài)性,若虛函數(shù)的調(diào)用是通過普通方式來進(jìn)行的,則不能實現(xiàn)其多態(tài)性。例如: CShape ss; cout<<ss.area()<<endl;輸出的結(jié)果為0.0。(3)如果不使用new來創(chuàng)建相應(yīng)的派生類對象指針,也可以通過使用&運算符來獲取對象的地址。例如: void main() CShape*p1,*p2; CTriangle tri(3,4); CCircle cir(5); p1=&tri;p2=○ cout<<p1->area()<<endl; Cout<<p2->area()&l
12、t;<endl; (4) 虛函數(shù)必須是類的一個成員函數(shù),不能是友元函數(shù),也不能是靜態(tài)的成員函數(shù)。(5) 可以把析構(gòu)函數(shù)定義為虛函數(shù),但不能將構(gòu)造函數(shù)定義為虛函數(shù)。通常在釋放基類中及其派生類中動態(tài)申請存儲空間時,也要把析構(gòu)函數(shù)定義為虛函數(shù),以便實現(xiàn)撤銷對象時的多態(tài)性。 靜態(tài)多態(tài): 編譯時的多態(tài)性態(tài)則是通過函數(shù)或運算符的重載來實現(xiàn)的,下面舉兩個例子:1)函數(shù)模板 template <typename T> T max(const T& lsh, const T& rhs) return (lsh > rhs) ? lsh : rhs; 返回兩個任意類型對象的
13、最大值,前提是該類型能夠使用>運算符進(jìn)行比較,并且返回值是BOOL類型。使用: int a = 3; int b = 4; cout << max(a, b) << endl; float c = 2.4; float d = 1.2; cout << max(c, d) << endl;輸出結(jié)果為: 4 2.4 這種綁定發(fā)生在編譯期,這是由于模板的實例化是發(fā)生在編譯期的,即在編譯時編譯器發(fā)現(xiàn)你調(diào)用max(a, b)時就自動生成一個函數(shù) int max(const int& lsh, const int& rhs) retu
14、rn (lsh > rhs) ? lsh : rhs; 2)函數(shù)重載 int max (int a, int b) return (a > b) ? a : b; int max (int a, int b, int c) return max(max(a, b), c); 以上兩個函數(shù)名稱一樣,參數(shù)類型或個數(shù)不完全相同,返回值一樣。使用: int a = 3, b = 4, c = 5; cout << max(a, b) << endl; cout << max(a, b, c) << endl;輸出結(jié)果為: 4 5 確定函數(shù)的過
15、程也發(fā)生在編譯器,當(dāng)你使用max(a, b),編譯器發(fā)現(xiàn)只有兩個參數(shù),那么就調(diào)用只有兩個參數(shù)的函數(shù)版本,當(dāng)使用max(a, b, c)時,編譯器則使用有3個參數(shù)的版本。通過上面的兩個例子,你還可以使用更為方便的函數(shù)重載: template <typename T> T max(const T& lsh, const T& rhs) return (lsh > rhs) ? lsh : rhs; template <typename T> T max(const T& a, const T& b, const T& c) re
16、turn max(max(a, b), c); 使用: float a = 3.6, b = 1.2, c = 7.8; cout << max(a, b, c) << endl;輸出結(jié)果為: 7.8 通過參數(shù)個數(shù)和類型,編譯器自動生成和調(diào)用對應(yīng)得函數(shù)版本。3. 詳細(xì)描述你所理解的MFC的文檔視圖架構(gòu)。應(yīng)用程序的大部分代碼都會被添加在文檔和視圖這兩類中。文檔和視圖緊密相連,是用戶和文檔之間的交互接口。用戶通過文檔視圖結(jié)構(gòu)可實現(xiàn)數(shù)據(jù)的傳輸、編輯、讀取和保存等。但文檔、視圖以及和應(yīng)用程序框架的相關(guān)部分之間還包含了一系列非常復(fù)雜的相互作用。拆分窗口和一檔多視是文檔和視圖相互作
17、用的典型實例。1. 文檔視圖結(jié)構(gòu)概述文檔即應(yīng)用程序數(shù)據(jù)的基本元素的集合,是構(gòu)成應(yīng)用程序所使用的數(shù)據(jù)單元,提供數(shù)據(jù)管理和維護(hù)的手段。視圖即在文檔和用戶之間其中介作用,是數(shù)據(jù)的用戶窗口,提供文檔數(shù)據(jù)的顯示功能,并為用戶提供了數(shù)據(jù)交互操作的界面。MFC提供了兩類文檔應(yīng)用程序:只有一個窗口的單文檔界面(SDI)及同時可以操作多個文檔的多文檔界面(MDI)。2.文檔與視圖的相互作用 MFC應(yīng)用程序用一種編程式使程序中數(shù)據(jù)與它的顯示形式和用戶交互分離開來,這種模式就是“文檔視圖結(jié)構(gòu)”,文檔視圖結(jié)構(gòu)能方便地實現(xiàn)文檔和視圖的相互作用。一旦在用MFC AppWizard (exe)創(chuàng)建SDI/MDI的第1步中選
18、中了Document/View architecture support(文檔/視圖體系結(jié)構(gòu)支持)復(fù)選框,就可使用CView:GetDocument、CDocument:UpdateAllViews、CView:OnUpdate、CView:OnInitialUpdate及CDocument:OnNewDocument 5個文檔和視圖相互作用的重要成員函數(shù)。3. 文檔視圖結(jié)構(gòu)的內(nèi)在機(jī)制A.文檔保留了該文檔的視圖列表,一個文檔至少有一個相關(guān)聯(lián)的視圖,而一個視圖只能與一個文檔關(guān)聯(lián)。B.視圖保留了指向其對應(yīng)的指針,該指針包含在視圖所在框架之中。C.框架保留了指向其當(dāng)前活動視圖的指針。MFC提供了文檔
19、/視圖模型以實現(xiàn)數(shù)據(jù)和現(xiàn)實的分離。文檔類(Dcument)用來維護(hù)、管理數(shù)據(jù),包括數(shù)據(jù)的讀取、存儲與修改;視圖類(View)用來接收顯示數(shù)據(jù),將這些數(shù)據(jù)交給文檔類來處理。在文檔/視圖結(jié)構(gòu)中,MFC文檔對象將數(shù)據(jù)讀入或?qū)懭胗谰么鎯^(qū),并提供數(shù)據(jù)駐留位置的接口。而一個視圖對象可以管理數(shù)據(jù)顯示,包括在窗口中顯示數(shù)據(jù)。編輯數(shù)據(jù)等。MFC可以利用文檔/視圖結(jié)構(gòu)使用一個單獨的視圖對象表示每個數(shù)據(jù)視圖,還可以使用文檔對象同時更新所有試圖。MFC文檔/視圖將數(shù)據(jù)結(jié)構(gòu)的存儲與維護(hù)同其是分開的,圖4顯示了文檔與視圖的關(guān)系。文檔視圖當(dāng)前可見的文檔視圖圖1 文檔與視圖的關(guān)系文檔/視圖結(jié)構(gòu)類的各自主要作用:1)文檔用于
20、管理應(yīng)用程序的數(shù)據(jù)。2) 視圖的主要作用是以圖形方式顯示文檔數(shù)據(jù),以及接收用戶的輸入并將其解釋為對文檔的操作。3)MFC框架使用框架窗口來包含視圖,框架窗口提供了用于環(huán)繞視圖的可見框架(菜單、最小化和最大化窗口等),使用窗口框架類管理框架,使用視圖類管理框架中的視圖,用戶與文檔之間的交互操作發(fā)生在視圖的客戶區(qū)內(nèi),而不是框架窗口的客戶區(qū)內(nèi);4)框架使用了兩個文檔模板類用于管理創(chuàng)建文檔及關(guān)聯(lián)的視圖和框架窗口的復(fù)雜過程,由應(yīng)用程序?qū)ο髣?chuàng)建文檔模板,由文件模板創(chuàng)建文檔和框架窗口,而由框架窗口創(chuàng)建文檔的對應(yīng)視圖。二、選做部分1. 用MFC AppWizard(exe)創(chuàng)建一個單文檔的應(yīng)用程序1)雙擊桌面
21、上的Visual C+6.0快捷方式圖標(biāo),選擇文件新建命令,在彈出的新建對話框中,選擇MFC AppWizard(exe)項目類型(該類型用于創(chuàng)建可執(zhí)行的Windows應(yīng)用程序),將位置(項目工作文件夾)定位在H:題目二,并在工程名稱中輸入項目名:題目二,如圖1.1所示。圖1.1 MFC AppWizard的新建對話框2)單擊確定按鈕,彈出如圖1.2所示的步驟1對話框,應(yīng)用程序類型選擇單文檔。因此次程序的需要,直接單擊完成按鈕,便完成了單文檔應(yīng)用程序的創(chuàng)建。圖1.2 MFC AppWizard的步驟1對話框2. 為單文檔應(yīng)用程序添加對話框2.1 插入對話框選擇“插入”“資源”菜單命令,打開“插
22、入資源”對話框,在對話框中可以看到資源列表中存在Dialog項,單擊“新建”按鈕便在此程序中創(chuàng)建了一個對話框,如圖2.1所示。圖2.1 “插入資源”對話框2.2 設(shè)置對話框?qū)傩约疤砑雍筒季挚丶?.2.1 設(shè)置對話框?qū)傩栽趯υ捒蚰0宓目瞻滋幱覔羰髽?biāo),從彈出的快捷菜單中選擇“屬性”菜單項,彈出對話框,ID修改為IDD_DIALOG,Caption標(biāo)題改為:關(guān)于sin曲線,如圖2.2所示。 圖2.2 對話框?qū)傩源翱?.2.2 添加和布局控件參看圖2.3所示的空間布局,用編輯器為對話框添加如表2.1所示的一些控件。圖2.3 “關(guān)于sin曲線”對話框表2.1控件ID號標(biāo)題屬性靜態(tài)文本默認(rèn)區(qū)間起始位置:默
23、認(rèn)靜態(tài)文本默認(rèn)區(qū)間結(jié)束位置:默認(rèn)控件ID號標(biāo)題屬性編輯框IDD_EDIT1無默認(rèn)編輯框IDD_EDIT2無默認(rèn)2.2.3 創(chuàng)建對話框類在對話框資源模板的空白區(qū)域(沒有其他元素或控件)內(nèi)雙擊鼠標(biāo)左鍵,將彈出如圖2.4所示的對話框,詢問是否為對話框資源創(chuàng)建一個新類。單擊OK按鈕,則為該對話框創(chuàng)建類,Name為:CDlg。Base class為CDialog。圖2.4 Adding a class對話框利用ClassWizard,為表2.2所示的對話框類(CDlg)的控件增加成員變量。表2.2控件控件ID號變量類型變量名范圍和大小編輯框IDD_EDIT1doublem_t1-10.010.0編輯框I
24、DD_EDIT2doublem_t2-10.010.03. 設(shè)計菜單用編輯器設(shè)計菜單:在項目工作區(qū)打開ResourceView選項卡,展開Menu文件夾,雙擊IDR_MAINFRAME,右邊的文檔窗口出現(xiàn)菜單編輯器,如圖3.1所示;展開“編輯”下拉菜單,如圖3.2所示,刪除其下所有子菜單,雙擊空白子菜單,彈出“菜單項屬性”對話框,在Caption處寫菜單名:修改參數(shù),在ID處寫:ID_AMEND。圖3.1 菜單資源編輯器圖3.2 菜單編輯器和修改菜單項屬性4. 編寫代碼 在文檔類的頭文件“題目二Doc.h”的class CMyDoc : public CDocument中寫如下語句:publi
25、c:double m_t1;/定義區(qū)間起始位置變量double m_t2; /定義區(qū)間結(jié)束位置變量double m_yMin;double m_yMax;CDC m_dc;bool bStart;void Draw();double fun(double x);void Rang();5. 圖形繪制5.1 運行結(jié)果編譯并運行程序,則彈出如圖5.1所示的窗口,單擊“文件”“新建”,彈出寫入?yún)?shù)對話框(關(guān)于sin曲線),寫入?yún)?shù)如圖5.2所示,點擊“確定”按鈕,即可得到繪制的sin曲線圖如圖5.3所示。圖5.1圖5.2圖5.35.2 修改參數(shù)并繪圖當(dāng)繪制如圖5.3時,還可通過單擊“編輯”“修改參數(shù)
26、”,重新寫入?yún)?shù),令X軸起始位置為-10,X軸結(jié)束位置為10,繪制sin曲線如圖5.4所示。圖5.46. 保存繪圖結(jié)果未保存前,此曲線圖無標(biāo)題,如圖6.1所示,當(dāng)單擊“文件”“保存”,彈出如圖6.1所示的窗口,將文件名記為“sin曲線圖”,點擊保存即可。圖6.1 保存后此曲線標(biāo)題為“sin曲線圖”,如圖6.2所示。圖6.2附錄Dlg.cpp :#include "stdafx.h"#include "題目二.h"#include "Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_
27、FILEstatic char THIS_FILE = _FILE_;#endif/ CDlg dialogCDlg:CDlg(double t1, double t2, CWnd* pParent /*=NULL*/): CDialog(CDlg:IDD, pParent)/AFX_DATA_INIT(CDlg)m_t1 = t1;m_t2 = t2;/AFX_DATA_INITvoid CDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CDlg)DDX_Text(pDX, IDC
28、_T1, m_t1);DDX_Text(pDX, IDC_T2, m_t2);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CDlg, CDialog)/AFX_MSG_MAP(CDlg)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CDlg message handlersBOOL CDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization here/UpdateData(FALSE);return TRUE; / return TRUE unless you set
29、the focus to a control / EXCEPTION: OCX Property Pages should return FALSE/為“確定”按鈕添加代碼void CDlg:OnOK() UpdateData(); /數(shù)據(jù)從控件向相關(guān)聯(lián)的成員變量復(fù)制編輯框的內(nèi)容在按鈕上顯示if(m_t1 >= m_t2) /做判斷MessageBox("X軸起始位置必須小于X軸結(jié)束位置"); return;CDialog:OnOK();MainFrm.cpp :#include "stdafx.h"#include "題目二.h&quo
30、t;#include "MainFrm.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CMainFrameIMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)/AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_UPDATE_COMMAND_UI(ID_AMEND, OnUpdateAmend)/AFX
31、_MSG_MAPEND_MESSAGE_MAP()static UINT indicators =ID_SEPARATOR, / status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;/ CMainFrame construction/destructionCMainFrame:CMainFrame()/ TODO: add member initialization code hereCMainFrame:CMainFrame()int CMainFrame:OnCreate(LPCREATEST
32、RUCT lpCreateStruct)if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)TRACE0("Failed to create toolbarn&qu
33、ot;);return -1; / fail to createif (!m_wndStatusBar.Create(this) |!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)TRACE0("Failed to create status barn");return -1; / fail to createm_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlB
34、ar(&m_wndToolBar);return 0;BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn TRUE;/ CMainFrame diagnostics#ifdef _DEBUGvoid CMainFrame:AssertValid() constCFr
35、ameWnd:AssertValid();void CMainFrame:Dump(CDumpContext& dc) constCFrameWnd:Dump(dc);#endif /_DEBUG/ CMainFrame message handlersvoid CMainFrame:OnUpdateAmend(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code here題目二Doc.cpp : #include "stdafx.h"#include "題目二.h"#in
36、clude "題目二Doc.h"#include "dlg.h"#include <math.h>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CMyDocIMPLEMENT_DYNCREATE(CMyDoc, CDocument)BEGIN_MESSAGE_MAP(CMyDoc, CDocument)/AFX_MSG_MAP(CMyDoc)ON_COMMAND(ID_AMEND, OnAmend)ON_UPDA
37、TE_COMMAND_UI(ID_AMEND, OnUpdateAmend)ON_UPDATE_COMMAND_UI(ID_FILE_SAVE_AS, OnUpdateFileSaveAs)ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CMyDoc construction/destructionCMyDoc:CMyDoc()/變量初始化m_t1 = 0.0; m_t2 = 0.0;m_yMin = 0.0;m_yMax = 0.0;bStart = true;CMyDoc:
38、CMyDoc()/新建對話框BOOL CMyDoc:OnNewDocument()if(!bStart)CDlg dlg;if(dlg.DoModal() = IDOK) /用戶單擊了“確定”按鈕m_t1 = dlg.m_t1;m_t2 = dlg.m_t2;Draw(); /調(diào)用Draw()函數(shù)elsereturn FALSE;elsebStart = false;if (!CDocument:OnNewDocument()return FALSE;/ TODO: add reinitialization code here/ (SDI documents will reuse this d
39、ocument)return TRUE;/繪制sin曲線圖void CMyDoc:Draw()m_dc.DeleteDC();Rang();POSITION pos = GetFirstViewPosition(); /調(diào)用繪圖函數(shù)CDC *pDC = GetNextView(pos)->GetDC();CBitmap bmp;bmp.CreateCompatibleBitmap(pDC, WIDTH, HEIGHT);m_dc.CreateCompatibleDC(pDC);m_dc.SelectObject(&bmp);CRect rc(0, 0, WIDTH, HEIGHT
40、);m_dc.FillRect(&rc, &CBrush(RGB(255,255,255); /畫坐標(biāo)軸m_dc.MoveTo(0, GetY(0);m_dc.LineTo(WIDTH, GetY(0);m_dc.MoveTo(GetX(0), 0);m_dc.LineTo(GetX(0), HEIGHT);rc.right = GetX(0) - 1;rc.top = GetY(0) + 2;rc.left = rc.right - 100;rc.bottom = rc.top + 100;m_dc.DrawText("O", &rc, DT_RI
41、GHT | DT_TOP | DT_SINGLELINE);char c20;int i;double j;double jg = (m_t2 - m_t1) / 5;for(j = m_t1; j <= m_t2; j += jg)if(j = 0.0)continue;m_dc.MoveTo(GetX(j), GetY(0);m_dc.LineTo(GetX(j), GetY(0) - 7);sprintf(c, "%g", j);rc.left = GetX(j) - 100;rc.right = GetX(j) + 100;m_dc.DrawText(c, &
42、amp;rc, DT_CENTER | DT_TOP | DT_SINGLELINE);jg = (m_yMax - m_yMin) / 5;rc.right = GetX(0) - 1;rc.left = rc.right - 100;for(i = int(m_yMin - 0.5) / jg); i <= int(m_yMax + 0.5) / jg); i +)if(i = 0)continue;m_dc.MoveTo(GetX(0), GetY(i * jg);m_dc.LineTo(GetX(0) + 7, GetY(i * jg);sprintf(c, "%g&q
43、uot;, i * jg);rc.top = GetY(i * jg) - 100;rc.bottom = GetY(i * jg) + 100;m_dc.DrawText(c, &rc, DT_VCENTER | DT_RIGHT | DT_SINGLELINE);m_dc.SetTextAlign(TA_RIGHT | TA_TOP);m_dc.TextOut(WIDTH, GetY(0) + 2, "x"); /畫出x軸m_dc.TextOut(GetX(0), 0, "y"); /y軸CPen pen(PS_SOLID, 1, RGB(0
44、,0,0); /定義黑色畫筆m_dc.SelectObject(pen);jg = (m_t2 - m_t1) / 1000;m_dc.MoveTo(GetX(m_t1), GetY(fun(m_t1);for(j = m_t1 + jg; j <= m_t2; j +=jg)m_dc.LineTo(GetX(j), GetY(fun(j);UpdateAllViews(NULL);/ CMyDoc serialization/文件保存和打開void CMyDoc:Serialize(CArchive& ar)if(bStart)bStart = false;/檔案表頭BITMA
45、PFILEHEADER bfh;ZeroMemory(&bfh, sizeof(bfh);bfh.bfType = *(WORD*)"BM"bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + HEIGHT * (WIDTH * 3 + 3) / 4 * 4);/資訊表頭BITMAPINFO bmi;ZeroMemory(&bmi, sizeof(bmi);
46、bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bmi.bmiHeader.biWidth = WIDTH;bmi.bmiHeader.biHeight = HEIGHT;bmi.bmiHeader.biPlanes = 1;bmi.bmiHeader.biBitCount = 24;bmi.bmiHeader.biCompression = BI_RGB;bmi.bmiHeader.biSizeImage = HEIGHT * (WIDTH * 3 + 3) / 4 * 4);/保存繪圖結(jié)果if (ar.IsStoring()/ TODO: a
47、dd storing code hereCDC dc;CBitmap bmp;dc.CreateCompatibleDC(&m_dc);bmp.CreateCompatibleBitmap(&m_dc, WIDTH, HEIGHT);dc.SelectObject(bmp);dc.BitBlt(0, 0, WIDTH, HEIGHT, &m_dc, 0, 0, SRCCOPY);BITMAP bm;bmp.GetObject(sizeof(bm), &bm);DWORD len = bm.bmHeight * bm.bmWidthBytes;BYTE *c =
48、new BYTElen;bmp.GetBitmapBits(len, c);ar.Write(&bfh, sizeof(bfh);ar.Write(&bmi, sizeof(bmi);for(int i = bm.bmHeight - 1; i >= 0; i -)int j;for(j = 0; j < bm.bmWidthBytes; j +=4)ar<<ci * bm.bmWidthBytes + j + 1<<ci * bm.bmWidthBytes + j + 2<<ci * bm.bmWidthBytes + j;if
49、(WIDTH % 4)for(j = 4 - (WIDTH * 3) % 4; j > 0; j -)ar<<BYTE(0);delete c;ar<<m_t1<<m_t2;else/ TODO: add loading code hereBITMAPFILEHEADER bfh1;BITMAPINFO bmi1;if(ar.Read(&bfh1, sizeof(bfh1) < sizeof(bfh1)AfxMessageBox("打開文件失敗");return;if(memcmp(&bfh1, &bf
50、h, sizeof(BITMAPFILEHEADER)AfxMessageBox("打開文件失敗");return;if(ar.Read(&bmi1, sizeof(bmi1) < sizeof(bmi1)AfxMessageBox("打開文件失敗");return;if(memcmp(&bmi1, &bmi, sizeof(BITMAPINFO)AfxMessageBox("打開文件失敗");return;BYTE *c = new BYTEbmi.bmiHeader.biSizeImage;if(ar
51、.Read(c, bmi.bmiHeader.biSizeImage) < bmi.bmiHeader.biSizeImage)delete c;AfxMessageBox("打開文件失敗");return;delete c;double t1,t2;if(ar.Read(&t1, sizeof(double) < sizeof(double)AfxMessageBox("打開文件失敗");return;if(ar.Read(&t2, sizeof(double) < sizeof(double)AfxMessageBo
52、x("打開文件失敗");return;m_t1 = t1;m_t2 = t2;Draw();/ CMyDoc diagnostics#ifdef _DEBUGvoid CMyDoc:AssertValid() constCDocument:AssertValid();void CMyDoc:Dump(CDumpContext& dc) constCDocument:Dump(dc);#endif /_DEBUG/為“修改參數(shù)”添加代碼void CMyDoc:OnAmend() CDlg dlg(m_t1, m_t2);if(dlg.DoModal() = IDOK) /用戶單擊了“確定”按鈕m_t1 = dlg.m_t1;m_t2 = dlg.m_t2;Draw();void CMyDoc:OnUpdateAmend(CCmdUI* pCmdUI) / TODO: Add your command update UI handle
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2學(xué)會溝通交流(說課稿)-2023-2024學(xué)年道德與法治五年級上冊統(tǒng)編版
- 2025暫估價材料公開招標(biāo)合同范本變頻水泵排污泵
- 6~9的認(rèn)識(說課稿)-2024-2025學(xué)年一年級上冊數(shù)學(xué)人教版
- 2025以買賣合同擔(dān)保
- 2024年秋九年級化學(xué)上冊 第四單元 自然界的水說課稿 (新版)新人教版
- 2023三年級英語上冊 Assessment 3說課稿1 湘少版
- 路基邊坡防滑平臺施工方案
- Unit 4 My tidy bag Lesson 1 I have a big bag (說課稿)-2024-2025學(xué)年粵人版(2024)英語三年級上冊
- 2023八年級地理上冊 第一章 中國的疆域與人口第一節(jié) 中國的疆域說課稿 (新版)湘教版
- 出租代工合同范例
- 2024北京海淀高三一模英語試卷(含參考答案)
- 三高疾病之中醫(yī)辨證施治
- 全科醫(yī)學(xué)的基本原則和人文精神(人衛(wèi)第五版全科醫(yī)學(xué)概論)
- 船員健康知識課件
- 成人住院患者靜脈血栓栓塞癥預(yù)防護(hù)理
- 《揚州東關(guān)街掠影》課件
- 《3-6歲兒童學(xué)習(xí)與發(fā)展指南》健康領(lǐng)域內(nèi)容目標(biāo)與指導(dǎo)
- GB/T 10739-2023紙、紙板和紙漿試樣處理和試驗的標(biāo)準(zhǔn)大氣條件
- 環(huán)保行業(yè)研究報告
- 孩子撫養(yǎng)費起訴狀范本:免修版模板范本
- 物流服務(wù)項目的投標(biāo)書
評論
0/150
提交評論