




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、F 簡 單 的 繪 圖 程 序王帥目錄摘要 2關(guān)鍵字 21 引言 2設(shè)計(jì)目的 錯(cuò)誤 !未定義書簽。2 功能說明 22.1菜單欄 錯(cuò)誤 !未定義書簽。2.1.1圖形 32.1.2 畫筆 42.1.3畫硬幣 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)建及定義 1.1.2.4 正三角形類的創(chuàng)建及定義 142.5 橢圓類的創(chuàng)建及定義 162.
2、6 正四邊形類的創(chuàng)建及的定義 172.7 正六邊形類的創(chuàng)建及定義 182.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. 畫筆的使用、顏色及大小的調(diào)整 295. 畫硬幣 356.工具欄中的自定義控件 387.狀態(tài)欄中的顯示 394 程序功能的測試 4.1.5 最后總結(jié) 4.2.摘要: 本繪圖程序能夠進(jìn)行基本圖形的繪畫,如直線,圓,矩形,三角 形等等, 并且在此基礎(chǔ)上添加了多邊形的繪畫, 如正五邊形等。 除此
3、 之外,還能夠進(jìn)行隨手畫,即用鼠標(biāo)隨意畫線條。為了更好的繪圖, 還添加了對畫筆粗細(xì)的調(diào)整, 以及對畫筆顏色的調(diào)整, 除了特定的顏 色,顏色還可根據(jù)輸入的RGB直隨意更改。還有一些老師的要求,加 入了畫硬幣、 顯示硬幣數(shù)目即鼠標(biāo)坐標(biāo)等信息。 本程序主要采用面向 對象寫法。關(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 圖形 圖形欄中包括直線、矩形、圓形、橢圓、多邊形,多邊形中包括正三角形、正四邊形、正
4、五邊形、正六邊形。 選擇直線,可用鼠標(biāo)拖動(dòng)畫出一條直線 選擇矩形,可用鼠標(biāo)拖動(dòng)畫出矩形 選擇圓形,可用鼠標(biāo)拖動(dòng)畫出圓形 選擇橢圓,可用鼠標(biāo)拖動(dòng)畫出橢圓 選擇正三角形,可用鼠標(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 畫硬幣 畫硬幣中包括畫、增加、減少、清
6、除 選擇畫,將在客戶端窗口中畫出初始數(shù)量為10的硬幣 選擇增加,窗口中的硬幣數(shù)目將增加1個(gè) 選擇減少,窗口中的硬幣數(shù)目將減少1個(gè) 選擇清除,刷新窗口,將硬幣消去2.2 工具欄工具欄中除了原有的圖標(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)對所繪圖形進(jìn)行擦除,橡皮擦的大小與畫筆大小相 同2.3 狀態(tài)欄狀態(tài)欄中除了原有的顯示外,還加入了硬幣的數(shù)量以及鼠標(biāo) 的x坐標(biāo)
7、和y坐標(biāo)3. 功能的實(shí)現(xiàn)3.1視圖設(shè)計(jì)利用MFC生成畫圖應(yīng)用程序框架具體步驟如下:執(zhí)行VC程序,選擇File|New命令,彈出New對話框.單擊Projects標(biāo)簽, 轉(zhuǎn)到Projects選項(xiàng)卡,選擇 MFC AppWizard(exe)選項(xiàng),然后在Project name文本 框中輸入MyDraw2_0 (原來也做過一個(gè),不過并沒有以面向?qū)ο蟮膶懛ㄈ懀?這個(gè)就當(dāng)作是我的第二個(gè)版本),文本框是指項(xiàng)目的本地路徑。夠色h KIF和曲酸11線ini侵幣6O圖3.23.2編輯資源(1)利用ResourceView中的Menu編輯器在菜單欄添加菜單,該流程圖如下3.2所示:利用ResourceView
8、中的ToolBar編輯器,在工具欄中添加自定義控件??丶?圖案如下所示: ril 庁*正他序1 I* L打叫邊圧問用曲口(2)由于本程序是實(shí)現(xiàn)畫線,要在視圖中完成,所以首先創(chuàng)建一個(gè)基于單文檔 的應(yīng)用程序3.3編程思路及各個(gè)函數(shù)的實(shí)現(xiàn)(1) 思路:首先,畫定義好的形狀。直線、矩形、圓形等等都屬于基本的形狀,那么我 設(shè)定一個(gè)基類,稱它為 CShape給這個(gè)基類定義一個(gè)畫畫的虛函數(shù)Draw(CDC*pDC),在這個(gè)類里面派生出各個(gè)需要的類,如CCircle類,并為這些派生類定義各自的屬性及方法,重寫基類的 Draw函數(shù)。當(dāng)我需要用到這些類的時(shí)候,只 需要在View類里創(chuàng)建指針,然后調(diào)用里面 Draw
9、方法。由于是當(dāng)鼠標(biāo)拖動(dòng)的時(shí) 候畫出所需的圖形,需要添加鼠標(biāo)響應(yīng)函數(shù),on LButt on Dow n(),o nLButt on Up,以及onMouseMove()。畫畫主要是在onMouseMove()里實(shí)現(xiàn)。接著,是畫筆的顏色和大小,本來是想單獨(dú)創(chuàng)建一個(gè)畫筆類,定義顏色和大 小屬性,使CCircle等派生類多繼承,在繼承一個(gè)畫筆類,但嘗試了幾遍,發(fā)現(xiàn) 在菜單里選擇顏色時(shí)就會(huì)使程序停止運(yùn)行,于是就放棄了。重新構(gòu)思之后,由于畫圖是在CMyDraw2_0里實(shí)現(xiàn)的,就直接在 CMyDraw2_0中定義了顏色和大小 的變量,這樣也方便。然后是畫硬幣。并沒有為這個(gè)創(chuàng)建單獨(dú)的類,直接在CMyDraw
10、2_0中的OnDraw()中畫硬幣,并且在CMyDraw2_0中添加了增加和減少硬幣的方法。工具欄中只要和為各個(gè)圖標(biāo)添加函數(shù),作用和菜單欄中的圖形一欄中對應(yīng)即可。最后還有硬幣的數(shù)量和鼠標(biāo)坐標(biāo)放在狀態(tài)欄中顯示,下面開始進(jìn)行函數(shù)代碼 的實(shí)現(xiàn)。(2) 代碼的實(shí)現(xiàn):1.為基本形狀創(chuàng)建一個(gè)基類,命名為CShape在 ClassViewz 中右鍵點(diǎn)擊 MyDraw2_0 classes-new class 在彈出窗口的 頂部下拉框中選擇Generic Class如圖所示類的類塑E;| Generic Class” |Ife定|類倍息1腹酒名稱舊;|cShapc|文件名:Shapel .cpp更改【基類冋:
11、Derived From|As|在頭文件中添加虛函數(shù)Draw(CDC *pDC) public:CShape();virtual Draw(CDC* pDc)=O; 添加的虛函數(shù) virtual CSh ape();2.基本形狀類的創(chuàng)建(注:以矩形、圓形、正五邊形、正三邊形為重點(diǎn)介紹) 2.1矩形類的創(chuàng)建及定義創(chuàng)建一個(gè)矩形類,繼承 CShape類,如圖在該類中重新定義畫畫函數(shù)Draw(),并添加帶參數(shù)的構(gòu)造函數(shù),矩形 的左上角,以及矩形的寬度和高度,代碼如下:Public:CRecta ngle();Draw(CDC* pDC); /重新定義 Draw 函數(shù)CPoi nt poi nt_Lef
12、tUp; 矩形的左上角坐標(biāo) CRecta ngle(i nt x,i nt y,i nt w=0,i nt h=0);帶參數(shù)的構(gòu)造函數(shù),x表示左上角的橫坐標(biāo),y表示左上角的縱坐 標(biāo)int width; /矩形的寬度int height; /矩形的高度 virtual CRecta ngle();在無參數(shù)構(gòu)造函數(shù)中初始化 point_LeftUp 的坐標(biāo)和寬度以及高度的值,代碼如下:CRectangle:CRectangle()point_LeftUp.x=0; /左上角坐標(biāo) x 值設(shè)置為 0 point_LeftUp.y=0; /左上角坐標(biāo) x 值設(shè)置為 0 width=0; /矩形的寬度初始
13、為 0 height=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,point_LeftUp.y,point_
14、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_)#defi neAFX_MYDRA
15、W2_0VIEW_H_3809529C_6744_4AD2_80A4_D44683D0 A5AF_INCLUDED_下添加如下代碼:#i nclude Recta ngle.h并在View類中添加私有成員變量,創(chuàng)建矩形類的指針:右鍵點(diǎn)擊 CMyDraw2_0View,選擇 Add Member Variable,在彈出的對話框中如下輸入:將在CMyDraw2_0View頭文件中出現(xiàn)如下代碼 Private:CRecta ngle *recta ngle;/定義指向矩形類的指針,為私有變量2.2圓形類的創(chuàng)建及定義創(chuàng)建一個(gè)圓形類,命名為 CCircle,繼承CShape類,在該類中添加公有 成員變
16、量,代碼如下:public:CCircle();CCircle(i nt x,i nt y,i nt 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.y=0; / 圓心的縱坐標(biāo)初始為
17、0 Radius=0; /圓的半徑初始為 0 在帶參數(shù)的構(gòu)造函數(shù)中將傳入的值賦給各變量,代碼如下CCircle:CCircle(int x,int y,int radius)center_point.x=x; center_point.y=y; Radius=radius;/將傳入的 x 值賦給圓心的橫坐標(biāo)/將傳入的 y 值賦給圓心的縱坐標(biāo) /將傳入的radius值賦給圓的半徑重寫定義的 Draw 函數(shù),代碼如下 :CCircle:Draw(CDC* pDC) pDC-Ellipse(center_point.x-Radius,center_point.y-Radius,center_p oi
18、nt.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)建圓形類的指針, 可以直接寫在矩形類只針 對下方2.3 正五邊形類的創(chuàng)建及定義創(chuàng)建一個(gè)正五邊形類,命名為 CPentangle繼承CShape類,在該類中添加公有成員變量,代碼如下 :public:CPentangle();CPentangl
19、e(int x,int y,int radius=O);帶參數(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ù)中將傳入的值賦給各變量,代碼如下 :CP
20、entangle: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ù),需要在CPe ntan gle類的客戶端中引入數(shù)學(xué)類的頭文 件:雙擊ClassView中的CPentangle()在出現(xiàn)的構(gòu)造函數(shù)上方,在如下代 碼/ Pentangle.cpp:
21、 implementation 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ù),代碼如下CPe nta ngle:Draw(CDC* pDC)double rc=Radius*cos(36*PI/180); /將半徑和 36度的余弦值 相乘并且賦給新的變量rcdouble rs=Radius*sin(36*
22、PI/180); /將半徑和 36 度的正弦值 相乘并且賦給新的變量rsdouble Rc=Radius*cos(18*PI/180); 將半徑和 18 度的余弦 值相乘并且賦給新的變量Rcdouble Rs=Radius*si n(18*PI/180);/ 將半徑和 18 度的正弦值相乘并且賦給新的變量RsPOINT pts=cP.x+rs,cP.y+rc,cP.x-rs,cP.y+rc,cP.x-Rc,cP.y-Rs,cP.x,cP.y-Radius,cP.x+Rc,cP.y-Rs;利用點(diǎn)類的數(shù)組將五個(gè)點(diǎn)儲存在點(diǎn)數(shù)組pts中pDC-Polygon(pts,5); 利用函數(shù)Polygon()
23、進(jìn)行多邊形的繪畫, 其中pts為儲存的點(diǎn),5為點(diǎn)的個(gè)數(shù)下面對Draw函數(shù)中各數(shù)據(jù)進(jìn)行深層次的分析,表明它們的來歷: 如圖所示:7236以外接圓圓心為坐標(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(18*PI/180),cP.y-R*s
24、in(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 為外接圓圓心的縱坐標(biāo), radi
25、us 為外接圓 半徑int Radius; /外接圓半徑CPoint cp; /外接圓圓心double theta; /在正三角形原圖上旋轉(zhuǎn)過的角度double st; /該變量儲存的是 sin(theta) double ct; /該變量儲存的事 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)初始為 0 Radius=0; /外接圓半徑初始為 0 在帶參數(shù)構(gòu)造函數(shù)中將傳入的值賦給各變量
26、,代碼如下 : 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=O; 調(diào)用該函數(shù)時(shí)將sin(theta股置為0與正五邊形相同,要引入數(shù)學(xué)類的頭文件以及定義宏變量 PI, #include “math”#define PI 3.1415926開始重寫定義的Draw(CDC* pDC)函數(shù),代碼如下:CDelta:Draw(CDC* pDC
27、)double rc=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
28、-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+cp.x;dx33.y=dx3.y*ct+dx3.x*st+cp.y;POINT pts=dx11.x,dx11.y,dx22.x,dx22.y,dx33.x,dx33.y; 定 義點(diǎn)數(shù)組
29、,存儲正三角形的三個(gè)點(diǎn)pDC-Polygo n(pts,3);利用畫多邊形的函數(shù) Polygo n()畫正三 角形,pts為儲存的三個(gè)點(diǎn),3為點(diǎn)的個(gè)數(shù)接下來對Draw函數(shù)里的變量以及運(yùn)算進(jìn)行解釋: 如圖所示,正三角形的中心到各頂點(diǎn)的距離為半徑, 設(shè)中心點(diǎn)的坐標(biāo)為(cp.x,cp.y),則可得到右下角的坐標(biāo)為cp.x+R*si n(60*PI/180),cp.y+R*cos(60*PI/180) 按順時(shí)針方向,接下來兩個(gè)點(diǎn)的坐標(biāo)分別為此時(shí),我們得到了三個(gè)頂點(diǎn)的坐標(biāo),如果按這三個(gè)點(diǎn)的cp.x-R*si n( 60*PI/180),cp.y-R*cos(60*PI/180) cp.x,cp.x-R坐
30、標(biāo)畫圖,就會(huì)得到如圖所示的三角形,在此基礎(chǔ)上, 不妨設(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(thet
31、a);st=sin(theta);用 dx3.x 儲存該點(diǎn)與中心點(diǎn)橫坐標(biāo)的差dx3.y 儲存該點(diǎn)與中心點(diǎn)縱坐標(biāo)的差,如下 :dx3.x=cp.x+rs-cp.x;dx3.y=cp.y+rc-cp.y;用 dx33 儲存該點(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”添加私有變
32、量,創(chuàng)建正三角形類的指針變量 :CDelta* delta;接下來我直接給出剩下基本形狀類的代碼(只在當(dāng)中作注釋 ,不再詳細(xì)解釋 )2.5 橢圓類的創(chuàng)建和定義創(chuàng)建名為CEllipse的類,繼承CShape在該頭文件中添加如下代碼:class CEllipse : public CShapepublic: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;
33、/橢圓中心點(diǎn) Draw(CDC* pDC); / 重新定義 Draw 函數(shù) virtual CEllipse();在該類 app 中添加如下代碼 :CEllipse:CEllipse()center_point.x=0; /將中心點(diǎn)橫坐標(biāo)初始為 0 center_point.y=0; /將中心點(diǎn)縱坐標(biāo)初始為 0 width=0; /將外接矩形寬度初始為 0 height=0; /將外接矩形高度初始為 0 CEllipse:CEllipse(int x,int y,int w,int h)center_point.x=x; /將傳入的 x 值賦給中心點(diǎn)的橫坐標(biāo) center_point.y=y;
34、 /將傳入的 y 值賦給中心點(diǎn)的縱坐標(biāo) width=w; / 將傳入的 w 值賦給寬度 height=h; /將傳入的 h 值賦給高度CEllipse:Draw(CDC* pDC) pDC-Ellipse(center_point.x-width,center_point.y-height,c enter_point.x+width,center_point.y+height);利用 Ellipse。函數(shù)畫 橢圓在 CMyDraw2_0View 的頭文件中引入橢圓類,#include “Ellipse.h” 添加私有變量,創(chuàng)建橢圓類的指針變量 :CEllipse *ellipse;2.6 正四
35、邊形類的創(chuàng)建及定義命名為CQuadrangle,頭文件中添加如下代碼: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); / 重新定義 Draw 函數(shù) virtual CQuadrangle();在該類 app 中添加如下代碼 :CQuadrangle:CQuadrangle()cPoint.x=0; /將中心點(diǎn)的橫坐標(biāo)初始為 0cPoint.y=0;
36、/將中心點(diǎn)的縱坐標(biāo)初始為 0Radius=0; /將外接圓的半徑初始為 0CQuadrangle:CQuadrangle(int x,int y,int radius)cPoint.x=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 度余弦 值的乘積賦給 RcPOINT pts=cPoint.x+Rc,cPoint.y+Rc,c
37、Point.x+Rc,cPoint.y-Rc,cPoint.x-Rc,cPoint.y- Rc,cPoint.x-Rc,cPoint.y+Rc; / 定義點(diǎn)數(shù)組,儲存四個(gè)頂點(diǎn)pDC-Polygo n(pts,4);利用多邊形繪畫函數(shù)畫正四邊形在 CMyDraw2_0View 的頭文件中引入正四邊形類,#include “Quadrangle.h” 添加私有變量,創(chuàng)建正四邊形類的指針變量 :CQuadrangle *quadrangle;2.7 正六邊形的創(chuàng)建及定義命名為CRegularHexagon,頭文件中添加如下代碼:public:CQuadrangle();CQuadrangle(int
38、 x,int y,int radius=0);帶參數(shù)的構(gòu)造 函數(shù),參數(shù)分別為中心點(diǎn)的橫坐標(biāo)、縱坐標(biāo)、外接圓半徑int Radius;/外接圓半徑CPoi nt cPoi nt; 中心點(diǎn) Draw(CDC* pDC);/ 重新定義 Draw 函數(shù) virtual CQuadrangle();在該類app中添加如下代碼:CRegularHexagon:CRegularHexagon()cp.x=0;/ 將中心點(diǎn)的橫坐標(biāo)初始為 0cp.y=0;/ 將中心點(diǎn)的縱坐標(biāo)初始為 0Radius=O;/將外接圓的半徑初始為0CRegularHexagon:CRegularHexagon(int x,int y
39、,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)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
40、(60*PI/1 80);/將半徑與 60度余 弦值的乘積賦給 RcPOINTpts=cp.x+rs,cp.y+rc,cp.x-rs,cp.y+rc,cp.x-Radius,cp.y,cp.x-Rc,cp.y-Rs,c p.x+Rc,cp.y-Rs,cp.x+Radius,cp.y;/定義點(diǎn)數(shù)組pts,儲存正六邊形的六個(gè)頂點(diǎn)pDC-Polygo n(pts,6);利用多邊形繪畫函數(shù)畫出正六邊形在 CMyDraw2_0View 的頭文件中引入正六邊形類,#include “RegularHexagon.h”添加私有變量,創(chuàng)建正六邊形類的指針變量 :CRegularHexagon* regular
41、hexagon;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)Draw(CDC* pDC);/ 重新定義 Draw 函數(shù)CPoint p_start; /定義直線起點(diǎn) CPoi nt p_e nd;/定義直線終點(diǎn) virtual CLine();在該類app中添加如下代碼:CLine:CLine()p_start.x=O;將起點(diǎn)橫坐標(biāo)初始為0p_start.y=O;將起點(diǎn)縱坐標(biāo)初始為0p_en
42、d.x=0;/將終點(diǎn)橫坐標(biāo)初始為0 p_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=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-Li neTo(p_e nd);/ 利用 Lin eTo()函數(shù)從起點(diǎn)畫 直線到終點(diǎn)在 CMyDra
43、w2_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)繪圖的過程是 :鼠標(biāo)左鍵按下 -鼠標(biāo)移動(dòng) -鼠標(biāo)左鍵彈起 在此,引入鼠標(biāo)的三個(gè)響應(yīng)函數(shù),分別對應(yīng)該三個(gè)過程按下ctrl+w,彈出如圖所示對話框,并按如圖操作,MFC ClmwsWimRI VIM e ssa ge MapsMe mb er Va riables | Autom atio nActiveX Lvie
44、 nteClaes IntoProject:Chss umne:Add Clfl3.n專MyDrawJJf CMyDrawUViEWl 1D:V- AMyOraw2 CVi ew. hd 九.M/DraUVitw.cppAdd FuroctirnObject IDs;Delete FuinctionCMvDraw? QViewWM LeunONDQLCLJKID ADD COIN1 WM 1 nUTTONDOWNtdit LodeID APP AHOUTWM 1 RUTTONUPID APP EXITWM MOUSEMOVEID_DRAW_CIRCLE:WM_MOUSFWHEEIID DHAW
45、 DELIAWM MUVkID-Druw LINEWM PAI MTMember furctiQiiG:W OtiDriwUiit ON_ID_DFWW_UNL:COMMANDW OiiDrwREUanylE: ON J D_DRAW_RECTANGLR COMMANDV OrEndPrintingW OnEroacrON. ID_ERASER:COMMANDOnLDuttonDon ON WW LDLTTTONDOWNDescriplion; Indicates wihem Heft mouse bulton is upreecfd選擇右側(cè)的Add Function(本應(yīng)是黑色,由于已添加,
46、變?yōu)榛疑?,將三個(gè) 響應(yīng)函數(shù)添加到 CMyDraw2_0View 類app中?,F(xiàn)在,需要告訴鼠標(biāo),當(dāng)鼠標(biāo)左鍵按下時(shí)開始進(jìn)行繪畫,那么,需要添 加一個(gè)變量,告訴鼠標(biāo)是否進(jìn)行繪畫:為View類添加私有成員變量:bool mDow n;在View類的構(gòu)造函數(shù)中對該值進(jìn)行初始化,代碼如下:CMyDraw2_0View:CMyDraw2_0View() 一 一/ TODO: add con struct ion code here mDown=false;將 mDown 初始為 false,表示默 認(rèn)為不進(jìn)行繪畫在鼠標(biāo)左鍵按下的響應(yīng)函數(shù)中添加如下代碼:Void CMyDraw2_0View:O nLBu
47、tto nDow n( UINT nFlags, CPoi nt poi nt) _mDown=true;將mDown標(biāo)記為true,表示此時(shí)即將開始繪畫在鼠標(biāo)左鍵彈起的響應(yīng)函數(shù)中添加如下代碼:void CMyDraw2_0View:O nLButto nUp(UINT nFlags, CPoi nt poi nt) 一mDown=false;/將mDown重新標(biāo)記為false表明此時(shí)應(yīng)停止繪畫在鼠標(biāo)移動(dòng)時(shí)判斷鼠標(biāo)是否按下,如果按下則開始進(jìn)行繪畫:void CMyDraw2_0View:O nM ouseMove(UINT nFlags, CPoi nt poi nt) _if(mDow n)
48、此處添加繪畫代碼(下面會(huì)說到)到此,對鼠標(biāo)是否進(jìn)行繪畫的判斷已完成,接下來,需要告訴鼠標(biāo)畫出的圖形 應(yīng)該是矩形,不妨設(shè)一個(gè)變量用來儲存類型:在View類中添加私有成員變量:int Sh apeType;/該變量用來儲存圖形類型在View類構(gòu)造函數(shù)中進(jìn)行該變量的初始化:ShapeType=-1;/默認(rèn)為-1,表示為標(biāo)的隨手畫(下面 會(huì)提到)為View類添加菜單中矩形的響應(yīng)函數(shù):同樣按下Ctrl+W,在彈出的對話框中如下選擇 圖中,藍(lán)色條中的字符為在資源編輯時(shí)定義的矩形的 ID ,同樣選擇 Add Functioin,在View類中出現(xiàn)如下代碼:Message MapsMemLer Variabl
49、esActiveX EventsClass InfoMvDrw? 0CMyDrowf OVicwD:l,AMyD raw2_0VI rw. It D:l.lMyDraw2_nVI ew. rp plijert IDs:IU MENU GRAPHuhi卜亠C0MMAN1JIU MtNU GRAPHPCLYGUN DtLIAUPDAIt COMMAND U)IU MtNU GRAPHPOLYGON PEMTAIIU MENU GRAPHKJLYGON QUADP10 MENU GRAPHPOLYGON REGULID MENU GRAPHRECTANGLESfl|IO_ ME N U_PEN_C
50、OLO n_CUSIO MMennbcr functions:W QnMdCcinOh ID ADD CO|N:C0MMAMDjkV OnHpginIJrinfjnfluV OnDrdiHW OnDrawCircleON_I DDRAW_C IRC Lfc: COMMANDW OnDrawDcItaOhl ID draw delt&cdmmandwnmoj c ct:Dcscri plion:Class name:片dd Claes,. Add runetjo nFuncTinraLdrt Codevoid CMyDraw2_0View:OnMenuGraphRectangle()/ TODO
51、: Add your command handler code here在該函數(shù)中添加如下代碼 :ShapeType=2;/用2來代表矩形 這樣,就能用數(shù)字來表示各個(gè)基本形狀了 有了這個(gè)變量后,在鼠標(biāo)左鍵按下時(shí),首先判斷該變量是否為-1(因?yàn)槌跏紴?-1,對應(yīng)的是隨手畫),假如不是,則對ShapeType的值進(jìn)行判斷,用switch函數(shù)進(jìn) 行相應(yīng)的操作 :在鼠標(biāo)左鍵按下的相應(yīng)函數(shù)中添加如下代碼 : if(ShapeType!=-1)判斷當(dāng)前的 ShapeType值是否為-1switch(ShapeType)/對當(dāng)前傳入的ShapeType值進(jìn)行選擇,分 別進(jìn)行隊(duì)形的操作 當(dāng)然,畫矩形需要給矩形
52、類傳入矩形的左上角坐標(biāo)和右下角坐標(biāo), 在繪圖時(shí)對應(yīng) 的就是鼠標(biāo)按下時(shí)的坐標(biāo) (我們把它叫做起始點(diǎn) )、鼠標(biāo)移動(dòng)時(shí)的坐標(biāo) (我們把它叫 做終點(diǎn) ),這樣,需要用兩個(gè)變量來存儲這兩個(gè)點(diǎn) :在 View 類中添加私有成員變量 :CPoi nt pon it_start;用來存儲起點(diǎn)CPoi nt poi nt_en d;/用 來存儲終點(diǎn) 在鼠標(biāo)左鍵按下的響應(yīng)函數(shù)中添加以下代碼 :point_start=point;將鼠標(biāo)按下時(shí)的點(diǎn)存儲在 point_start中 poi nt_en d.x=0;將鼠標(biāo)移動(dòng)時(shí)的點(diǎn)橫坐標(biāo)賦值為 0 poi nt_en d.y=0;將鼠標(biāo)移動(dòng)時(shí)的點(diǎn)縱坐標(biāo)賦值為 0最后,一
53、切準(zhǔn)備就緒,該進(jìn)行矩形的繪畫了 :矩形對應(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è)矩形對象,將該地址存儲在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ù)中也要對 ShapeType值作出判斷,告訴鼠標(biāo)該進(jìn)行矩形的 繪畫,方法與前面類似 :在該函數(shù)的開頭添加如下代碼 :CDC* pDC=GetDC();打開圖形設(shè)備接口,簡單來說,就是用 pDC來進(jìn) 行繪畫在 if(mDown) 中添加如下代碼 : switch(ShapeType) case 2:pDC-SetROP2(R2_NOTXORPEN); 將顏色設(shè)置為反if(poi nt_en d.x!=O)判斷鼠標(biāo)是否移動(dòng)了Draw 函數(shù)rectangle-Draw(pDC);調(diào)用矩形類中的
溫馨提示
- 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. 人人文庫網(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年健身中心租賃合同及健身俱樂部會(huì)員制運(yùn)營協(xié)議
- 二零二五年度村委會(huì)與某健身俱樂部簽訂場地租賃合同
- 2025年度船舶保險(xiǎn)代理股份合作協(xié)議
- 二零二五年度金融投資分析與風(fēng)險(xiǎn)管理商務(wù)咨詢服務(wù)協(xié)議
- 四川鑫耀產(chǎn)城融合產(chǎn)業(yè)投資發(fā)展集團(tuán)有限公司2024年12月對外公開招聘管理人員及專業(yè)工作人員筆試參考題庫附帶答案詳解
- 2025鄂爾多斯高新技術(shù)產(chǎn)業(yè)開發(fā)區(qū)市融媒體中心招聘控制數(shù)人員35人筆試參考題庫附帶答案詳解
- 2025福建龍巖市人力資源服務(wù)有限公司招聘6人筆試參考題庫附帶答案詳解
- 酒類釀制知識培訓(xùn)課件
- 交通中國知到智慧樹章節(jié)測試課后答案2024年秋上海工程技術(shù)大學(xué)
- 2025年云南中煙工業(yè)有限責(zé)任公司招聘(430人)筆試參考題庫附帶答案詳解
- 本特利探頭應(yīng)用
- 城市雕塑藝術(shù)工程工程量計(jì)價(jià)清單定額2022年版
- QMR-110-00員工手部、接觸面等微生物檢驗(yàn)記錄記錄
- 2022年河北醫(yī)科大學(xué)第一醫(yī)院醫(yī)護(hù)人員招聘考試筆試題庫及答案解析
- 思想道德與法治教案第四章:明確價(jià)值要求踐行價(jià)值準(zhǔn)則
- 寧騷版《公共政策學(xué)》課后答案
- 外陰及陰道炎癥
- (綜合治理)修復(fù)工程指南(試行) - 貴州省重金屬污染防治與土壤修復(fù)網(wǎng)
- 公安筆錄模板之詢問嫌疑人(書面?zhèn)鲉局伟舶讣?
- A-level項(xiàng)目介紹(課堂PPT)
- 故障診斷技術(shù)的國內(nèi)外發(fā)展現(xiàn)狀(共3頁)
評論
0/150
提交評論