mfc簡(jiǎn)單繪圖程序_第1頁(yè)
mfc簡(jiǎn)單繪圖程序_第2頁(yè)
mfc簡(jiǎn)單繪圖程序_第3頁(yè)
mfc簡(jiǎn)單繪圖程序_第4頁(yè)
mfc簡(jiǎn)單繪圖程序_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、M簡(jiǎn)單的繪圖序王帥目錄摘要2.關(guān)鍵字2言2設(shè)計(jì)目的錯(cuò)誤!未定義書(shū)簽。2 功能說(shuō)明22.1 菜單欄錯(cuò)誤!未定義書(shū)簽。2.1.1 圖形32.1.2 畫(huà)筆42.1.3 畫(huà)硬幣42.2 工具欄52.3 狀態(tài)欄53 功能的實(shí)現(xiàn)53.1 視圖設(shè)計(jì)53.2 編輯資源63.3 編程思路及各個(gè)函數(shù)的實(shí)現(xiàn)7(1)思路7(2)代碼的實(shí)現(xiàn)71 .為基本形狀創(chuàng)建一個(gè)基類82 .基本形狀類的創(chuàng)建82.1 矩形類的創(chuàng)建及定義82.2 圓形類的創(chuàng)建及定義102.3 正五邊形類的創(chuàng)建及定義112.4 正三角形類的創(chuàng)建及定義142.5 橢圓類的創(chuàng)建及定義162.6 正四邊形類的創(chuàng)建及的定義172.7 正六邊形類的創(chuàng)建及定義182

2、.8 直線類的創(chuàng)建及定義193 .各基本形狀類在CMyDraw2_0類中的調(diào)用和繪圖的實(shí)現(xiàn)203.1 矩形類的調(diào)用與與繪圖的實(shí)現(xiàn)203.2 圓形類的調(diào)用243.3 正三角形類的調(diào)用253.4 基本類型調(diào)用的剩余代碼264 .畫(huà)筆的使用、顏色及大小的調(diào)整295 .畫(huà)硬幣356 .工具欄中的自定義控件387 .狀態(tài)欄中的顯示39程序功能的測(cè)試4415最后總結(jié)42摘要:本繪圖程序能夠進(jìn)行基本圖形的繪畫(huà),如直線,圓,矩形,三角形等等,并且在此基礎(chǔ)上添加了多邊形的繪畫(huà),如正五邊形等。除此之外,還能夠進(jìn)行隨手畫(huà),即用鼠標(biāo)隨意畫(huà)線條。為了更好的繪圖,還添加了對(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 圖形圖形欄中包括直線、矩形、圓形、橢圓、多邊形,多邊形中包括正三角形、正四邊形、正五邊形、正六邊形。選擇直線,可用鼠標(biāo)拖動(dòng)畫(huà)出一條直線選擇矩形,可用鼠標(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à)出的圖形將為粉色選擇自定義,可輸入RGBfi,畫(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選中鉛筆后,將可以用鼠標(biāo)進(jìn)行隨意畫(huà)線2.1.3 畫(huà)硬幣畫(huà)硬幣中包括畫(huà)、增加、減少、清除選擇畫(huà),將在客戶端窗口中畫(huà)出初始數(shù)量為10的硬幣選擇增加,窗口中的硬幣數(shù)目將增加1個(gè)選擇減少,窗口中的硬幣數(shù)目將減少1個(gè)選擇清除,刷新窗口,將硬幣消去2.2 工具欄工具欄中除了原有的圖標(biāo)外,還加入了自定義的圖標(biāo)/選擇,可用鼠標(biāo)拖動(dòng)

6、畫(huà)出一條直線一,可用鼠標(biāo)拖動(dòng)畫(huà)出矩形選擇0,可用鼠標(biāo)拖動(dòng)畫(huà)出圓形選擇當(dāng),可用鼠標(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)用程序框架具體步驟如下:執(zhí)行VC程序,選擇File|New命令,彈出New對(duì)話框.單擊Projects標(biāo)簽,轉(zhuǎn)至1JProjects選項(xiàng)卡,選擇MFCAppWizard(exe)選項(xiàng),然后在Pr

7、ojectname文本框中輸入MyDraw2_0(原來(lái)也做過(guò)一個(gè),不過(guò)并沒(méi)有以面向?qū)ο蟮膶?xiě)法去寫(xiě),這個(gè)就當(dāng)作是我的第二個(gè)版本),文本框是指項(xiàng)目的本地路徑。(2)由于本程序是實(shí)現(xiàn)畫(huà)線,要在視圖中完成,所以首先創(chuàng)建一個(gè)基于單文檔的應(yīng)用程序3.2 編輯資源利用ResourceView中的Menu編輯器在菜單欄添加菜單,該流程圖(1)如下3.2所示:圖3.2(2)利用ResourceView中的ToolBar編輯器,在工具欄中添加自定義控件??丶D案如下所示:.3.3 編程思路及各個(gè)函數(shù)的實(shí)現(xiàn)思路:首先,畫(huà)定義好的形狀。直線、矩形、圓形等等都屬于基本的形狀,那么我設(shè)定一個(gè)基類,稱它為CShapG給這個(gè)

