




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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 功能說明2 2.1菜單欄3 2.1.1圖形3 2.1.2畫筆4 2.1.3畫硬幣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è)基類8 2.基本形狀類的創(chuàng)建8 2.1矩形類的創(chuàng)建及定義 8 2.2圓形類的創(chuàng)建及定義10 2.3正五邊形類的創(chuàng)建及定義11 2.4正三角形類的創(chuàng)建及定義14 2.5橢圓類的創(chuàng)建及定義16 2.6正四邊形類的創(chuàng)建及的定義17 2.7正六邊形類的創(chuàng)建及定義18 2.8
2、直線類的創(chuàng)建及定義19 3.各基本形狀類在CMyDraw2_0類中的調(diào)用和繪圖的實(shí)現(xiàn)20 3.1矩形類的調(diào)用與與繪圖的實(shí)現(xiàn)20 3.2圓形類的調(diào)用24 3.3正三角形類的調(diào)用25 3.4基本類型調(diào)用的剩余代碼26 4.畫筆的使用、顏色及大小的調(diào)整29 5.畫硬幣35 6.工具欄中的自定義控件38 7.狀態(tài)欄中的顯示394程序功能的測(cè)試415最后總結(jié)42摘要:本繪圖程序能夠進(jìn)行基本圖形的繪畫,如直線,圓,矩形,三角形等等,并且在此基礎(chǔ)上添加了多邊形的繪畫,如正五邊形等。除此之外,還能夠進(jìn)行隨手畫,即用鼠標(biāo)隨意畫線條。為了更好的繪圖,還添加了對(duì)畫筆粗細(xì)的調(diào)整,以及對(duì)畫筆顏色的調(diào)整,除了特定的顏色,
3、顏色還可根據(jù)輸入的RGB值隨意更改。還有一些老師的要求,加入了畫硬幣、顯示硬幣數(shù)目即鼠標(biāo)坐標(biāo)等信息。本程序主要采用面向?qū)ο髮懛?。關(guān)鍵字:程序設(shè)計(jì),MFC,繪圖1. 引言設(shè)計(jì)目的本繪圖程序的設(shè)計(jì)不僅僅局限于老師課堂的要求,通過C+的編寫實(shí)現(xiàn)繪圖要求,我還想要在此基礎(chǔ)上,加入自己的一些想法,想要更好地了解MFC,更好地去實(shí)現(xiàn)自己的想法。2. 功能說明 2.1菜單欄2.1.1圖形圖形欄中包括直線、矩形、圓形、橢圓、多邊形,多邊形中包括正三角形、正四邊形、正五邊形、正六邊形。選擇直線,可用鼠標(biāo)拖動(dòng)畫出一條直線選擇矩形,可用鼠標(biāo)拖動(dòng)畫出矩形選擇圓形,可用鼠標(biāo)拖動(dòng)畫出圓形 選擇橢圓,可用鼠標(biāo)拖動(dòng)畫出橢圓選
4、擇正三角形,可用鼠標(biāo)拖動(dòng)畫出正三角形選擇正四邊形,可用鼠標(biāo)拖動(dòng)畫出正方形選擇正五邊形,可用鼠標(biāo)拖動(dòng)畫出正五邊形選擇正六邊形,可用鼠標(biāo)拖動(dòng)畫出正六邊形(注:為了驗(yàn)證自己的想法以及想讓畫出的圖形隨意地變換方向,特意在正三角形一項(xiàng)中加入了旋轉(zhuǎn)效果,使鼠標(biāo)在拖動(dòng)時(shí)能旋轉(zhuǎn)三角形)2.1.2畫筆 畫筆欄中包括顏色、大小及鉛筆 (1)顏色 顏色中包括黑色、紅色、綠色、藍(lán)色、橙色、黃色、青色、紫色、粉色、 自定義 選擇黑色,畫出的圖形將為黑色 選擇紅色,畫出的圖形將為紅色 選擇綠色,畫出的圖形將為綠色 選擇橙色,畫出的圖形將為橙色 選擇黃色,畫出的圖形將為黃色 選擇青色,畫出的圖形將為青色 選擇紫色,畫出的圖
5、形將為紫色 選擇粉色,畫出的圖形將為粉色 選擇自定義,可輸入RGB值,畫出的圖形將顯示輸入的顏色 (2)大小 大小中包括1、2、3、4、5、6、7 選擇1,畫筆大小設(shè)為1 選擇2,畫筆大小設(shè)為2 選擇3,畫筆大小設(shè)為3 選擇4,畫筆大小設(shè)為4 選擇5,畫筆大小設(shè)為5 選擇6,畫筆大小設(shè)為6 選擇7,畫筆大小設(shè)為7 (3)鉛筆 選中鉛筆后,將可以用鼠標(biāo)進(jìn)行隨意畫線 2.1.3畫硬幣 畫硬幣中包括畫、增加、減少、清除 選擇畫,將在客戶端窗口中畫出初始數(shù)量為10的硬幣 選擇增加,窗口中的硬幣數(shù)目將增加1個(gè) 選擇減少,窗口中的硬幣數(shù)目將減少1個(gè) 選擇清除,刷新窗口,將硬幣消去 2.2工具欄 工具欄中除
6、了原有的圖標(biāo)外,還加入了自定義的圖標(biāo)選擇,可用鼠標(biāo)拖動(dòng)畫出一條直線選擇,可用鼠標(biāo)拖動(dòng)畫出矩形選擇,可用鼠標(biāo)拖動(dòng)畫出圓形選擇,可用鼠標(biāo)拖動(dòng)畫出正三角形選擇,可用鼠標(biāo)進(jìn)行隨手畫選擇,可在窗口畫出硬幣后,將硬幣數(shù)量+1選擇,可在窗口畫出硬幣后,將硬幣數(shù)量-1選擇,可利用鼠標(biāo)對(duì)所繪圖形進(jìn)行擦除,橡皮擦的大小與畫筆大小相同 2.3狀態(tài)欄 狀態(tài)欄中除了原有的顯示外,還加入了硬幣的數(shù)量以及鼠標(biāo)的x坐標(biāo)和y坐標(biāo)3. 功能的實(shí)現(xiàn) 3.1視圖設(shè)計(jì) 利用MFC 生成畫圖應(yīng)用程序框架具體步驟如下:(1)執(zhí)行VC程序,選擇File|New命令,彈出New對(duì)話框.單擊Projects標(biāo)簽,轉(zhuǎn)到Projects選項(xiàng)卡,選擇
7、MFC AppWizard(exe)選項(xiàng),然后在Project name文本框中輸入MyDraw2_0(原來也做過一個(gè),不過并沒有以面向?qū)ο蟮膶懛ㄈ懀@個(gè)就當(dāng)作是我的第二個(gè)版本),文本框是指項(xiàng)目的本地路徑。(2)由于本程序是實(shí)現(xiàn)畫線,要在視圖中完成,所以首先創(chuàng)建一個(gè)基于單文檔的應(yīng)用程序 3.2編輯資源(1) 利用ResourceView中的Menu編輯器在菜單欄添加菜單,該流程圖如下3.2所示: 圖3.2(2) 利用ResourceView中的ToolBar編輯器,在工具欄中添加自定義控件??丶D案如下所示: 3.3編程思路及各個(gè)函數(shù)的實(shí)現(xiàn)(1)思路:首先,畫定義好的形狀。直線、矩形、圓形等
8、等都屬于基本的形狀,那么我設(shè)定一個(gè)基類,稱它為CShape,給這個(gè)基類定義一個(gè)畫畫的虛函數(shù)Draw(CDC *pDC),在這個(gè)類里面派生出各個(gè)需要的類,如CCircle類,并為這些派生類定義各自的屬性及方法,重寫基類的Draw函數(shù)。當(dāng)我需要用到這些類的時(shí)候,只需要在View類里創(chuàng)建指針,然后調(diào)用里面Draw方法。由于是當(dāng)鼠標(biāo)拖動(dòng)的時(shí)候畫出所需的圖形,需要添加鼠標(biāo)響應(yīng)函數(shù),onLButtonDown(),onLButtonUp,以及onMouseMove()。畫畫主要是在onMouseMove()里實(shí)現(xiàn)。接著,是畫筆的顏色和大小,本來是想單獨(dú)創(chuàng)建一個(gè)畫筆類,定義顏色和大小屬性,使CCircle等
9、派生類多繼承,在繼承一個(gè)畫筆類,但嘗試了幾遍,發(fā)現(xiàn)在菜單里選擇顏色時(shí)就會(huì)使程序停止運(yùn)行,于是就放棄了。重新構(gòu)思之后,由于畫圖是在CMyDraw2_0里實(shí)現(xiàn)的,就直接在CMyDraw2_0中定義了顏色和大小的變量,這樣也方便。然后是畫硬幣。并沒有為這個(gè)創(chuàng)建單獨(dú)的類,直接在CMyDraw2_0中的OnDraw()中畫硬幣,并且在CMyDraw2_0中添加了增加和減少硬幣的方法。工具欄中只要和為各個(gè)圖標(biāo)添加函數(shù),作用和菜單欄中的圖形一欄中對(duì)應(yīng)即可。最后還有硬幣的數(shù)量和鼠標(biāo)坐標(biāo)放在狀態(tài)欄中顯示,下面開始進(jìn)行函數(shù)代碼的實(shí)現(xiàn)。(2) 代碼的實(shí)現(xiàn):1. 為基本形狀創(chuàng)建一個(gè)基類,命名為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. 基本形狀類的創(chuàng)建(注:以矩形、圓形、正五邊形、正三邊形為重點(diǎn)介紹) 2.1矩形類的創(chuàng)建及定義創(chuàng)建一個(gè)矩形類,繼承CShape類,如圖在該類中重新定義畫畫函數(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(); 在無參數(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 重寫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ù)畫出矩形,其中的值分別為矩形的左上角橫坐標(biāo),左上角縱坐標(biāo),右下角橫坐標(biāo),右下角縱坐標(biāo)在CMyDraw2_0View中引入矩形類的頭文件:雙擊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類中添加私有成員變量,創(chuàng)建矩形類的指針: 右鍵點(diǎn)擊CMyDraw2_0View,選擇Add Member Variable, 在彈出的對(duì)話框中如下輸入: 將在CMyDraw2_0View頭文件中出現(xiàn)如下代碼Private:CRectangle *rectangle;/定義指向矩形類的指針, 為私有變量2.2圓形類的創(chuàng)建及定義創(chuàng)建一個(gè)圓形類,命名為CCir
15、cle,繼承CShape類,在該類中添加公有成員變量,代碼如下: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)在無參數(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值賦給圓的半徑 重寫定義的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中引入圓形類的頭文件: #include "Circle.h"添加私有成員變量,創(chuàng)建圓形類的指針變量: CCircle *circle; /創(chuàng)建圓形類的指針,可以直接寫在矩形類只針對(duì)下方2.3正五邊形類的創(chuàng)建及定義 創(chuàng)建一個(gè)正五邊形類,命名為CPentangle,繼承CShape類, 在該類中添加公有成員變量,代碼如下: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();在無參數(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值賦給外接圓半徑下面重寫的Draw函數(shù)與前兩個(gè)不同,需要用到數(shù)學(xué)函數(shù)cos()以及sin(),由于兩個(gè)函數(shù)用的是弧度制,還需引入數(shù)學(xué)變量PI,為了能夠順利的寫入這些函數(shù),需要在CPentangle類的客戶端中引入數(shù)學(xué)類的頭文件:雙擊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é)類頭文件:#include “math.h” 再定義一個(gè)宏變量PI,添加如下代碼:#define PI 3.1415926 開始重寫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)類的數(shù)組將五個(gè)點(diǎn)儲(chǔ)存在點(diǎn)數(shù)組pts中pDC->Po
22、lygon(pts,5); /利用函數(shù)Polygon()進(jìn)行多邊形的繪畫,其中pts為儲(chǔ)存的點(diǎn),5為點(diǎn)的個(gè)數(shù)下面對(duì)Draw函數(shù)中各數(shù)據(jù)進(jìn)行深層次的分析,表明它們的來歷:如圖所示:以外接圓圓心為坐標(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í)針方向看,接下去的幾個(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)的來歷,接下來在CMyDraw2_0View中引入正五邊形類的頭文件: #include “Pentangle.h”添加一個(gè)私有變量,創(chuàng)建指向正五邊形的指針變量: CPentangle *pentangle; 2.4正三角形類的創(chuàng)建及定義(這個(gè)類中添加了旋轉(zhuǎn))創(chuàng)建一個(gè)正三角形類,命名為CDelta,繼承CShape類,在該類中添加公有成員變量,代碼如下: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)過的角度double st; /該變量?jī)?chǔ)存的是sin(theta)double ct; /該變量?jī)?chǔ)存的事cos(theta)Draw(CDC* pDC); 重新定義Draw函數(shù)virtual CDelta();在無參數(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é)類的頭文件以及定義宏變量PI,#include “math”#define PI 3.1415926 開始重寫定義的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)(接下來會(huì)詳細(xì)說明)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);/利用畫多邊形的函數(shù)Polygon()畫正三角形,pts為儲(chǔ)存的三個(gè)點(diǎn),3為點(diǎn)的個(gè)數(shù)接下來對(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í)針方向,接下來兩個(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ì)得到如圖所示的三角形,在此基礎(chǔ)上,不妨
29、設(shè)此圖形逆時(shí)針轉(zhuǎn)過的角度為,有以下原理作為基礎(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來代替,以右下角頂點(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)接下來,在CMyDraw2_0View的頭文件中引入正三角形類,#include “Delta.h”添加私有變量,創(chuàng)建正三角形類的指針變量:CDelta* delta;接下來我直接給出剩下基本形狀類的
31、代碼(只在當(dāng)中作注釋,不再詳細(xì)解釋)2.5橢圓類的創(chuàng)建和定義創(chuàng)建名為CEllipse的類,繼承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、);在該類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ù)畫橢圓在CMyDraw2_0View的頭文件中引入橢圓類,#include “Ellipse.h”添加私有變量,創(chuàng)建橢圓類的指針變量:CEllipse *ellipse;2.6正四邊形類的創(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();在該類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、;/利用多邊形繪畫函數(shù)畫正四邊形在CMyDraw2_0View的頭文件中引入正四邊形類,#include “Quadrangle.h”添加私有變量,創(chuàng)建正四邊形類的指針變量: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();在該類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);/利用多邊形繪畫函數(shù)畫出正六邊形在CMyDraw2_0View的頭文件中引入正六邊形類,#include “RegularHexagon.h”添加私有變量,創(chuàng)建正六邊形類的指針變量:CRegularHexagon* regularhexagon;2.8直線類的創(chuàng)建及定義命名為CLine,在頭文件中添加如下代碼:public:CLine();CLine(int sx,int sy,int ex=0,int ey=0);/帶參數(shù)的構(gòu)造函數(shù),分別為直線起點(diǎn)的橫坐標(biāo)、縱坐標(biāo),終點(diǎn)的橫坐標(biāo)、縱坐標(biāo)Dr
40、aw(CDC* pDC);/重新定義Draw函數(shù)CPoint p_start; /定義直線起點(diǎn)CPoint p_end;/定義直線終點(diǎn)virtual CLine();在該類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ù)畫出直線起點(diǎn)pDC->LineTo(p_end);/利用LineTo()函數(shù)從起點(diǎn)畫直線到終點(diǎn)在CMyDraw2_0View的頭文件中引入直線類,#include “Line.h”添加私有變量,創(chuàng)建直線類的指針變量:CLine* line;3. 各基本形狀類在CMyDraw2_0View類中的調(diào)用與繪圖的實(shí)現(xiàn) (注:以矩形、圓形、正三角形為重點(diǎn)介紹) 3.1矩形類的調(diào)用與與繪圖的實(shí)現(xiàn)繪圖的過
42、程是:鼠標(biāo)左鍵按下->鼠標(biāo)移動(dòng)->鼠標(biāo)左鍵彈起在此,引入鼠標(biāo)的三個(gè)響應(yīng)函數(shù),分別對(duì)應(yīng)該三個(gè)過程:按下ctrl+w,彈出如圖所示對(duì)話框,并按如圖操作,選擇右側(cè)的Add Function(本應(yīng)是黑色,由于已添加,變?yōu)榛疑?,將三個(gè)響應(yīng)函數(shù)添加到CMyDraw2_0View類app中。現(xiàn)在,需要告訴鼠標(biāo),當(dāng)鼠標(biāo)左鍵按下時(shí)開始進(jìn)行繪畫,那么,需要添加一個(gè)變量,告訴鼠標(biāo)是否進(jìn)行繪畫:為View類添加私有成員變量:bool mDown;在View類的構(gòu)造函數(shù)中對(duì)該值進(jìn)行初始化,代碼如下:CMyDraw2_0View:CMyDraw2_0View()/ TODO: add constructio
43、n code heremDown=false;/將mDown初始為false,表示默認(rèn)為不進(jìn)行繪畫 在鼠標(biāo)左鍵按下的響應(yīng)函數(shù)中添加如下代碼:Void CMyDraw2_0View:OnLButtonDown(UINT nFlags, CPoint point) mDown=true;/將mDown標(biāo)記為true,表示此時(shí)即將開始繪畫 在鼠標(biāo)左鍵彈起的響應(yīng)函數(shù)中添加如下代碼:void CMyDraw2_0View:OnLButtonUp(UINT nFlags, CPoint point) mDown=false;/將mDown重新標(biāo)記為false,表明此時(shí)應(yīng)停止繪畫 在鼠標(biāo)移動(dòng)時(shí)判斷鼠標(biāo)是否按
44、下,如果按下則開始進(jìn)行繪畫:void CMyDraw2_0View:OnMouseMove(UINT nFlags, CPoint point) if(mDown)/此處添加繪畫代碼(下面會(huì)說到) 到此,對(duì)鼠標(biāo)是否進(jìn)行繪畫的判斷已完成,接下來,需要告訴鼠標(biāo)畫出的圖形應(yīng)該是矩形,不妨設(shè)一個(gè)變量用來儲(chǔ)存類型:在View類中添加私有成員變量:int ShapeType;/該變量用來儲(chǔ)存圖形類型 在View類構(gòu)造函數(shù)中進(jìn)行該變量的初始化: ShapeType=-1;/默認(rèn)為-1,表示為標(biāo)的隨手畫(下面會(huì)提到)為View類添加菜單中矩形的響應(yīng)函數(shù): 同樣按下Ctrl+W,在彈出的對(duì)話框中如下選擇:圖中,
45、藍(lán)色條中的字符為在資源編輯時(shí)定義的矩形的ID,同樣選擇Add Functioin,在View類中出現(xiàn)如下代碼:void CMyDraw2_0View:OnMenuGraphRectangle() / TODO: Add your command handler code here在該函數(shù)中添加如下代碼:ShapeType=2;/用2來代表矩形這樣,就能用數(shù)字來表示各個(gè)基本形狀了有了這個(gè)變量后,在鼠標(biāo)左鍵按下時(shí),首先判斷該變量是否為-1(因?yàn)槌跏紴?1,對(duì)應(yīng)的是隨手畫),假如不是,則對(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)然,畫矩形需要給矩形類傳入矩形的左上角坐標(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è)變量來存儲(chǔ)這兩個(gè)點(diǎn):在View類中添加私有成員變量:CPoint ponit_start;/用來存儲(chǔ)起點(diǎn)CPoint point_end;/用來存儲(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)行矩形的繪畫了:矩形對(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)行的是矩形的繪畫。在鼠標(biāo)移動(dòng)的響應(yīng)函數(shù)中也要對(duì)ShapeTyp
48、e值作出判斷,告訴鼠標(biāo)該進(jìn)行矩形的繪畫,方法與前面類似:在該函數(shù)的開頭添加如下代碼:CDC* pDC=GetDC();/打開圖形設(shè)備接口,簡(jiǎn)單來說,就是用pDC來進(jìn)行繪畫在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)用矩形類中的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)之差賦給矩形類中的寬度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_end,儲(chǔ)存起來,畫出矩形,當(dāng)鼠標(biāo)移動(dòng)后,判斷為true,此時(shí)畫出的矩形左上角坐標(biāo)為鼠標(biāo)按下時(shí)的點(diǎn),高度和寬度為之前的高度和寬度,由于前面已將顏色設(shè)置為反色,所以將鼠標(biāo)移動(dòng)之
50、前畫的矩形覆蓋掉,不會(huì)再看見,所以看到的矩形為當(dāng)前的矩形,之前的矩形已無法看見,否則將會(huì)看到一連串的矩形。3.2圓形類的調(diào)用在3.1中已經(jīng)為繪圖做好了準(zhǔn)備工作,下面只需要用一個(gè)數(shù)字表示圓形類看,并在鼠標(biāo)左鍵按下和鼠標(biāo)移動(dòng)的響應(yīng)函數(shù)中的switch語句中添加相應(yīng)代碼即可:void CMyDraw2_0View:OnMenuGraphCircle() / TODO: Add your command handler code hereShapeType=3;/用3來表示圓形在OnLButtonDown()中的switch語句中添加如下代碼: Case 3:circle=new CCircle(point_start.x,point_start.y);break;/new 一個(gè)圓形類對(duì)象,將地址儲(chǔ)存在circle中,并將起點(diǎn)傳入,作為圓形的中心點(diǎn)在OnMouseMove()中的switch語句中添加如下代碼:case 3:pDC->SetROP2(R2_NOTXORPEN);/將顏色設(shè)為反色if(point_end.x!=0)/判斷鼠標(biāo)是否移動(dòng)circle->Dr
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司每月生日會(huì)策劃方案
- 2025年職業(yè)教育與成人繼續(xù)教育專業(yè)能力考核試題及答案
- 2025年醫(yī)學(xué)影像技術(shù)考試試卷及答案
- 2025年社會(huì)保障與就業(yè)考試題及答案
- 畜禽糞污資源化技術(shù)-洞察及研究
- 2025年教育信息化與學(xué)習(xí)平臺(tái)構(gòu)建考試試卷及答案
- 2025年環(huán)境工程師資格考試試卷及答案
- 2025年廣告與傳播專業(yè)考試試題及答案
- 2024年度浙江省二級(jí)造價(jià)工程師之建設(shè)工程造價(jià)管理基礎(chǔ)知識(shí)提升訓(xùn)練試卷B卷附答案
- 2024年度浙江省二級(jí)注冊(cè)建筑師之法律法規(guī)經(jīng)濟(jì)與施工題庫附答案(基礎(chǔ)題)
- (完整版)傳熱學(xué)期末考試試題
- JCT587-2012 玻璃纖維纏繞增強(qiáng)熱固性樹脂耐腐蝕立式貯罐
- Python數(shù)據(jù)分析與數(shù)據(jù)挖掘 課件 第6、7章 Pandas基礎(chǔ)與應(yīng)用、Matplotlib
- 玻璃體手術(shù)并發(fā)癥的預(yù)防及處理
- 2023年醫(yī)學(xué)高級(jí)職稱-中醫(yī)肛腸(醫(yī)學(xué)高級(jí))考試歷年高頻考點(diǎn)試題含答案
- 爬架拆除技術(shù)交底
- pergeos軟件教程評(píng)價(jià)許可介紹
- 密封條范文模板(A4打印版)
- 出租車 專業(yè)部分考核試題 城市客運(yùn)企業(yè)主要負(fù)責(zé)人和安全生產(chǎn)管理人員安全考核基礎(chǔ)題庫
- GB/T 9634.3-2002鐵氧體磁心表面缺陷極限導(dǎo)則第3部分:ETD和E形磁心
- GB/T 8478-2008鋁合金門窗
評(píng)論
0/150
提交評(píng)論