




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 M F C簡(jiǎn)單的繪圖程序 王帥目錄摘要2關(guān)鍵字21 引言2設(shè)計(jì)目的32 功能說(shuō)明2 2.1菜單欄3 2.1.1圖形3 2.1.2畫(huà)筆4 2.1.3畫(huà)硬幣4 2.2工具欄5 2.3狀態(tài)欄53 功能的實(shí)現(xiàn)53.1 視圖設(shè)計(jì)53.2 編輯資源6 3.3 編程思路及各個(gè)函數(shù)的實(shí)現(xiàn)7 (1)思路7 (2)代碼的實(shí)現(xiàn)7 1.為基本形狀創(chuàng)建一個(gè)基類(lèi)8 2.基本形狀類(lèi)的創(chuàng)建8 2.1矩形類(lèi)的創(chuàng)建及定義 8 2.2圓形類(lèi)的創(chuàng)建及定義10 2.3正五邊形類(lèi)的創(chuàng)建及定義11 2.4正三角形類(lèi)的創(chuàng)建及定義14 2.5橢圓類(lèi)的創(chuàng)建及定義16 2.6正四邊形類(lèi)的創(chuàng)建及的定義17 2.7正六邊形類(lèi)的創(chuàng)建及定義18 2.8
2、直線(xiàn)類(lèi)的創(chuàng)建及定義19 3.各基本形狀類(lèi)在CMyDraw2_0類(lèi)中的調(diào)用和繪圖的實(shí)現(xiàn)20 3.1矩形類(lèi)的調(diào)用與與繪圖的實(shí)現(xiàn)20 3.2圓形類(lèi)的調(diào)用24 3.3正三角形類(lèi)的調(diào)用25 3.4基本類(lèi)型調(diào)用的剩余代碼26 4.畫(huà)筆的使用、顏色及大小的調(diào)整29 5.畫(huà)硬幣35 6.工具欄中的自定義控件38 7.狀態(tài)欄中的顯示394程序功能的測(cè)試415最后總結(jié)42摘要:本繪圖程序能夠進(jìn)行基本圖形的繪畫(huà),如直線(xiàn),圓,矩形,三角形等等,并且在此基礎(chǔ)上添加了多邊形的繪畫(huà),如正五邊形等。除此之外,還能夠進(jìn)行隨手畫(huà),即用鼠標(biāo)隨意畫(huà)線(xiàn)條。為了更好的繪圖,還添加了對(duì)畫(huà)筆粗細(xì)的調(diào)整,以及對(duì)畫(huà)筆顏色的調(diào)整,除了特定的顏色,
3、顏色還可根據(jù)輸入的RGB值隨意更改。還有一些老師的要求,加入了畫(huà)硬幣、顯示硬幣數(shù)目即鼠標(biāo)坐標(biāo)等信息。本程序主要采用面向?qū)ο髮?xiě)法。關(guān)鍵字:程序設(shè)計(jì),MFC,繪圖1. 引言設(shè)計(jì)目的本繪圖程序的設(shè)計(jì)不僅僅局限于老師課堂的要求,通過(guò)C+的編寫(xiě)實(shí)現(xiàn)繪圖要求,我還想要在此基礎(chǔ)上,加入自己的一些想法,想要更好地了解MFC,更好地去實(shí)現(xiàn)自己的想法。2. 功能說(shuō)明 2.1菜單欄2.1.1圖形圖形欄中包括直線(xiàn)、矩形、圓形、橢圓、多邊形,多邊形中包括正三角形、正四邊形、正五邊形、正六邊形。選擇直線(xiàn),可用鼠標(biāo)拖動(dòng)畫(huà)出一條直線(xiàn)選擇矩形,可用鼠標(biāo)拖動(dòng)畫(huà)出矩形選擇圓形,可用鼠標(biāo)拖動(dòng)畫(huà)出圓形 選擇橢圓,可用鼠標(biāo)拖動(dòng)畫(huà)出橢圓選
4、擇正三角形,可用鼠標(biāo)拖動(dòng)畫(huà)出正三角形選擇正四邊形,可用鼠標(biāo)拖動(dòng)畫(huà)出正方形選擇正五邊形,可用鼠標(biāo)拖動(dòng)畫(huà)出正五邊形選擇正六邊形,可用鼠標(biāo)拖動(dòng)畫(huà)出正六邊形(注:為了驗(yàn)證自己的想法以及想讓畫(huà)出的圖形隨意地變換方向,特意在正三角形一項(xiàng)中加入了旋轉(zhuǎn)效果,使鼠標(biāo)在拖動(dòng)時(shí)能旋轉(zhuǎn)三角形)2.1.2畫(huà)筆 畫(huà)筆欄中包括顏色、大小及鉛筆 (1)顏色 顏色中包括黑色、紅色、綠色、藍(lán)色、橙色、黃色、青色、紫色、粉色、 自定義 選擇黑色,畫(huà)出的圖形將為黑色 選擇紅色,畫(huà)出的圖形將為紅色 選擇綠色,畫(huà)出的圖形將為綠色 選擇橙色,畫(huà)出的圖形將為橙色 選擇黃色,畫(huà)出的圖形將為黃色 選擇青色,畫(huà)出的圖形將為青色 選擇紫色,畫(huà)出的圖
5、形將為紫色 選擇粉色,畫(huà)出的圖形將為粉色 選擇自定義,可輸入RGB值,畫(huà)出的圖形將顯示輸入的顏色 (2)大小 大小中包括1、2、3、4、5、6、7 選擇1,畫(huà)筆大小設(shè)為1 選擇2,畫(huà)筆大小設(shè)為2 選擇3,畫(huà)筆大小設(shè)為3 選擇4,畫(huà)筆大小設(shè)為4 選擇5,畫(huà)筆大小設(shè)為5 選擇6,畫(huà)筆大小設(shè)為6 選擇7,畫(huà)筆大小設(shè)為7 (3)鉛筆 選中鉛筆后,將可以用鼠標(biāo)進(jìn)行隨意畫(huà)線(xiàn) 2.1.3畫(huà)硬幣 畫(huà)硬幣中包括畫(huà)、增加、減少、清除 選擇畫(huà),將在客戶(hù)端窗口中畫(huà)出初始數(shù)量為10的硬幣 選擇增加,窗口中的硬幣數(shù)目將增加1個(gè) 選擇減少,窗口中的硬幣數(shù)目將減少1個(gè) 選擇清除,刷新窗口,將硬幣消去 2.2工具欄 工具欄中除
6、了原有的圖標(biāo)外,還加入了自定義的圖標(biāo)選擇,可用鼠標(biāo)拖動(dòng)畫(huà)出一條直線(xiàn)選擇,可用鼠標(biāo)拖動(dòng)畫(huà)出矩形選擇,可用鼠標(biāo)拖動(dòng)畫(huà)出圓形選擇,可用鼠標(biāo)拖動(dòng)畫(huà)出正三角形選擇,可用鼠標(biāo)進(jìn)行隨手畫(huà)選擇,可在窗口畫(huà)出硬幣后,將硬幣數(shù)量+1選擇,可在窗口畫(huà)出硬幣后,將硬幣數(shù)量-1選擇,可利用鼠標(biāo)對(duì)所繪圖形進(jìn)行擦除,橡皮擦的大小與畫(huà)筆大小相同 2.3狀態(tài)欄 狀態(tài)欄中除了原有的顯示外,還加入了硬幣的數(shù)量以及鼠標(biāo)的x坐標(biāo)和y坐標(biāo)3. 功能的實(shí)現(xiàn) 3.1視圖設(shè)計(jì) 利用MFC 生成畫(huà)圖應(yīng)用程序框架具體步驟如下:(1)執(zhí)行VC程序,選擇File|New命令,彈出New對(duì)話(huà)框.單擊Projects標(biāo)簽,轉(zhuǎn)到Projects選項(xiàng)卡,選擇
7、MFC AppWizard(exe)選項(xiàng),然后在Project name文本框中輸入MyDraw2_0(原來(lái)也做過(guò)一個(gè),不過(guò)并沒(méi)有以面向?qū)ο蟮膶?xiě)法去寫(xiě),這個(gè)就當(dāng)作是我的第二個(gè)版本),文本框是指項(xiàng)目的本地路徑。(2)由于本程序是實(shí)現(xiàn)畫(huà)線(xiàn),要在視圖中完成,所以首先創(chuàng)建一個(gè)基于單文檔的應(yīng)用程序 3.2編輯資源(1) 利用ResourceView中的Menu編輯器在菜單欄添加菜單,該流程圖如下3.2所示: 圖3.2(2) 利用ResourceView中的ToolBar編輯器,在工具欄中添加自定義控件。控件圖案如下所示: 3.3編程思路及各個(gè)函數(shù)的實(shí)現(xiàn)(1)思路:首先,畫(huà)定義好的形狀。直線(xiàn)、矩形、圓形等
8、等都屬于基本的形狀,那么我設(shè)定一個(gè)基類(lèi),稱(chēng)它為CShape,給這個(gè)基類(lèi)定義一個(gè)畫(huà)畫(huà)的虛函數(shù)Draw(CDC *pDC),在這個(gè)類(lèi)里面派生出各個(gè)需要的類(lèi),如CCircle類(lèi),并為這些派生類(lèi)定義各自的屬性及方法,重寫(xiě)基類(lèi)的Draw函數(shù)。當(dāng)我需要用到這些類(lèi)的時(shí)候,只需要在View類(lèi)里創(chuàng)建指針,然后調(diào)用里面Draw方法。由于是當(dāng)鼠標(biāo)拖動(dòng)的時(shí)候畫(huà)出所需的圖形,需要添加鼠標(biāo)響應(yīng)函數(shù),onLButtonDown(),onLButtonUp,以及onMouseMove()。畫(huà)畫(huà)主要是在onMouseMove()里實(shí)現(xiàn)。接著,是畫(huà)筆的顏色和大小,本來(lái)是想單獨(dú)創(chuàng)建一個(gè)畫(huà)筆類(lèi),定義顏色和大小屬性,使CCircle等
9、派生類(lèi)多繼承,在繼承一個(gè)畫(huà)筆類(lèi),但嘗試了幾遍,發(fā)現(xiàn)在菜單里選擇顏色時(shí)就會(huì)使程序停止運(yùn)行,于是就放棄了。重新構(gòu)思之后,由于畫(huà)圖是在CMyDraw2_0里實(shí)現(xiàn)的,就直接在CMyDraw2_0中定義了顏色和大小的變量,這樣也方便。然后是畫(huà)硬幣。并沒(méi)有為這個(gè)創(chuàng)建單獨(dú)的類(lèi),直接在CMyDraw2_0中的OnDraw()中畫(huà)硬幣,并且在CMyDraw2_0中添加了增加和減少硬幣的方法。工具欄中只要和為各個(gè)圖標(biāo)添加函數(shù),作用和菜單欄中的圖形一欄中對(duì)應(yīng)即可。最后還有硬幣的數(shù)量和鼠標(biāo)坐標(biāo)放在狀態(tài)欄中顯示,下面開(kāi)始進(jìn)行函數(shù)代碼的實(shí)現(xiàn)。(2) 代碼的實(shí)現(xiàn):1. 為基本形狀創(chuàng)建一個(gè)基類(lèi),命名為CShape。在Clas
10、sViewz中右鍵點(diǎn)擊MyDraw2_0 classes->new class,在彈出窗口的頂部下拉框中選擇Generic Class,如圖所示在頭文件中添加虛函數(shù)Draw(CDC *pDC)public:CShape();virtual Draw(CDC* pDc)=0;/添加的虛函數(shù)virtual CShape();2. 基本形狀類(lèi)的創(chuàng)建(注:以矩形、圓形、正五邊形、正三邊形為重點(diǎn)介紹) 2.1矩形類(lèi)的創(chuàng)建及定義創(chuàng)建一個(gè)矩形類(lèi),繼承CShape類(lèi),如圖在該類(lèi)中重新定義畫(huà)畫(huà)函數(shù)Draw(),并添加帶參數(shù)的構(gòu)造函數(shù),矩形的左上角,以及矩形的寬度和高度,代碼如下:Public: CRect
11、angle();Draw(CDC* pDC); /重新定義Draw函數(shù)CPoint point_LeftUp; /矩形的左上角坐標(biāo)CRectangle(int x,int y,int w=0,int h=0);/帶參數(shù)的構(gòu)造函數(shù),x表示左上角的橫坐標(biāo),y表示左上角的縱坐標(biāo)int width; /矩形的寬度int height; /矩形的高度virtual CRectangle(); 在無(wú)參數(shù)構(gòu)造函數(shù)中初始化point_LeftUp的坐標(biāo)和寬度以及高度的值,代碼如下: CRectangle:CRectangle()point_LeftUp.x=0; /左上角坐標(biāo)x值設(shè)置為0point_LeftU
12、p.y=0; /左上角坐標(biāo)x值設(shè)置為0width=0; /矩形的寬度初始為0height=0; /矩形的高度初始為0 在帶參數(shù)的構(gòu)造函數(shù)中將值賦給point_LeftUp和寬度以及高度,代碼如下: point_LeftUp.x=x; /將傳入的x值賦給左上角坐標(biāo)的x值point_LeftUp.y=y; /將傳入的y值賦給左上角坐標(biāo)的y值width=w;/將傳入的w值賦給widthheight=h;/將傳入的h值賦給height 重寫(xiě)Draw(CDC* pDC)函數(shù),代碼如下:CRectangle:Draw(CDC* pDC)pDC->Rectangle(point_LeftUp.x,po
13、int_LeftUp.y,point_LeftUp.x+width, point_LeftUp.y+height); /利用Rectangle()函數(shù)畫(huà)出矩形,其中的值分別為矩形的左上角橫坐標(biāo),左上角縱坐標(biāo),右下角橫坐標(biāo),右下角縱坐標(biāo)在CMyDraw2_0View中引入矩形類(lèi)的頭文件:雙擊CMyDraw2_0View,在代碼/ MyDraw2_0View.h : interface of the CMyDraw2_0View class/#if !defined(AFX_MYDRAW2_0VIEW_H_3809529C_6744_4AD2_80A4_D44683D0A5AF_INCLUDED_
14、)#define AFX_MYDRAW2_0VIEW_H_3809529C_6744_4AD2_80A4_D44683D0A5AF_INCLUDED_下添加如下代碼: #include "Rectangle.h"并在View類(lèi)中添加私有成員變量,創(chuàng)建矩形類(lèi)的指針: 右鍵點(diǎn)擊CMyDraw2_0View,選擇Add Member Variable, 在彈出的對(duì)話(huà)框中如下輸入: 將在CMyDraw2_0View頭文件中出現(xiàn)如下代碼Private:CRectangle *rectangle;/定義指向矩形類(lèi)的指針, 為私有變量2.2圓形類(lèi)的創(chuàng)建及定義創(chuàng)建一個(gè)圓形類(lèi),命名為CCir
15、cle,繼承CShape類(lèi),在該類(lèi)中添加公有成員變量,代碼如下:public:CCircle();CCircle(int x,int y,int radius=0);/帶參數(shù)的構(gòu)造函數(shù),其中,x表示圓心的x值,y表示圓心的y值,radius表示圓的半徑Draw(CDC* pDC); /重新定義Draw函數(shù)virtual CCircle();int Radius; /定義圓的半徑CPoint center_point; /定義圓的中心點(diǎn)在無(wú)參數(shù)的構(gòu)造函數(shù)中初始化變量值,代碼如下:CCircle:CCircle()center_point.x=0; /圓心的橫坐標(biāo)初始為0center_point.
16、y=0; /圓心的縱坐標(biāo)初始為0Radius=0; /圓的半徑初始為0 在帶參數(shù)的構(gòu)造函數(shù)中將傳入的值賦給各變量,代碼如下:CCircle:CCircle(int x,int y,int radius)center_point.x=x; /將傳入的x值賦給圓心的橫坐標(biāo)center_point.y=y; /將傳入的y值賦給圓心的縱坐標(biāo)Radius=radius; /將傳入的radius值賦給圓的半徑 重寫(xiě)定義的Draw函數(shù),代碼如下:CCircle:Draw(CDC* pDC)pDC->Ellipse(center_point.x-Radius,center_point.y-Radius,
17、center_point.x+Radius,center_point.y+Radius);/利用Ellipse()函數(shù)進(jìn)行圓的繪制,其中的值分別為圓的外接正方形的左上角橫坐標(biāo)、縱坐標(biāo),右下角橫坐標(biāo)、縱坐標(biāo)在CMyDraw2_0View中引入圓形類(lèi)的頭文件: #include "Circle.h"添加私有成員變量,創(chuàng)建圓形類(lèi)的指針變量: CCircle *circle; /創(chuàng)建圓形類(lèi)的指針,可以直接寫(xiě)在矩形類(lèi)只針對(duì)下方2.3正五邊形類(lèi)的創(chuàng)建及定義 創(chuàng)建一個(gè)正五邊形類(lèi),命名為CPentangle,繼承CShape類(lèi), 在該類(lèi)中添加公有成員變量,代碼如下:public:CPent
18、angle();CPentangle(int x,int y,int radius=0);/帶參數(shù)的構(gòu)造函數(shù),x為外接圓圓心的橫坐標(biāo),y為外接圓圓心的縱坐標(biāo),radius為外接圓的半徑int Radius; /定義外接圓半徑CPoint cP; /定義外接圓圓心Draw(CDC* pDC); /重新定義Draw函數(shù)virtual CPentangle();在無(wú)參數(shù)的構(gòu)造函數(shù)中初始化各變量,代碼如下:CPentangle:CPentangle()cP.x=0; /圓心橫坐標(biāo)初始為0cP.y=0; /圓心縱坐標(biāo)初始為0Radius=0; /外接圓半徑初始為0在帶參數(shù)的構(gòu)造函數(shù)中將傳入的值賦給各變量
19、,代碼如下:CPentangle:CPentangle(int x,int y,int radius)cP.x=x; /將傳入的x值賦給圓心的橫坐標(biāo)cP.y=y; /將傳入的y值賦給圓心的縱坐標(biāo)Radius=radius; /將傳入的radius值賦給外接圓半徑下面重寫(xiě)的Draw函數(shù)與前兩個(gè)不同,需要用到數(shù)學(xué)函數(shù)cos()以及sin(),由于兩個(gè)函數(shù)用的是弧度制,還需引入數(shù)學(xué)變量PI,為了能夠順利的寫(xiě)入這些函數(shù),需要在CPentangle類(lèi)的客戶(hù)端中引入數(shù)學(xué)類(lèi)的頭文件:雙擊ClassView中的CPentangle(),在出現(xiàn)的構(gòu)造函數(shù)上方,在如下代碼/ Pentangle.cpp: impl
20、ementation of the CPentangle class./#include "stdafx.h"#include "MyDraw2_0.h"#include "Pentangle.h" 下添加數(shù)學(xué)類(lèi)頭文件:#include “math.h” 再定義一個(gè)宏變量PI,添加如下代碼:#define PI 3.1415926 開(kāi)始重寫(xiě)Draw(CDC* pDC)函數(shù),代碼如下:CPentangle:Draw(CDC* pDC)double rc=Radius*cos(36*PI/180); /將半徑和36度的余弦值相乘并且賦給新
21、的變量rcdouble rs=Radius*sin(36*PI/180); /將半徑和36度的正弦值相乘并且賦給新的變量rsdouble Rc=Radius*cos(18*PI/180); /將半徑和18度的余弦值相乘并且賦給新的變量Rcdouble Rs=Radius*sin(18*PI/180);/將半徑和18度的正弦值相乘并且賦給新的變量Rs POINT pts=cP.x+rs,cP.y+rc,cP.x-rs,cP.y+rc,cP.x-Rc,cP.y-R s,cP.x,cP.y-Radius,cP.x+Rc,cP.y-Rs;/利用點(diǎn)類(lèi)的數(shù)組將五個(gè)點(diǎn)儲(chǔ)存在點(diǎn)數(shù)組pts中pDC->Po
22、lygon(pts,5); /利用函數(shù)Polygon()進(jìn)行多邊形的繪畫(huà),其中pts為儲(chǔ)存的點(diǎn),5為點(diǎn)的個(gè)數(shù)下面對(duì)Draw函數(shù)中各數(shù)據(jù)進(jìn)行深層次的分析,表明它們的來(lái)歷:如圖所示:以外接圓圓心為坐標(biāo)軸中心,設(shè)該點(diǎn)的坐標(biāo)為(cP.x,cP.y);則右下角的坐標(biāo)為cP.x+R*sin(36*PI/180),cP.y+R*cos(36*PI/180)按順時(shí)針?lè)较蚩?接下去的幾個(gè)點(diǎn)的坐標(biāo)分別為cP.x-R*sin(36*PI/180),cP.y+R*cos(36*PI/180)cP.x-R*cos(18*PI/180),cP.y-R*sin(18*PI/180)cP.x,cP.y-RcP.x+R*cos
23、(18*PI/180),cP.y-R*sin(18*PI/180)以上為正五邊形5個(gè)點(diǎn)的來(lái)歷,接下來(lái)在CMyDraw2_0View中引入正五邊形類(lèi)的頭文件: #include “Pentangle.h”添加一個(gè)私有變量,創(chuàng)建指向正五邊形的指針變量: CPentangle *pentangle; 2.4正三角形類(lèi)的創(chuàng)建及定義(這個(gè)類(lèi)中添加了旋轉(zhuǎn))創(chuàng)建一個(gè)正三角形類(lèi),命名為CDelta,繼承CShape類(lèi),在該類(lèi)中添加公有成員變量,代碼如下:public:CDelta();CDelta(int x,int y,int radius=0); /帶參數(shù)的構(gòu)造函數(shù),其中x為外接圓圓心的橫坐標(biāo),y為外接圓
24、圓心的縱坐標(biāo),radius為外接圓半徑int Radius; /外接圓半徑CPoint cp; /外接圓圓心double theta; /在正三角形原圖上旋轉(zhuǎn)過(guò)的角度double st; /該變量?jī)?chǔ)存的是sin(theta)double ct; /該變量?jī)?chǔ)存的事cos(theta)Draw(CDC* pDC); 重新定義Draw函數(shù)virtual CDelta();在無(wú)參數(shù)構(gòu)造函數(shù)中初始化變量,代碼如下: CDelta:CDelta()cp.x=0; /圓心的橫坐標(biāo)初始為0cp.y=0; /圓心的縱坐標(biāo)初始為0Radius=0; /外接圓半徑初始為0 在帶參數(shù)構(gòu)造函數(shù)中將傳入的值賦給各變量,代
25、碼如下:CDelta:CDelta(int x,int y,int radius)cp.x=x; /將傳入的x值賦給圓心的橫坐標(biāo)cp.y=y; /將傳入的y值賦給圓心的縱坐標(biāo)Radius=radius; /將傳入的radius值賦給外接圓半徑ct=1; /調(diào)用該函數(shù)時(shí)將cos(theta)設(shè)置為1st=0; /調(diào)用該函數(shù)時(shí)將sin(theta)設(shè)置為0與正五邊形相同,要引入數(shù)學(xué)類(lèi)的頭文件以及定義宏變量PI,#include “math”#define PI 3.1415926 開(kāi)始重寫(xiě)定義的Draw(CDC* pDC)函數(shù),代碼如下:CDelta:Draw(CDC* pDC)double rc
26、=Radius*cos(60*PI/180); /外接圓半徑與60度余弦值相乘后賦給rcdouble rs=Radius*sin(60*PI/180); /外接圓半徑與60度正弦值相乘后賦給rsct=cos(theta); /將theta的余弦值賦給ctst=sin(theta); /將theta的正弦值賦給stPOINT dx1,dx11; /定義兩個(gè)點(diǎn)(接下來(lái)會(huì)詳細(xì)說(shuō)明)POINT dx2,dx22; /同上POINT dx3,dx33; /同上dx1.x=cp.x-cp.x;dx1.y=cp.y-Radius-cp.y;dx11.x=dx1.x*ct-dx1.y*st+cp.x;dx11
27、.y=dx1.y*ct+dx1.x*st+cp.y;dx2.x=cp.x-rs-cp.x;dx2.y=cp.y+rc-cp.y;dx22.x=dx2.x*ct-dx2.y*st+cp.x;dx22.y=dx2.y*ct+dx2.x*st+cp.y;dx3.x=cp.x+rs-cp.x;dx3.y=cp.y+rc-cp.y;dx33.x=dx3.x*ct-dx3.y*st+cp.x;dx33.y=dx3.y*ct+dx3.x*st+cp.y; POINTpts=dx11.x,dx11.y,dx22.x,dx22.y,dx33.x,dx33.y;/定義點(diǎn)數(shù)組,存儲(chǔ)正三角形的三個(gè)點(diǎn)pDC->P
28、olygon(pts,3);/利用畫(huà)多邊形的函數(shù)Polygon()畫(huà)正三角形,pts為儲(chǔ)存的三個(gè)點(diǎn),3為點(diǎn)的個(gè)數(shù)接下來(lái)對(duì)Draw函數(shù)里的變量以及運(yùn)算進(jìn)行解釋:R如圖所示,正三角形的中心到各頂點(diǎn)的距離為半徑,設(shè)中心點(diǎn)的坐標(biāo)為(cp.x,cp.y),則可得到右下角的坐標(biāo)為cp.x+R*sin(60*PI/180),cp.y+R*cos(60*PI/180)按順時(shí)針?lè)较颍酉聛?lái)兩個(gè)點(diǎn)的坐標(biāo)分別為cp.x-R*sin(60*PI/180),cp.y-R*cos(60*PI/180)cp.x,cp.x-R此時(shí),我們得到了三個(gè)頂點(diǎn)的坐標(biāo),如果按這三個(gè)點(diǎn)的坐標(biāo)畫(huà)圖,就會(huì)得到如圖所示的三角形,在此基礎(chǔ)上,不妨
29、設(shè)此圖形逆時(shí)針轉(zhuǎn)過(guò)的角度為,有以下原理作為基礎(chǔ):設(shè)一個(gè)點(diǎn)的坐標(biāo)為(x1,y1),它繞另一個(gè)點(diǎn)(x2,y2)旋轉(zhuǎn)角,得到新的點(diǎn)的坐標(biāo)為:x=(x1-x2)*cos-(y1-y2)*sin+x2;y=(y1-y2)*cos+(x1-x2)*sin+y2;顯然,只需得到三個(gè)點(diǎn)繞中心旋轉(zhuǎn)后各自的新坐標(biāo),我們就可以根據(jù)旋轉(zhuǎn)的角得到新的正三角形在Draw(CDC * pDC)函數(shù)中,用theta來(lái)代替,以右下角頂點(diǎn)為例,原坐標(biāo)為cp.x+rs,cp.y+rc按如下代碼將cos(theta)和sin(theta)替換:ct=cos(theta);st=sin(theta);用dx3.x儲(chǔ)存該點(diǎn)與中心點(diǎn)橫坐標(biāo)
30、的差dx3.y儲(chǔ)存該點(diǎn)與中心點(diǎn)縱坐標(biāo)的差,如下:dx3.x=cp.x+rs-cp.x;dx3.y=cp.y+rc-cp.y; 用dx33儲(chǔ)存該點(diǎn)旋轉(zhuǎn)后得到的新的坐標(biāo):dx33.x=dx3.x*ct-dx3.y*st+cp.x;dx33.y=dx3.y*ct+dx3.x*st+cp.y;這樣就得到了該點(diǎn)旋轉(zhuǎn)后的坐標(biāo),其它兩點(diǎn)按同樣方法即可得到新坐標(biāo),dx22為左下角的新坐標(biāo),dx11為正上方的新坐標(biāo)接下來(lái),在CMyDraw2_0View的頭文件中引入正三角形類(lèi),#include “Delta.h”添加私有變量,創(chuàng)建正三角形類(lèi)的指針變量:CDelta* delta;接下來(lái)我直接給出剩下基本形狀類(lèi)的
31、代碼(只在當(dāng)中作注釋,不再詳細(xì)解釋)2.5橢圓類(lèi)的創(chuàng)建和定義創(chuàng)建名為CEllipse的類(lèi),繼承CShape,在該頭文件中添加如下代碼:class CEllipse : public CShape public:CEllipse();CEllipse(int x,int y,int w=0,int h=0); /帶參數(shù)的構(gòu)造函數(shù),值分別為外接矩形左上角的橫坐標(biāo)、縱坐標(biāo)、寬度、高度int width; /外接矩形的寬度int height; /外接矩形的高度CPoint center_point; /橢圓中心點(diǎn)Draw(CDC* pDC); /重新定義Draw函數(shù)virtual CEllipse(
32、);在該類(lèi)app中添加如下代碼:CEllipse:CEllipse()center_point.x=0; /將中心點(diǎn)橫坐標(biāo)初始為0center_point.y=0; /將中心點(diǎn)縱坐標(biāo)初始為0width=0; /將外接矩形寬度初始為0height=0; /將外接矩形高度初始為0CEllipse:CEllipse(int x,int y,int w,int h)center_point.x=x; /將傳入的x值賦給中心點(diǎn)的橫坐標(biāo)center_point.y=y; /將傳入的y值賦給中心點(diǎn)的縱坐標(biāo)width=w; /將傳入的w值賦給寬度height=h; /將傳入的h值賦給高度CEllipse:Dr
33、aw(CDC* pDC)pDC->Ellipse(center_point.x-width,center_point.y-height,center_point.x+width,center_point.y+height);/利用Ellipse()函數(shù)畫(huà)橢圓在CMyDraw2_0View的頭文件中引入橢圓類(lèi),#include “Ellipse.h”添加私有變量,創(chuàng)建橢圓類(lèi)的指針變量:CEllipse *ellipse;2.6正四邊形類(lèi)的創(chuàng)建及定義命名為CQuadrangle,頭文件中添加如下代碼:public:CQuadrangle();CQuadrangle(int x,int y,i
34、nt radius=0); /帶參數(shù)的構(gòu)造函數(shù),參數(shù)分別為中心點(diǎn)的橫坐標(biāo)、縱坐標(biāo)、外接圓半徑int Radius; /外接圓半徑CPoint cPoint; /中心點(diǎn)Draw(CDC* pDC); /重新定義Draw函數(shù)virtual CQuadrangle();在該類(lèi)app中添加如下代碼: CQuadrangle:CQuadrangle()cPoint.x=0; /將中心點(diǎn)的橫坐標(biāo)初始為0cPoint.y=0; /將中心點(diǎn)的縱坐標(biāo)初始為0Radius=0; /將外接圓的半徑初始為0CQuadrangle:CQuadrangle(int x,int y,int radius)cPoint.x=
35、x; /將傳入的x值賦給中心點(diǎn)的橫坐標(biāo)cPoint.y=y; /將傳入的y值賦給中心點(diǎn)的縱坐標(biāo)Radius=radius; /將傳入的radius賦給外接圓半徑CQuadrangle:Draw(CDC* pDC)double Rc=Radius*cos(45*PI/180); /將半徑與45度余弦值的乘積賦給Rc POINT pts=cPoint.x+Rc,cPoint.y+Rc,cPoint.x+Rc,cPoint.y-Rc,cPoint.x-Rc,cPoint.y-Rc,cPoint.x-Rc,cPoint.y+Rc; /定義點(diǎn)數(shù)組,儲(chǔ)存四個(gè)頂點(diǎn)pDC->Polygon(pts,4)
36、;/利用多邊形繪畫(huà)函數(shù)畫(huà)正四邊形在CMyDraw2_0View的頭文件中引入正四邊形類(lèi),#include “Quadrangle.h”添加私有變量,創(chuàng)建正四邊形類(lèi)的指針變量:CQuadrangle *quadrangle;2.7正六邊形的創(chuàng)建及定義命名為CRegularHexagon,頭文件中添加如下代碼:public:CQuadrangle();CQuadrangle(int x,int y,int radius=0);/帶參數(shù)的構(gòu)造函數(shù),參數(shù)分別為中心點(diǎn)的橫坐標(biāo)、縱坐標(biāo)、外接圓半徑int Radius;/外接圓半徑CPoint cPoint;/中心點(diǎn)Draw(CDC* pDC);/重新定義
37、Draw函數(shù)virtual CQuadrangle();在該類(lèi)app中添加如下代碼:CRegularHexagon:CRegularHexagon()cp.x=0;/將中心點(diǎn)的橫坐標(biāo)初始為0cp.y=0;/將中心點(diǎn)的縱坐標(biāo)初始為0Radius=0;/將外接圓的半徑初始為0CRegularHexagon:CRegularHexagon(int x,int y,int radius)cp.x=x;/將傳入的x值賦給中心點(diǎn)的橫坐標(biāo)cp.y=y;/將傳入的y值賦給中心點(diǎn)的縱坐標(biāo)Radius=radius;/將傳入的radius值賦給外接圓半徑CRegularHexagon:Draw(CDC* pDC)
38、double rs=Radius*sin(30*PI/180);/將半徑與30度正弦值的乘積賦給rsdouble rc=Radius*cos(30*PI/180);/將半徑與30度余弦值的乘積賦給rcdouble Rs=Radius*sin(60*PI/180);/將半徑與60度正弦值的乘積賦給Rsdouble Rc=Radius*cos(60*PI/180);/將半徑與60度余弦值的乘積賦給RcPOINT pts=cp.x+rs,cp.y+rc,cp.x-rs,cp.y+rc,cp.x-Radius,cp.y,cp.x-Rc,cp.y-Rs,cp.x+Rc,cp.y-Rs,cp.x+Radi
39、us,cp.y;/定義點(diǎn)數(shù)組pts,儲(chǔ)存正六邊形的六個(gè)頂點(diǎn)pDC->Polygon(pts,6);/利用多邊形繪畫(huà)函數(shù)畫(huà)出正六邊形在CMyDraw2_0View的頭文件中引入正六邊形類(lèi),#include “RegularHexagon.h”添加私有變量,創(chuàng)建正六邊形類(lèi)的指針變量:CRegularHexagon* regularhexagon;2.8直線(xiàn)類(lèi)的創(chuàng)建及定義命名為CLine,在頭文件中添加如下代碼:public:CLine();CLine(int sx,int sy,int ex=0,int ey=0);/帶參數(shù)的構(gòu)造函數(shù),分別為直線(xiàn)起點(diǎn)的橫坐標(biāo)、縱坐標(biāo),終點(diǎn)的橫坐標(biāo)、縱坐標(biāo)Dr
40、aw(CDC* pDC);/重新定義Draw函數(shù)CPoint p_start; /定義直線(xiàn)起點(diǎn)CPoint p_end;/定義直線(xiàn)終點(diǎn)virtual CLine();在該類(lèi)app中添加如下代碼: CLine:CLine()p_start.x=0;/將起點(diǎn)橫坐標(biāo)初始為0p_start.y=0;/將起點(diǎn)縱坐標(biāo)初始為0p_end.x=0;/將終點(diǎn)橫坐標(biāo)初始為0p_end.y=0;/將終點(diǎn)縱坐標(biāo)初始為0CLine:CLine(int sx,int sy,int ex,int ey)p_start.x=sx;/將sx的值賦給起點(diǎn)的橫坐標(biāo)p_start.y=sy;/將sy的值賦給起點(diǎn)的縱坐標(biāo)p_end.x
41、=ex;/將ex的值賦給終點(diǎn)的橫坐標(biāo)p_end.y=ey;/將ey的值賦給終點(diǎn)的縱坐標(biāo)CLine:Draw(CDC* pDC)pDC->MoveTo(p_start);/利用MoveTo()函數(shù)畫(huà)出直線(xiàn)起點(diǎn)pDC->LineTo(p_end);/利用LineTo()函數(shù)從起點(diǎn)畫(huà)直線(xiàn)到終點(diǎn)在CMyDraw2_0View的頭文件中引入直線(xiàn)類(lèi),#include “Line.h”添加私有變量,創(chuàng)建直線(xiàn)類(lèi)的指針變量:CLine* line;3. 各基本形狀類(lèi)在CMyDraw2_0View類(lèi)中的調(diào)用與繪圖的實(shí)現(xiàn) (注:以矩形、圓形、正三角形為重點(diǎn)介紹) 3.1矩形類(lèi)的調(diào)用與與繪圖的實(shí)現(xiàn)繪圖的過(guò)
42、程是:鼠標(biāo)左鍵按下->鼠標(biāo)移動(dòng)->鼠標(biāo)左鍵彈起在此,引入鼠標(biāo)的三個(gè)響應(yīng)函數(shù),分別對(duì)應(yīng)該三個(gè)過(guò)程:按下ctrl+w,彈出如圖所示對(duì)話(huà)框,并按如圖操作,選擇右側(cè)的Add Function(本應(yīng)是黑色,由于已添加,變?yōu)榛疑?,將三個(gè)響應(yīng)函數(shù)添加到CMyDraw2_0View類(lèi)app中?,F(xiàn)在,需要告訴鼠標(biāo),當(dāng)鼠標(biāo)左鍵按下時(shí)開(kāi)始進(jìn)行繪畫(huà),那么,需要添加一個(gè)變量,告訴鼠標(biāo)是否進(jìn)行繪畫(huà):為View類(lèi)添加私有成員變量:bool mDown;在View類(lèi)的構(gòu)造函數(shù)中對(duì)該值進(jìn)行初始化,代碼如下:CMyDraw2_0View:CMyDraw2_0View()/ TODO: add constructio
43、n code heremDown=false;/將mDown初始為false,表示默認(rèn)為不進(jìn)行繪畫(huà) 在鼠標(biāo)左鍵按下的響應(yīng)函數(shù)中添加如下代碼:Void CMyDraw2_0View:OnLButtonDown(UINT nFlags, CPoint point) mDown=true;/將mDown標(biāo)記為true,表示此時(shí)即將開(kāi)始繪畫(huà) 在鼠標(biāo)左鍵彈起的響應(yīng)函數(shù)中添加如下代碼:void CMyDraw2_0View:OnLButtonUp(UINT nFlags, CPoint point) mDown=false;/將mDown重新標(biāo)記為false,表明此時(shí)應(yīng)停止繪畫(huà) 在鼠標(biāo)移動(dòng)時(shí)判斷鼠標(biāo)是否按
44、下,如果按下則開(kāi)始進(jìn)行繪畫(huà):void CMyDraw2_0View:OnMouseMove(UINT nFlags, CPoint point) if(mDown)/此處添加繪畫(huà)代碼(下面會(huì)說(shuō)到) 到此,對(duì)鼠標(biāo)是否進(jìn)行繪畫(huà)的判斷已完成,接下來(lái),需要告訴鼠標(biāo)畫(huà)出的圖形應(yīng)該是矩形,不妨設(shè)一個(gè)變量用來(lái)儲(chǔ)存類(lèi)型:在View類(lèi)中添加私有成員變量:int ShapeType;/該變量用來(lái)儲(chǔ)存圖形類(lèi)型 在View類(lèi)構(gòu)造函數(shù)中進(jìn)行該變量的初始化: ShapeType=-1;/默認(rèn)為-1,表示為標(biāo)的隨手畫(huà)(下面會(huì)提到)為View類(lèi)添加菜單中矩形的響應(yīng)函數(shù): 同樣按下Ctrl+W,在彈出的對(duì)話(huà)框中如下選擇:圖中,
45、藍(lán)色條中的字符為在資源編輯時(shí)定義的矩形的ID,同樣選擇Add Functioin,在View類(lèi)中出現(xiàn)如下代碼:void CMyDraw2_0View:OnMenuGraphRectangle() / TODO: Add your command handler code here在該函數(shù)中添加如下代碼:ShapeType=2;/用2來(lái)代表矩形這樣,就能用數(shù)字來(lái)表示各個(gè)基本形狀了有了這個(gè)變量后,在鼠標(biāo)左鍵按下時(shí),首先判斷該變量是否為-1(因?yàn)槌跏紴?1,對(duì)應(yīng)的是隨手畫(huà)),假如不是,則對(duì)ShapeType的值進(jìn)行判斷,用switch函數(shù)進(jìn)行相應(yīng)的操作:在鼠標(biāo)左鍵按下的相應(yīng)函數(shù)中添加如下代碼:if(
46、ShapeType!=-1)/判斷當(dāng)前的ShapeType值是否為-1switch(ShapeType)/對(duì)當(dāng)前傳入的ShapeType值進(jìn)行選擇,分別進(jìn)行隊(duì)形的操作當(dāng)然,畫(huà)矩形需要給矩形類(lèi)傳入矩形的左上角坐標(biāo)和右下角坐標(biāo),在繪圖時(shí)對(duì)應(yīng)的就是鼠標(biāo)按下時(shí)的坐標(biāo)(我們把它叫做起始點(diǎn))、鼠標(biāo)移動(dòng)時(shí)的坐標(biāo)(我們把它叫做終點(diǎn)),這樣,需要用兩個(gè)變量來(lái)存儲(chǔ)這兩個(gè)點(diǎn):在View類(lèi)中添加私有成員變量:CPoint ponit_start;/用來(lái)存儲(chǔ)起點(diǎn)CPoint point_end;/用來(lái)存儲(chǔ)終點(diǎn)在鼠標(biāo)左鍵按下的響應(yīng)函數(shù)中添加以下代碼:point_start=point;/將鼠標(biāo)按下時(shí)的點(diǎn)存儲(chǔ)在point_
47、start中point_end.x=0;/將鼠標(biāo)移動(dòng)時(shí)的點(diǎn)橫坐標(biāo)賦值為0point_end.y=0;/將鼠標(biāo)移動(dòng)時(shí)的點(diǎn)縱坐標(biāo)賦值為0最后,一切準(zhǔn)備就緒,該進(jìn)行矩形的繪畫(huà)了:矩形對(duì)應(yīng)的數(shù)字為2,在鼠標(biāo)按下的相應(yīng)函數(shù)中,在switch()函數(shù)中添加以下代碼:case 2:rectangle=new CRectangle(point_start.x,point_start.y);break;/new一個(gè)矩形對(duì)象,將該地址存儲(chǔ)在rectangle中,并將鼠標(biāo)按下時(shí)的點(diǎn)(起點(diǎn))傳入,作為矩形的左上角的點(diǎn)此時(shí),當(dāng)鼠標(biāo)按下時(shí),鼠標(biāo)就能知道即將要進(jìn)行的是矩形的繪畫(huà)。在鼠標(biāo)移動(dòng)的響應(yīng)函數(shù)中也要對(duì)ShapeTyp
48、e值作出判斷,告訴鼠標(biāo)該進(jìn)行矩形的繪畫(huà),方法與前面類(lèi)似:在該函數(shù)的開(kāi)頭添加如下代碼:CDC* pDC=GetDC();/打開(kāi)圖形設(shè)備接口,簡(jiǎn)單來(lái)說(shuō),就是用pDC來(lái)進(jìn)行繪畫(huà)在if(mDown)中添加如下代碼:switch(ShapeType)case 2:pDC->SetROP2(R2_NOTXORPEN);/將顏色設(shè)置為反色if(point_end.x!=0)/判斷鼠標(biāo)是否移動(dòng)了rectangle->Draw(pDC);/調(diào)用矩形類(lèi)中的Draw函數(shù)point_end=point;/將終點(diǎn)設(shè)置為鼠標(biāo)當(dāng)前所在的點(diǎn)rectangle->width=point_end.x-point
49、_start.x;/將終點(diǎn)與起點(diǎn)的橫坐標(biāo)之差賦給矩形類(lèi)中的寬度widthrectangle->height=point_end.y-point_start.y;/將終點(diǎn)與起點(diǎn)的縱坐標(biāo)之差賦給矩形類(lèi)中的高度heightrectangle->Draw(pDC);調(diào)用矩形類(lèi)中的Draw函數(shù)break;下面對(duì)以上代碼進(jìn)行解釋:當(dāng)鼠標(biāo)按下時(shí),終點(diǎn)point_end的值為0,判斷為false,將鼠標(biāo)此時(shí)的點(diǎn)賦給point_end,儲(chǔ)存起來(lái),畫(huà)出矩形,當(dāng)鼠標(biāo)移動(dòng)后,判斷為true,此時(shí)畫(huà)出的矩形左上角坐標(biāo)為鼠標(biāo)按下時(shí)的點(diǎn),高度和寬度為之前的高度和寬度,由于前面已將顏色設(shè)置為反色,所以將鼠標(biāo)移動(dòng)之
50、前畫(huà)的矩形覆蓋掉,不會(huì)再看見(jiàn),所以看到的矩形為當(dāng)前的矩形,之前的矩形已無(wú)法看見(jiàn),否則將會(huì)看到一連串的矩形。3.2圓形類(lèi)的調(diào)用在3.1中已經(jīng)為繪圖做好了準(zhǔn)備工作,下面只需要用一個(gè)數(shù)字表示圓形類(lèi)看,并在鼠標(biāo)左鍵按下和鼠標(biāo)移動(dòng)的響應(yīng)函數(shù)中的switch語(yǔ)句中添加相應(yīng)代碼即可:void CMyDraw2_0View:OnMenuGraphCircle() / TODO: Add your command handler code hereShapeType=3;/用3來(lái)表示圓形在OnLButtonDown()中的switch語(yǔ)句中添加如下代碼: Case 3:circle=new CCircle(point_start.x,point_start.y);break;/new 一個(gè)圓形類(lèi)對(duì)象,將地址儲(chǔ)存在circle中,并將起點(diǎn)傳入,作為圓形的中心點(diǎn)在OnMouseMove()中的switch語(yǔ)句中添加如下代碼:case 3:pDC->SetROP2(R2_NOTXORPEN);/將顏色設(shè)為反色if(point_end.x!=0)/判斷鼠標(biāo)是否移動(dòng)circle->Dr
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 配電線(xiàn)路技能鑒定實(shí)操培訓(xùn)課件
- 高效節(jié)能電機(jī)項(xiàng)目投資估算方案(范文模板)
- 城市污水管網(wǎng)建設(shè)工程安全管理方案(模板)
- 2025年高純氮化鋁粉體項(xiàng)目建議書(shū)
- 2025年銀行監(jiān)管及中央銀行服務(wù)項(xiàng)目合作計(jì)劃書(shū)
- 智慧物流概論 課件 04智慧運(yùn)輸
- 2025年醫(yī)藥級(jí)纖維素醚合作協(xié)議書(shū)
- 常用胰島素種類(lèi)及特點(diǎn)表
- 常用烏頭類(lèi)中藥的毒性研究概述
- 航空航天零部件制造2025年高精度加工技術(shù)不銹鋼成形技術(shù)研究報(bào)告
- 2025黨考試題及答案
- 曲臂高空作業(yè)車(chē)安全操作規(guī)程
- 水路運(yùn)輸安全管理培訓(xùn)
- 中國(guó)支付體系行業(yè)市場(chǎng)運(yùn)行現(xiàn)狀及投資規(guī)劃建議報(bào)告
- 自動(dòng)化立體庫(kù)培訓(xùn)
- 2025年蘇州市中考?xì)v史試卷真題(含標(biāo)準(zhǔn)答案及解析)
- 2025年中國(guó)彩色超聲多普勒診斷系統(tǒng)市場(chǎng)調(diào)查研究報(bào)告
- LS-T8014-2023高標(biāo)準(zhǔn)糧倉(cāng)建設(shè)標(biāo)準(zhǔn)
- 焦化廠(chǎng)安全管理制度
- 油氣儲(chǔ)存企業(yè)安全風(fēng)險(xiǎn)評(píng)估細(xì)則(2025年修訂版)
- 小兒心力衰竭的護(hù)理查房
評(píng)論
0/150
提交評(píng)論