8、基類定義一個(gè)畫(huà)畫(huà)的虛函數(shù)Draw(CDC*pDC),在這個(gè)類里面派生出各個(gè)需要的類,如CCircle類,并為這些派生類定義各自的屬性及方法,重寫(xiě)基類的Draw函數(shù)。當(dāng)我需要用到這些類的時(shí)候,只需要在View類里創(chuàng)建指針,然后調(diào)用里面Draw方法。由于是當(dāng)鼠標(biāo)拖動(dòng)的時(shí)候畫(huà)出所需的圖形,需要添加鼠標(biāo)響應(yīng)函數(shù),onLButtonDown(),onLButtonUp,以及onMouseMove()o畫(huà)畫(huà)主要是在onMouseMove()里實(shí)現(xiàn)。接著,是畫(huà)筆的顏色和大小,本來(lái)是想單獨(dú)創(chuàng)建一個(gè)畫(huà)筆類,定義顏色和大小屬性,使CCircle等派生類多繼承,在繼承一個(gè)畫(huà)筆類,但嘗試了幾遍,發(fā)現(xiàn)在菜單里選擇顏色時(shí)

9、就會(huì)使程序停止運(yùn)行,于是就放棄了。重新構(gòu)思之后,由于畫(huà)圖是在CMyDraw2_0里實(shí)現(xiàn)的,就直接在CMyDraw2_0中定義了顏色和大小的變量,這樣也方便。然后是畫(huà)硬幣。并沒(méi)有為這個(gè)創(chuàng)建單獨(dú)的類,直接在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è)基類,命名為CShapa在ClassViewz中右鍵點(diǎn)擊MyDraw2_0classes->newc

10、lass,在彈出窗口的頂部下拉框中選擇GenericClass,如圖所示邈取消類的類型0:(GenericClass”r類信息-名就E):cShapd文件竊Shapel.cpp更改3基莫附DerivedFromAs在頭文件中添加虛函數(shù)Draw(CDC*pDC)public:CShape();virtualDraw(CDC*pDc)=0;添加的虛函數(shù)virtualCShape();2 .基本形狀類的創(chuàng)建(注:以矩形、圓形、正五邊形、正三邊形為重點(diǎn)介紹)2.1 矩形類的創(chuàng)建及定義創(chuàng)建一個(gè)矩形類,繼承CShape類,如圖美付類型川:GenericClass類信息1_取耦名相E:CRectangle文

11、件名:Rectanglei.epp更改向|基類同:DerivedFromAsCShapepublIc在該類中重新定義畫(huà)畫(huà)函數(shù)Draw(),并添加帶參數(shù)的構(gòu)造函數(shù),矩形的左上角,以及矩形的寬度和高度,代碼如下:Public:CRectangle();Draw(CDC*pDC);/重新定義Draw函數(shù)CPointpoint_LeftUp;/矩形的左上角坐標(biāo)CRectangle(intx,inty,intw=0,inth=0);/帶參數(shù)的構(gòu)造函數(shù),x表示左上角的橫坐標(biāo),y表示左上角的縱坐標(biāo)intwidth;矩形的寬度intheight;/矩形的高度virtualCRectangle();在無(wú)參數(shù)構(gòu)造

12、函數(shù)中初始化point_LeftUp的坐標(biāo)和寬度以及高度的值,代碼如下:CRectangle二CRectangle()point_LeftUp.x=0;/左上角坐標(biāo)x值設(shè)置為0point_LeftUp.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值賦給

13、height重寫(xiě)Draw(CDC*pDC)函數(shù),代碼如下:CRectangle:Draw(CDC*pDC)pDC->Rectangle(point_LeftUp.x,point_LeftUp.y,point_LeftUp.x+width,point_LeftUp.y+height);/利用Rectangle。函數(shù)畫(huà)出矩形,其中的值分別為矩形的左上角橫坐標(biāo),左上角縱坐標(biāo),右下角橫坐標(biāo),右下角縱坐標(biāo)在CMyDraw2_0View中引入矩形類的頭文件:雙擊CMyDraw2_0View,在代碼/MyDraw2_0View.h:interfaceoftheCMyDraw2_0Viewclass/#

14、if!defined(AFX_MYDRAW2_0VIEW_H_3809529C_6744_4AD2_80A4_D44683D0A5AF_INCLUDED_)#defineAFX_MYDRAW2_0VIEW_H_3809529C_6744_4AD2_80A4_D44683D0A5AF_INCLUDED_下添加如下代碼:#includeRectangle.h并在View類中添加私有成員變量,創(chuàng)建矩形類的指針:右鍵點(diǎn)擊CMyDraw2_0View,選擇AddMemberVariable,在彈出的對(duì)話框中如下輸入將在CMyDraw2_0View頭文件中出現(xiàn)如下代碼Private:CRectangle*

15、rectangle;/定義指向矩形類的指針,為私有變量2.2 圓形類的創(chuàng)建及定義創(chuàng)建一個(gè)圓形類,命名為CCircle,繼承CShape類,在該類中添加公有成員變量,代碼如下:public:CCircle();CCircle(intx,inty,intradius=0);/帶參數(shù)的構(gòu)造函數(shù),其中,x表示圓心的x值,y表示圓心的y值,radius表示圓的半徑Draw(CDC*pDC);/重新定義Draw函數(shù)virtualCCircle();intRadius;定義圓的半徑CPointcenter_point;定義圓的中心點(diǎn)在無(wú)參數(shù)的構(gòu)造函數(shù)中初始化變量值,代碼如下:CCircle:CCircle(

16、)center_point.x=0;/圓心的橫坐標(biāo)初始為0center_point.y=0;/圓心的縱坐標(biāo)初始為0Radius=0;/圓的半徑初始為0在帶參數(shù)的構(gòu)造函數(shù)中將傳入的值賦給各變量,代碼如下:CCircle:CCircle(intx,inty,intradius)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.

17、x-Radius,center_point.y-Radius,center_point.x+Radius,center_point.y+Radius);/利用Ellipse()函數(shù)進(jìn)行圓的繪制,其中的值分別為圓的外接正方形的左上角橫坐標(biāo)、縱坐標(biāo),右下角橫坐標(biāo)、縱坐標(biāo)在CMyDraw2_0View中引入圓形類的頭文件:#includeCircle.h添加私有成員變量,創(chuàng)建圓形類的指針變量:CCircle*circle;/創(chuàng)建圓形類的指針,可以直接寫(xiě)在矩形類只針對(duì)下方2.3 正五邊形類的創(chuàng)建及定義創(chuàng)建一個(gè)正五邊形類,命名為CPentang®繼承CShape類,在該類中添加公有成員變量,代

18、碼如下:public:CPentangle();CPentangle(intx,inty,intradius=0);/櫛參數(shù)的構(gòu)造函數(shù),x為外接圓圓心的橫坐標(biāo),y為外接圓圓心的縱坐標(biāo),radius為外接圓的半徑intRadius;/定義外接圓半徑CPointcP;/定義外接圓圓心函數(shù)重新定義Draw(CDC*pDC);/DrawvirtualCPentangle();在無(wú)參數(shù)的構(gòu)造函數(shù)中初始化各變量,代碼如下CPentangle:CPentangle()0/圓心橫坐標(biāo)初始為cP.x=0;0圓心縱坐標(biāo)初始為cP.y=0;/0外接圓半徑初始為Radius=0;/:在帶參數(shù)的構(gòu)造函數(shù)中將傳入的值賦給

19、各變量,代碼如下CPentangle:CPentangle(intx,inty,intradius)x值賦給圓心的橫坐標(biāo)cP.x=x;/將傳入的值賦給圓心的縱坐標(biāo)cP.y=y;/將傳入的yRadius=radius;將傳入的radius值賦給外接圓半徑以及cos()Draw函數(shù)與前兩個(gè)不同,需要用到數(shù)學(xué)函數(shù)下面重寫(xiě)的,為了能夠順,由于兩個(gè)函數(shù)用的是弧度制,還需引入數(shù)學(xué)變量PIsin()類的客戶端中引入數(shù)學(xué)類的頭文CPentangle利的寫(xiě)入這些函數(shù),需要在:件在如下代中的CPentangle()在出現(xiàn)的構(gòu)造函數(shù)上方,ClassView雙擊碼Pentangle.cpp:implementatio

20、noftheCPentangleclass./#includestdafx.h#includeMyDraw2_0.h#includePentangle.h下添加數(shù)學(xué)類頭文件“#includemath.h”:PI再定義一個(gè)宏變量,添加如下代碼#definePI3.1415926開(kāi)始重寫(xiě)Draw(CDC*pDC)函數(shù),代碼如下CPentangle:Draw(CDC*pDC)度的余弦值36/將半徑和doublerc=Radius*cos(36*PI/180);rc相乘并且賦給新的變量度的正弦值將半徑和36/doublers=Radius*sin(36*PI/180);rs相乘并且賦給新的變量度的余弦

21、將半徑和18doubleRc=Radius*cos(18*PI/180);/Rc值相乘并且賦給新的變量度的正弦18doubleRs=Radius*sin(18*PI/180);/將半徑和值相乘并且賦給新的變量Rs.x-Rc,cP.y-RPOINT.x+Rc,cPyRs;/利用點(diǎn)類的數(shù)組將五個(gè)點(diǎn)儲(chǔ)存在點(diǎn)數(shù)組pts中pDC->Polygon(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)歷如圖所示:72(cP.x,cP.y);以外接圓圓心為坐標(biāo)軸中心,設(shè)該點(diǎn)的坐標(biāo)為則右下角的坐標(biāo)為cP.y+

22、R*cos(36*PI/180)cP.x+R*sin(36*PI/180),接下去的幾個(gè)點(diǎn)的坐標(biāo)分別為,按順時(shí)針?lè)较蚩碿P.y+R*cos(36*PI/180),cP.xR*sin(36*PI/180)cP.y-R*sin(18*PI/180),cP.x-R*cos(18*PI/180)cP.y-RcP.x,cPyR*sin(18*PI/180),cP.x+R*cos(18*PI/180)中CMyDraw2_0View個(gè)點(diǎn)的來(lái)歷,接下來(lái)在以上為正五邊形5:引入正五邊形類的頭文件#include“Pentangle.h'添加一個(gè)私有變量,創(chuàng)建指向正五邊形的指針變量CPentangle*p

23、entangle;2.4 正三角形類的創(chuàng)建及定義(這個(gè)類中添加了旋轉(zhuǎn))創(chuàng)建一個(gè)正三角形類,命名為CDelta,繼承CShape類,在該類中添加公有成員變量,代碼如下:public:CDelta();CDelta(intx,inty,intradius=0);帶參數(shù)的構(gòu)造函數(shù),其中x為外接圓圓心的橫坐標(biāo),y為外接圓圓心的縱坐標(biāo),radius為外接圓半徑intRadius;外接圓半徑CPointcp;/外接圓圓心doubletheta;/在正三角形原圖上旋轉(zhuǎn)過(guò)的角度doublest;/該變量?jī)?chǔ)存的是sin(theta)doublect;/該變量?jī)?chǔ)存的事cos(theta)Draw(CDC*pDC)

24、;重新定義Draw函數(shù)virtualCDelta();在無(wú)參數(shù)構(gòu)造函數(shù)中初始化變量,代碼如下:CDelta:CDelta()cp.x=0;/圓心的橫坐標(biāo)初始為0cp.y=0;/圓心的縱坐標(biāo)初始為0Radius=0;/外接圓半徑初始為0在帶參數(shù)構(gòu)造函數(shù)中將傳入的值賦給各變量,代碼如下:CDelta:CDelta(intx,inty,intradius)cp.x=x;/將傳入的x值賦給圓心的橫坐標(biāo)cp.y=y;/將傳入的y值賦給圓心的縱坐標(biāo)Radius=radius;將傳入的radius值賦給外接圓半徑ct=1;/調(diào)用該函數(shù)時(shí)將cos(theta)S置為1st=0;/調(diào)用該函數(shù)時(shí)將sin(thet

25、a)設(shè)置為0與正五邊形相同,要引入數(shù)學(xué)類的頭文件以及定義宏變量PI,#include“math”#definePI3.1415926開(kāi)始重寫(xiě)定義的Draw(CDC*pDC)函數(shù),代碼如下:CDelta:Draw(CDC*pDC)度余60doublerc=Radius*cos(60*PI/180);/外接圓半徑與rc弦值相乘后賦給度正60doublers=Radius*sin(60*PI/180);/外接圓半徑與rs弦值相乘后賦給ct的余弦值賦給ct=cos(theta);/將thetastthetast=sin(theta);/將的正弦值賦給/)定義兩個(gè)點(diǎn)(接下來(lái)會(huì)詳細(xì)說(shuō)明POINTdx1,d

26、x11;/POINTdx2,dx22;/同上POINTdx3,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.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+c

27、p.x;dx33.y=dx3.y*ct+dx3.x*st+cp.y;33.x,dx33.y;/定義點(diǎn)數(shù)組,存儲(chǔ)正三角形的三個(gè)點(diǎn)pDC->Polygon(pts,3);/利用畫(huà)多邊形的函數(shù)Polygon。畫(huà)正三角形,pts為儲(chǔ)存的三個(gè)點(diǎn),3為點(diǎn)的個(gè)數(shù):函數(shù)里的變量以及運(yùn)算進(jìn)行解釋接下來(lái)對(duì)Draw如圖所示,正三角形的中心到各頂點(diǎn)的距離為半徑,R(cp.x,cp.y),設(shè)中心點(diǎn)的坐標(biāo)為則可得到右下角的坐標(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(

28、60*PI/180)cp.x,cp.x-R此時(shí),我們得到了三個(gè)頂點(diǎn)的坐標(biāo),如果按這三個(gè)點(diǎn)的。60坐標(biāo)畫(huà)圖,就會(huì)得到如圖所示的三角形,在此基礎(chǔ)上,,有以下原理作為基礎(chǔ)不妨設(shè)此圖形逆時(shí)針轉(zhuǎn)過(guò)的角度為:角,得到新的點(diǎn)的坐標(biāo)(x2,y2)旋轉(zhuǎn)設(shè)一個(gè)點(diǎn)的坐標(biāo)為(x1,y1),它繞另一個(gè)點(diǎn)為:+x2;-(y1-y2)*sinx=(x1-x2)*cos+y2;+(x1-x2)*siny=(y1-y2)*cos角顯然,只需得到三個(gè)點(diǎn)繞中心旋轉(zhuǎn)后各自的新坐標(biāo),我們就可以根據(jù)旋轉(zhuǎn)的得到新的正三角形用thetaDraw(CDC*pDC)函數(shù)中,來(lái)代替,以右下角頂點(diǎn)為例,原坐標(biāo)為在cp.x+rs,cp.y+rc按如下

29、代碼將cos(theta)ffisin(theta潛換:ct=cos(theta);st=sin(theta);用dx3.x儲(chǔ)存該點(diǎn)與中心點(diǎn)橫坐標(biāo)的差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的頭文件中引入正三

30、角形類,#include“Delta.h”添加私有變量,創(chuàng)建正三角形類的指針變量:CDelta*delta;接下來(lái)我直接給出剩下基本形狀類的代碼(只在當(dāng)中作注釋,不再詳細(xì)解釋)2.5 橢圓類的創(chuàng)建和定義創(chuàng)建名為CEllipse的類,繼承CShape,在該頭文件中添加如下代碼:classCEllipse:publicCShapepublic:CEllipse();CEllipse(intx,inty,intw=0,inth=0);/帶參數(shù)的構(gòu)造函數(shù),值分別為外接矩形左上角的橫坐標(biāo)、縱坐標(biāo)、寬度、高度intwidth;/外接矩形的寬度intheight;/外接矩形的高度CPointcenter_p

31、oint;/橢圓中心點(diǎn)Draw(CDC*pDC);/重新定義Draw函數(shù)virtualCEllipse();在該類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(intx,inty,intw,inth)center_point.x=x;/將傳入的x值賦給中心點(diǎn)的橫坐標(biāo)center_point.y=y;/將傳入的y值賦給中心點(diǎn)的縱坐標(biāo)width=w;/將

32、傳入的w值賦給寬度height=h;/將傳入的h值賦給高度CEllipse:Draw(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的頭文件中引入橢圓類,#include“Ellipse.h”添加私有變量,創(chuàng)建橢圓類的指針變量:CEllipse*ellipse;2.6 正四邊形類的創(chuàng)建及定義命名為CQuadrangle,頭文件中添加如下代碼:public:CQu

33、adrangle();CQuadrangle(intx,inty,intradius=0);/帶參數(shù)的構(gòu)造函數(shù),參數(shù)分別為中心點(diǎn)的橫坐標(biāo)、縱坐標(biāo)、外接圓半徑intRadius;/外接圓半徑CPointcPoint;/中心點(diǎn)函數(shù)Draw(CDC*pDC);/重新定義DrawvirtualCQuadrangle();appCQuadrangle:CQuadrangle()0cPoint.x=0;/將中心點(diǎn)的橫坐標(biāo)初始為0cPoint.y=0;/將中心點(diǎn)的縱坐標(biāo)初始為0Radius=0;/將外接圓的半徑初始為CQuadrangle:CQuadrangle(intx,inty,intradius)x值

34、賦給中心點(diǎn)的橫坐標(biāo)cPoint.x=x;/將傳入的y值賦給中心點(diǎn)的縱坐標(biāo)cPoint.y=y;將傳入的radius賦給外接圓半徑Radius=radius;/等傳入的CQuadrangle:Draw(CDC*pDC)度余弦45doubleRc=Radius*cos(45*PI/180);/將半徑與Rc值的乘積賦給POINToint.x-Rc,cPoint.y-oint.x-Rc,cPoint.y+Rc;/定義點(diǎn)數(shù)組,儲(chǔ)存四個(gè)頂點(diǎn)pDC->Polygon(pts,4);/利用多邊形繪畫(huà)函數(shù)畫(huà)正四邊形在CMyDraw2_0View的頭文件中引入正四邊形類,#include“Quadrangl

35、e.h”添加私有變量,創(chuàng)建正四邊形類的指針變量:CQuadrangle*quadrangle;2.7 正六邊形的創(chuàng)建及定義命名為CRegularHexagon,頭文件中添加如下代碼:public:CQuadrangle();CQuadrangle(intx,inty,intradius=0);/帶參數(shù)的構(gòu)造函數(shù),參數(shù)分別為中心點(diǎn)的橫坐標(biāo)、縱坐標(biāo)、外接圓半徑intRadius;/外接圓半徑CPointcPoint;中心點(diǎn)Draw(CDC*pDC);/重新定義Draw函數(shù)virtualCQuadrangle();在該類app中添加如下代碼:CRegularHexagon:CRegularHexag

36、on()0cp.x=0;/將中心點(diǎn)的橫坐標(biāo)初始為0cp.y=0;/將中心點(diǎn)的縱坐標(biāo)初始為0Radius=0;/W外接圓的半徑初始為CRegularHexagon:CRegularHexagon(intx,inty,intradius)值賦給中心點(diǎn)的橫坐標(biāo)cp.x=x;/將傳入的x值賦給中心點(diǎn)的縱坐標(biāo)cp.y=y;/將傳入的yradiusRadius=radius;/等傳入的值賦名&外接圓半徑CRegularHexagon:Draw(CDC*pDC)度正doublers=Radius*sin(30*PI/180);/將半彳全與30rs弦值的乘積賦給度余30doublerc=Radius*

37、cos(30*PI/180);/|等半彳與rc弦值的乘積賦給度正60Rs=Radius*sin(60*PI/180);/將半徑與doubleRs弦值的乘積賦給度余將半徑與60doubleRc=Radius*cos(60*PI/180);/Rc弦值的乘積賦給POINT.x+Radius,cp.y;/定義點(diǎn)數(shù)組pts,儲(chǔ)存正六邊形的六個(gè)頂點(diǎn)pDC->Polygon(pts,6);/利用多邊形繪畫(huà)函數(shù)畫(huà)出正六邊形在CMyDraw2_0View的頭文件中引入正六邊形類,#include“RegularHexagon.h”添加私有變量,創(chuàng)建正六邊形類的指針變量:CRegularHexagon*re

38、gularhexagon;2.8 直線類的創(chuàng)建及定義命名為CLine,在頭文件中添加如下代碼:public:CLine();CLine(intsx,intsy,intex=0,intey=0);/帶參數(shù)的構(gòu)造函數(shù),分別為直線起點(diǎn)的橫坐標(biāo)、縱坐標(biāo),終點(diǎn)的橫坐標(biāo)、縱坐標(biāo)Draw(CDC*pDC);/重新定義Draw函數(shù)CPointp_start;/定義直線起點(diǎn)CPointp_end;/淀義直線終點(diǎn)virtualCLine();在該類app中添加如下代碼:CLine:CLine()p_start.x=0;/W起點(diǎn)橫坐標(biāo)初始為0p_start.y=0;/W起點(diǎn)縱坐標(biāo)初始為0p_end.x=0;/W終點(diǎn)

39、橫坐標(biāo)初始為0p_end.y=0;/|等終點(diǎn)縱坐標(biāo)初始為0CLine:CLine(intsx,intsy,intex,intey)p_start.x=sx;/|等sx的值賦給起點(diǎn)的橫坐標(biāo)p_start.y=sy;/膈sy的值賦給起點(diǎn)的縱坐標(biāo)p_end.x=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à)出直線起點(diǎn)pDC->LineTo(p_end);/禾I用LineTo()函數(shù)從起點(diǎn)畫(huà)直線到終點(diǎn)在CMyDraw2_0View的頭文件中引入

40、直線類,#include“Line.h”添加私有變量,創(chuàng)建直線類的指針變量:CLine*line;3 .各基本形狀類在CMyDraw2_0View類中的調(diào)用與繪圖的實(shí)現(xiàn)(注:以矩形、圓形、正三角形為重點(diǎn)介紹)3.1 矩形類的調(diào)用與與繪圖的實(shí)現(xiàn)繪圖的過(guò)程是:鼠標(biāo)左鍵按下->鼠標(biāo)移動(dòng)->鼠標(biāo)左鍵彈起在此,引入鼠標(biāo)的三個(gè)響應(yīng)函數(shù),分別對(duì)應(yīng)該三個(gè)過(guò)程:按下ctrl+w,彈出如圖所示對(duì)話框,并按如圖操作,選擇右側(cè)的AddFunction(本應(yīng)是黑色,由于已添加,變?yōu)榛疑?,將三個(gè)響應(yīng)函數(shù)添加到CMyDraw2_0View類app中。現(xiàn)在,需要告訴鼠標(biāo),當(dāng)鼠標(biāo)左鍵按下時(shí)開(kāi)始進(jìn)行繪畫(huà),那么,需要

41、添加一個(gè)變量,告訴鼠標(biāo)是否進(jìn)行繪畫(huà):為View類添加私有成員變量:boolmDown;在View類的構(gòu)造函數(shù)中對(duì)該值進(jìn)行初始化,代碼如下:CMyDraw2_0View:CMyDraw2_0View()/TODO:addconstructioncodeheremDown=false;/將mDown初始為false,表示默認(rèn)為不進(jìn)行繪畫(huà)在鼠標(biāo)左鍵按下的響應(yīng)函數(shù)中添加如下代碼:VoidCMyDraw2_0View二OnLButtonDown(UINTnFlags,CPointpoint)一mDown=true;/將mDown標(biāo)記為true,表示此時(shí)即將開(kāi)始繪畫(huà)在鼠標(biāo)左鍵彈起的響應(yīng)函數(shù)中添加如下代碼:

42、voidCMyDraw2_0View二OnLButtonUp(UINTnFlags,CPointpoint)一mDown=false;/將mDown重新標(biāo)記為false,表明此時(shí)應(yīng)停止繪畫(huà)在鼠標(biāo)移動(dòng)時(shí)判斷鼠標(biāo)是否按下,如果按下則開(kāi)始進(jìn)行繪畫(huà):voidCMyDraw2_0View:OnMouseMove(UINTnFlags,CPointpoint)if(mDown)/此處添加繪畫(huà)代碼(下面會(huì)說(shuō)到)至恥匕,對(duì)鼠標(biāo)是否進(jìn)行繪畫(huà)的判斷已完成,接下來(lái),需要告訴鼠標(biāo)畫(huà)出的圖形應(yīng)該是矩形,不妨設(shè)一個(gè)變量用來(lái)儲(chǔ)存類型:在View類中添加私有成員變量:intShapeType;/亥變量用來(lái)儲(chǔ)存圖形類型在Vie

43、w類構(gòu)造函數(shù)中進(jìn)行該變量的初始化:ShapeType=1;/默認(rèn)為-1,表示為標(biāo)的隨手畫(huà)(下面會(huì)提到)為View類添加菜單中矩形的響應(yīng)函數(shù):同樣按下Ctrl+W,在彈出的對(duì)話框中如下選擇:;flBLjMessage MapsProject: iMyDMwToMemLer VariablesAuTumstiunActiveX EventsClass name:F CMyDruwS OVicwD:lTAMyD raw2_DVI ewT H OXlMyD raw2_0VI cw. rp pbjed IDs:It) Mt-NU GRAPH UHt#IDMt N lCgHAPH 二PO LYGUN_D

44、ELIA idmen ugraph 二PO lygonpe MTAI lU2 Mb N U2GRAPH2HO LYGON 二口 LMDH IO- ME NGRAPH-PO LYGON-RE G ULIO MENU GRAPH RECTANGLEIO MENU PEN COLOR CUSTOMClas« InfoAdd Claes,. .Add FunctionFuncrinriiCOMMANIJ UPDAIt COMMAND UILdrt CodeW OnMdCoinON ID ADD COINXOMMAMDV Onl(產(chǎn)ginPrintingV OnDraiw W OnDrau/C

45、ircleON_I DDRAW_C IRC Lfc: COMMANDW OnDrawDcItaOh ID DRAW DELT幽COMMANDDcscri plion:Mennber fundtions:取消圖中,藍(lán)色條中的字符為在資源編輯時(shí)定義的矩形的ID,同樣選擇AddFunctioin,在View類中出現(xiàn)如下代碼:voidCMyDraw2_0View:OnMenuGraphRectangle()/TODO:Addyourcommandhandlercodehere在該函數(shù)中添加如下代碼:ShapeType=2;/用2來(lái)代表矩形這樣,就能用數(shù)字來(lái)表示各個(gè)基本形狀了有了這個(gè)變量后,在鼠標(biāo)左鍵按

46、下時(shí),首先判斷該變量是否為-1(因?yàn)槌跏紴?1,對(duì)應(yīng)的是隨手畫(huà)),假如不是,則對(duì)ShapeType的值進(jìn)行乎U斷,用switch函數(shù)進(jìn)行相應(yīng)的操作:在鼠標(biāo)左鍵按下的相應(yīng)函數(shù)中添加如下代碼:if(ShapeType!=1)/判斷當(dāng)前的ShapeTypefi是否為-1switch(ShapeType)/M當(dāng)前傳入的ShapeTypefi進(jìn)行選擇,分別進(jìn)行隊(duì)形的操作當(dāng)然,畫(huà)矩形需要給矩形類傳入矩形的左上角坐標(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類中添加私有成員變量:CPointpo

47、nit_start;/用來(lái)存儲(chǔ)起點(diǎn)CPointpoint_end;/用來(lái)存儲(chǔ)終點(diǎn)在鼠標(biāo)左鍵按下的響應(yīng)函數(shù)中添加以下代碼:point_start=point;將鼠標(biāo)按下時(shí)的點(diǎn)存儲(chǔ)在point_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ù)中添加以下代碼case2:rectangle=newCRectangle(point_start.x,point_start.y);break;/new一個(gè)矩形對(duì)象,將該地

48、址存儲(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ì)ShapeTypefi作出判斷,告訴鼠標(biāo)該進(jìn)行矩形的繪畫(huà),方法與前面類似:在該函數(shù)的開(kāi)頭添加如下代碼:CDC*pDC=GetDC();打開(kāi)圖形設(shè)備接口,簡(jiǎn)單來(lái)說(shuō),就是用pDC來(lái)進(jìn)行繪畫(huà)在if(mDown)中添加如下代碼:switch(ShapeType)case2:pDG>SetROP2(R2_NOTXORPEN);/將顏色設(shè)置為反色if(point_end.x!=0)/判斷鼠標(biāo)是否移動(dòng)了rectangle->Dra

49、w(pDC);/調(diào)用矩形類中的Draw函數(shù)point_end=point;/將終點(diǎn)設(shè)置為鼠標(biāo)當(dāng)前所在的點(diǎn)rectangle>width=point_end.x-point_start.x;/將終點(diǎn)與起點(diǎn)的橫坐標(biāo)之差賦給矩形類中的寬度widthrectangle>height=point_end.y-point_start.y;/將終點(diǎn)與起點(diǎn)的縱坐標(biāo)之差賦給矩形類中的高度heightrectangle->Draw(pDC);調(diào)用矩形類中的Draw函數(shù)break;下面對(duì)以上代碼進(jìn)行解釋:當(dāng)鼠標(biāo)按下時(shí),終點(diǎn)point_end的值為0,判斷為false,將鼠標(biāo)此時(shí)的點(diǎn)賦給point_

50、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)之前畫(huà)的矩形覆蓋掉,不會(huì)再看見(jiàn),所以看到的矩形為當(dāng)前的矩形,之前的矩形已無(wú)法看見(jiàn),否則將會(huì)看到一連串的矩形。3.2 圓形類的調(diào)用在3.1中已經(jīng)為繪圖做好了準(zhǔn)備工作,下面只需要用一個(gè)數(shù)字表示圓形類看,并在鼠標(biāo)左鍵按下和鼠標(biāo)移動(dòng)的響應(yīng)函數(shù)中的switch語(yǔ)句中添加相應(yīng)代碼即可:voidCMyDraw2_0View:OnMenuGraphCircle()/TODO:AddyourcommandhandlercodehereShap

51、eType=3;/用3來(lái)表示圓形在OnLButtonDown()中的switch語(yǔ)句中添加如下代碼:Case3:circle=newCCircle(point_start.x,point_start.y);break;/new一個(gè)圓形類對(duì)象,將地址儲(chǔ)存在circle中,并將起點(diǎn)傳入,作為圓形的中心點(diǎn)在OnMouseMove()中的switch語(yǔ)句中添加如下代碼:case3:pDG>SetROP2(R2_NOTXORPEN);/將顏色設(shè)為反色if(point_end.x!=0)/判斷鼠標(biāo)是否移動(dòng)circle->Draw(pDC);/調(diào)用圓形類中的Draw()函數(shù)point_end=p

52、oint;/將鼠標(biāo)當(dāng)前所在的點(diǎn)保存在ponit_end中xx=point_end.x-point_start.x;/將終點(diǎn)與起點(diǎn)的橫坐標(biāo)之差賦給xx(由于很多地方都會(huì)用到該變量,我將它作為View類的私有成員變量)yy=point_end.y-point_start.y;/將終點(diǎn)與起點(diǎn)的縱坐標(biāo)之差賦給yy(同上)circle->Radius=(int)sqrt(xx*xx+yy*yy);/將兩點(diǎn)間的距離作為圓的半徑circle->Draw(pDC);/調(diào)用圓形類中的Draw函數(shù)break;接下來(lái),相同作用的代碼不再做注釋3.3 正三角形類的調(diào)用voidCMyDraw2_0View:

53、OnMenuGraphPolygonDelta()/TODO:AddyourcommandhandlercodehereShapeType=5;/用5來(lái)表示正三角形在OnLButtonDown()中的switch語(yǔ)句中添加如下代碼:case5:delta=newCDelta(point_start.x,point_start.y);break;/new一個(gè)正三角形類對(duì)象,將地址保存在delta中,并將起點(diǎn)傳入,作為正三角形的中心點(diǎn)在OnMouseMove()中的switch語(yǔ)句中添加如下代碼:case5:pDC->SetROP2(R2_NOTXORPEN);if(point_end.x!

54、=0)delta->Draw(pDC);point_end=point;xx=point_end.x-point_start.x;yy=point_end.y-point_start.y;delta->Radius=(int)sqrt(xx*xx+yy*yy);delta->theta=(double)(point.x-point_start.x)/delta->Radius*PI*2;由于theta的取值范圍是0360度,類型為double,假如直接用數(shù)學(xué)函數(shù)asin(),只能取到-90度到90度,所以,當(dāng)鼠標(biāo)繞著中心轉(zhuǎn)動(dòng)的時(shí)候,會(huì)有余弦的函數(shù)cos(),該值為point.x-poin

溫馨提示

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

評(píng)論

0/150

提交評(píng)論