




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 M F C簡單的繪圖程序 王帥 目錄摘要2關鍵字21 引言2設計目的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 功能的實現(xiàn)53.1 視圖設計53.2 編輯資源6 3.3 編程思路及各個函數的實現(xiàn)7 (1)思路7 (2)代碼的實現(xiàn)7 1.為基本形狀創(chuàng)建一個基類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.
2、8直線類的創(chuàng)建及定義19 3.各基本形狀類在CMyDraw2_0類中的調用和繪圖的實現(xiàn)20 3.1矩形類的調用與與繪圖的實現(xiàn)20 3.2圓形類的調用24 3.3正三角形類的調用25 3.4基本類型調用的剩余代碼26 4.畫筆的使用、顏色及大小的調整29 5.畫硬幣35 6.工具欄中的自定義控件38 7.狀態(tài)欄中的顯示394程序功能的測試415最后總結42摘要:本繪圖程序能夠進行基本圖形的繪畫,如直線,圓,矩形,三角形等等,并且在此基礎上添加了多邊形的繪畫,如正五邊形等。除此之外,還能夠進行隨手畫,即用鼠標隨意畫線條。為了更好的繪圖,還添加了對畫筆粗細的調整,以及對畫筆顏色的調整,除了特定的顏色
3、,顏色還可根據輸入的RGB值隨意更改。還有一些老師的要求,加入了畫硬幣、顯示硬幣數目即鼠標坐標等信息。本程序主要采用面向對象寫法。關鍵字:程序設計,MFC,繪圖1. 引言設計目的本繪圖程序的設計不僅僅局限于老師課堂的要求,通過C+的編寫實現(xiàn)繪圖要求,我還想要在此基礎上,加入自己的一些想法,想要更好地了解MFC,更好地去實現(xiàn)自己的想法。2. 功能說明 2.1菜單欄2.1.1圖形圖形欄中包括直線、矩形、圓形、橢圓、多邊形,多邊形中包括正三角形、正四邊形、正五邊形、正六邊形。選擇直線,可用鼠標拖動畫出一條直線選擇矩形,可用鼠標拖動畫出矩形選擇圓形,可用鼠標拖動畫出圓形 選擇橢圓,可用鼠標拖動畫出橢圓
4、選擇正三角形,可用鼠標拖動畫出正三角形選擇正四邊形,可用鼠標拖動畫出正方形選擇正五邊形,可用鼠標拖動畫出正五邊形選擇正六邊形,可用鼠標拖動畫出正六邊形(注:為了驗證自己的想法以及想讓畫出的圖形隨意地變換方向,特意在正三角形一項中加入了旋轉效果,使鼠標在拖動時能旋轉三角形)2.1.2畫筆 畫筆欄中包括顏色、大小及鉛筆 (1)顏色 顏色中包括黑色、紅色、綠色、藍色、橙色、黃色、青色、紫色、粉色、 自定義 選擇黑色,畫出的圖形將為黑色 選擇紅色,畫出的圖形將為紅色 選擇綠色,畫出的圖形將為綠色 選擇橙色,畫出的圖形將為橙色 選擇黃色,畫出的圖形將為黃色 選擇青色,畫出的圖形將為青色 選擇紫色,畫出的
5、圖形將為紫色 選擇粉色,畫出的圖形將為粉色 選擇自定義,可輸入RGB值,畫出的圖形將顯示輸入的顏色 (2)大小 大小中包括1、2、3、4、5、6、7 選擇1,畫筆大小設為1 選擇2,畫筆大小設為2 選擇3,畫筆大小設為3 選擇4,畫筆大小設為4 選擇5,畫筆大小設為5 選擇6,畫筆大小設為6 選擇7,畫筆大小設為7 (3)鉛筆 選中鉛筆后,將可以用鼠標進行隨意畫線 2.1.3畫硬幣 畫硬幣中包括畫、增加、減少、清除 選擇畫,將在客戶端窗口中畫出初始數量為10的硬幣 選擇增加,窗口中的硬幣數目將增加1個 選擇減少,窗口中的硬幣數目將減少1個 選擇清除,刷新窗口,將硬幣消去 2.2工具欄 工具欄中
6、除了原有的圖標外,還加入了自定義的圖標選擇,可用鼠標拖動畫出一條直線選擇,可用鼠標拖動畫出矩形選擇,可用鼠標拖動畫出圓形選擇,可用鼠標拖動畫出正三角形選擇,可用鼠標進行隨手畫選擇,可在窗口畫出硬幣后,將硬幣數量+1選擇,可在窗口畫出硬幣后,將硬幣數量-1選擇,可利用鼠標對所繪圖形進行擦除,橡皮擦的大小與畫筆大小相同 2.3狀態(tài)欄 狀態(tài)欄中除了原有的顯示外,還加入了硬幣的數量以及鼠標的x坐標和y坐標3. 功能的實現(xiàn) 3.1視圖設計 利用MFC 生成畫圖應用程序框架具體步驟如下:(1)執(zhí)行VC程序,選擇File|New命令,彈出New對話框.單擊Projects標簽,轉到Projects選項卡,選
7、擇MFC AppWizard(exe)選項,然后在Project name文本框中輸入MyDraw2_0(原來也做過一個,不過并沒有以面向對象的寫法去寫,這個就當作是我的第二個版本),文本框是指項目的本地路徑。(2)由于本程序是實現(xiàn)畫線,要在視圖中完成,所以首先創(chuàng)建一個基于單文檔的應用程序 3.2編輯資源(1) 利用ResourceView中的Menu編輯器在菜單欄添加菜單,該流程圖如下3.2所示: 圖3.2(2) 利用ResourceView中的ToolBar編輯器,在工具欄中添加自定義控件。控件圖案如下所示: 3.3編程思路及各個函數的實現(xiàn)(1)思路:首先,畫定義好的形狀。直線、矩形、圓形
8、等等都屬于基本的形狀,那么我設定一個基類,稱它為CShape,給這個基類定義一個畫畫的虛函數Draw(CDC *pDC),在這個類里面派生出各個需要的類,如CCircle類,并為這些派生類定義各自的屬性及方法,重寫基類的Draw函數。當我需要用到這些類的時候,只需要在View類里創(chuàng)建指針,然后調用里面Draw方法。由于是當鼠標拖動的時候畫出所需的圖形,需要添加鼠標響應函數,onLButtonDown(),onLButtonUp,以及onMouseMove()。畫畫主要是在onMouseMove()里實現(xiàn)。接著,是畫筆的顏色和大小,本來是想單獨創(chuàng)建一個畫筆類,定義顏色和大小屬性,使CCircle
9、等派生類多繼承,在繼承一個畫筆類,但嘗試了幾遍,發(fā)現(xiàn)在菜單里選擇顏色時就會使程序停止運行,于是就放棄了。重新構思之后,由于畫圖是在CMyDraw2_0里實現(xiàn)的,就直接在CMyDraw2_0中定義了顏色和大小的變量,這樣也方便。然后是畫硬幣。并沒有為這個創(chuàng)建單獨的類,直接在CMyDraw2_0中的OnDraw()中畫硬幣,并且在CMyDraw2_0中添加了增加和減少硬幣的方法。工具欄中只要和為各個圖標添加函數,作用和菜單欄中的圖形一欄中對應即可。最后還有硬幣的數量和鼠標坐標放在狀態(tài)欄中顯示,下面開始進行函數代碼的實現(xiàn)。(2) 代碼的實現(xiàn):1. 為基本形狀創(chuàng)建一個基類,命名為CShape。在Cla
10、ssViewz中右鍵點擊MyDraw2_0 classes->new class,在彈出窗口的頂部下拉框中選擇Generic Class,如圖所示在頭文件中添加虛函數Draw(CDC *pDC)public:CShape();virtual Draw(CDC* pDc)=0;/添加的虛函數virtual CShape();2. 基本形狀類的創(chuàng)建(注:以矩形、圓形、正五邊形、正三邊形為重點介紹) 2.1矩形類的創(chuàng)建及定義創(chuàng)建一個矩形類,繼承CShape類,如圖在該類中重新定義畫畫函數Draw(),并添加帶參數的構造函數,矩形的左上角,以及矩形的寬度和高度,代碼如下:Public: CRec
11、tangle();Draw(CDC* pDC); /重新定義Draw函數CPoint point_LeftUp; /矩形的左上角坐標CRectangle(int x,int y,int w=0,int h=0);/帶參數的構造函數,x表示左上角的橫坐標,y表示左上角的縱坐標int width; /矩形的寬度int height; /矩形的高度virtual CRectangle(); 在無參數構造函數中初始化point_LeftUp的坐標和寬度以及高度的值,代碼如下: CRectangle:CRectangle()point_LeftUp.x=0; /左上角坐標x值設置為0point_Left
12、Up.y=0; /左上角坐標x值設置為0width=0; /矩形的寬度初始為0height=0; /矩形的高度初始為0 在帶參數的構造函數中將值賦給point_LeftUp和寬度以及高度,代碼如下: point_LeftUp.x=x; /將傳入的x值賦給左上角坐標的x值point_LeftUp.y=y; /將傳入的y值賦給左上角坐標的y值width=w;/將傳入的w值賦給widthheight=h;/將傳入的h值賦給height 重寫Draw(CDC* pDC)函數,代碼如下:CRectangle:Draw(CDC* pDC)pDC->Rectangle(point_LeftUp.x,p
13、oint_LeftUp.y,point_LeftUp.x+width, point_LeftUp.y+height); /利用Rectangle()函數畫出矩形,其中的值分別為矩形的左上角橫坐標,左上角縱坐標,右下角橫坐標,右下角縱坐標在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)建矩形類的指針: 右鍵點擊CMyDraw2_0View,選擇Add Member Variable, 在彈出的對話框中如下輸入: 將在CMyDraw2_0View頭文件中出現(xiàn)如下代碼Private:CRectangle *rectangle;/定義指向矩形類的指針, 為私有變量2.2圓形類的創(chuàng)建及定義創(chuàng)建一個圓形類,命名為CCi
15、rcle,繼承CShape類,在該類中添加公有成員變量,代碼如下:public:CCircle();CCircle(int x,int y,int radius=0);/帶參數的構造函數,其中,x表示圓心的x值,y表示圓心的y值,radius表示圓的半徑Draw(CDC* pDC); /重新定義Draw函數virtual CCircle();int Radius; /定義圓的半徑CPoint center_point; /定義圓的中心點在無參數的構造函數中初始化變量值,代碼如下:CCircle:CCircle()center_point.x=0; /圓心的橫坐標初始為0center_point
16、.y=0; /圓心的縱坐標初始為0Radius=0; /圓的半徑初始為0 在帶參數的構造函數中將傳入的值賦給各變量,代碼如下:CCircle:CCircle(int x,int y,int radius)center_point.x=x; /將傳入的x值賦給圓心的橫坐標center_point.y=y; /將傳入的y值賦給圓心的縱坐標Radius=radius; /將傳入的radius值賦給圓的半徑 重寫定義的Draw函數,代碼如下:CCircle:Draw(CDC* pDC)pDC->Ellipse(center_point.x-Radius,center_point.y-Radius
17、,center_point.x+Radius,center_point.y+Radius);/利用Ellipse()函數進行圓的繪制,其中的值分別為圓的外接正方形的左上角橫坐標、縱坐標,右下角橫坐標、縱坐標在CMyDraw2_0View中引入圓形類的頭文件: #include "Circle.h"添加私有成員變量,創(chuàng)建圓形類的指針變量: CCircle *circle; /創(chuàng)建圓形類的指針,可以直接寫在矩形類只針對下方2.3正五邊形類的創(chuàng)建及定義 創(chuàng)建一個正五邊形類,命名為CPentangle,繼承CShape類, 在該類中添加公有成員變量,代碼如下:public:CPen
18、tangle();CPentangle(int x,int y,int radius=0);/帶參數的構造函數,x為外接圓圓心的橫坐標,y為外接圓圓心的縱坐標,radius為外接圓的半徑int Radius; /定義外接圓半徑CPoint cP; /定義外接圓圓心Draw(CDC* pDC); /重新定義Draw函數virtual CPentangle();在無參數的構造函數中初始化各變量,代碼如下:CPentangle:CPentangle()cP.x=0; /圓心橫坐標初始為0cP.y=0; /圓心縱坐標初始為0Radius=0; /外接圓半徑初始為0在帶參數的構造函數中將傳入的值賦給各變
19、量,代碼如下:CPentangle:CPentangle(int x,int y,int radius)cP.x=x; /將傳入的x值賦給圓心的橫坐標cP.y=y; /將傳入的y值賦給圓心的縱坐標Radius=radius; /將傳入的radius值賦給外接圓半徑下面重寫的Draw函數與前兩個不同,需要用到數學函數cos()以及sin(),由于兩個函數用的是弧度制,還需引入數學變量PI,為了能夠順利的寫入這些函數,需要在CPentangle類的客戶端中引入數學類的頭文件:雙擊ClassView中的CPentangle(),在出現(xiàn)的構造函數上方,在如下代碼/ Pentangle.cpp: imp
20、lementation of the CPentangle class./#include "stdafx.h"#include "MyDraw2_0.h"#include "Pentangle.h" 下添加數學類頭文件:#include “math.h” 再定義一個宏變量PI,添加如下代碼:#define PI 3.1415926 開始重寫Draw(CDC* pDC)函數,代碼如下: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;/利用點類的數組將五個點儲存在點數組pts中pDC->P
22、olygon(pts,5); /利用函數Polygon()進行多邊形的繪畫,其中pts為儲存的點,5為點的個數下面對Draw函數中各數據進行深層次的分析,表明它們的來歷:如圖所示:以外接圓圓心為坐標軸中心,設該點的坐標為(cP.x,cP.y);則右下角的坐標為cP.x+R*sin(36*PI/180),cP.y+R*cos(36*PI/180)按順時針方向看,接下去的幾個點的坐標分別為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*co
23、s(18*PI/180),cP.y-R*sin(18*PI/180)以上為正五邊形5個點的來歷,接下來在CMyDraw2_0View中引入正五邊形類的頭文件: #include “Pentangle.h”添加一個私有變量,創(chuàng)建指向正五邊形的指針變量: CPentangle *pentangle; 2.4正三角形類的創(chuàng)建及定義(這個類中添加了旋轉)創(chuàng)建一個正三角形類,命名為CDelta,繼承CShape類,在該類中添加公有成員變量,代碼如下:public:CDelta();CDelta(int x,int y,int radius=0); /帶參數的構造函數,其中x為外接圓圓心的橫坐標,y為外接
24、圓圓心的縱坐標,radius為外接圓半徑int Radius; /外接圓半徑CPoint cp; /外接圓圓心double theta; /在正三角形原圖上旋轉過的角度double st; /該變量儲存的是sin(theta)double ct; /該變量儲存的事cos(theta)Draw(CDC* pDC); 重新定義Draw函數virtual CDelta();在無參數構造函數中初始化變量,代碼如下: CDelta:CDelta()cp.x=0; /圓心的橫坐標初始為0cp.y=0; /圓心的縱坐標初始為0Radius=0; /外接圓半徑初始為0 在帶參數構造函數中將傳入的值賦給各變量,
25、代碼如下:CDelta:CDelta(int x,int y,int radius)cp.x=x; /將傳入的x值賦給圓心的橫坐標cp.y=y; /將傳入的y值賦給圓心的縱坐標Radius=radius; /將傳入的radius值賦給外接圓半徑ct=1; /調用該函數時將cos(theta)設置為1st=0; /調用該函數時將sin(theta)設置為0與正五邊形相同,要引入數學類的頭文件以及定義宏變量PI,#include “math”#define PI 3.1415926 開始重寫定義的Draw(CDC* pDC)函數,代碼如下:CDelta:Draw(CDC* pDC)double r
26、c=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; /定義兩個點(接下來會詳細說明)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;dx1
27、1.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;/定義點數組,存儲正三角形的三個點pDC->
28、Polygon(pts,3);/利用畫多邊形的函數Polygon()畫正三角形,pts為儲存的三個點,3為點的個數接下來對Draw函數里的變量以及運算進行解釋:R如圖所示,正三角形的中心到各頂點的距離為半徑,設中心點的坐標為(cp.x,cp.y),則可得到右下角的坐標為cp.x+R*sin(60*PI/180),cp.y+R*cos(60*PI/180)按順時針方向,接下來兩個點的坐標分別為cp.x-R*sin(60*PI/180),cp.y-R*cos(60*PI/180)cp.x,cp.x-R此時,我們得到了三個頂點的坐標,如果按這三個點的坐標畫圖,就會得到如圖所示的三角形,在此基礎上,不
29、妨設此圖形逆時針轉過的角度為,有以下原理作為基礎:設一個點的坐標為(x1,y1),它繞另一個點(x2,y2)旋轉角,得到新的點的坐標為:x=(x1-x2)*cos-(y1-y2)*sin+x2;y=(y1-y2)*cos+(x1-x2)*sin+y2;顯然,只需得到三個點繞中心旋轉后各自的新坐標,我們就可以根據旋轉的角得到新的正三角形在Draw(CDC * pDC)函數中,用theta來代替,以右下角頂點為例,原坐標為cp.x+rs,cp.y+rc按如下代碼將cos(theta)和sin(theta)替換:ct=cos(theta);st=sin(theta);用dx3.x儲存該點與中心點橫坐
30、標的差dx3.y儲存該點與中心點縱坐標的差,如下:dx3.x=cp.x+rs-cp.x;dx3.y=cp.y+rc-cp.y; 用dx33儲存該點旋轉后得到的新的坐標:dx33.x=dx3.x*ct-dx3.y*st+cp.x;dx33.y=dx3.y*ct+dx3.x*st+cp.y;這樣就得到了該點旋轉后的坐標,其它兩點按同樣方法即可得到新坐標,dx22為左下角的新坐標,dx11為正上方的新坐標接下來,在CMyDraw2_0View的頭文件中引入正三角形類,#include “Delta.h”添加私有變量,創(chuàng)建正三角形類的指針變量:CDelta* delta;接下來我直接給出剩下基本形狀類
31、的代碼(只在當中作注釋,不再詳細解釋)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); /帶參數的構造函數,值分別為外接矩形左上角的橫坐標、縱坐標、寬度、高度int width; /外接矩形的寬度int height; /外接矩形的高度CPoint center_point; /橢圓中心點Draw(CDC* pDC); /重新定義Draw函數virtual CEllipse
32、();在該類app中添加如下代碼:CEllipse:CEllipse()center_point.x=0; /將中心點橫坐標初始為0center_point.y=0; /將中心點縱坐標初始為0width=0; /將外接矩形寬度初始為0height=0; /將外接矩形高度初始為0CEllipse:CEllipse(int x,int y,int w,int h)center_point.x=x; /將傳入的x值賦給中心點的橫坐標center_point.y=y; /將傳入的y值賦給中心點的縱坐標width=w; /將傳入的w值賦給寬度height=h; /將傳入的h值賦給高度CEllipse:D
33、raw(CDC* pDC)pDC->Ellipse(center_point.x-width,center_point.y-height,center_point.x+width,center_point.y+height);/利用Ellipse()函數畫橢圓在CMyDraw2_0View的頭文件中引入橢圓類,#include “Ellipse.h”添加私有變量,創(chuàng)建橢圓類的指針變量:CEllipse *ellipse;2.6正四邊形類的創(chuàng)建及定義命名為CQuadrangle,頭文件中添加如下代碼:public:CQuadrangle();CQuadrangle(int x,int y,
34、int radius=0); /帶參數的構造函數,參數分別為中心點的橫坐標、縱坐標、外接圓半徑int Radius; /外接圓半徑CPoint cPoint; /中心點Draw(CDC* pDC); /重新定義Draw函數virtual CQuadrangle();在該類app中添加如下代碼: CQuadrangle:CQuadrangle()cPoint.x=0; /將中心點的橫坐標初始為0cPoint.y=0; /將中心點的縱坐標初始為0Radius=0; /將外接圓的半徑初始為0CQuadrangle:CQuadrangle(int x,int y,int radius)cPoint.x
35、=x; /將傳入的x值賦給中心點的橫坐標cPoint.y=y; /將傳入的y值賦給中心點的縱坐標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; /定義點數組,儲存四個頂點pDC->Polygon(pts,4
36、);/利用多邊形繪畫函數畫正四邊形在CMyDraw2_0View的頭文件中引入正四邊形類,#include “Quadrangle.h”添加私有變量,創(chuàng)建正四邊形類的指針變量:CQuadrangle *quadrangle;2.7正六邊形的創(chuàng)建及定義命名為CRegularHexagon,頭文件中添加如下代碼:public:CQuadrangle();CQuadrangle(int x,int y,int radius=0);/帶參數的構造函數,參數分別為中心點的橫坐標、縱坐標、外接圓半徑int Radius;/外接圓半徑CPoint cPoint;/中心點Draw(CDC* pDC);/重新定
37、義Draw函數virtual CQuadrangle();在該類app中添加如下代碼:CRegularHexagon:CRegularHexagon()cp.x=0;/將中心點的橫坐標初始為0cp.y=0;/將中心點的縱坐標初始為0Radius=0;/將外接圓的半徑初始為0CRegularHexagon:CRegularHexagon(int x,int y,int radius)cp.x=x;/將傳入的x值賦給中心點的橫坐標cp.y=y;/將傳入的y值賦給中心點的縱坐標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+Rad
39、ius,cp.y;/定義點數組pts,儲存正六邊形的六個頂點pDC->Polygon(pts,6);/利用多邊形繪畫函數畫出正六邊形在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);/帶參數的構造函數,分別為直線起點的橫坐標、縱坐標,終點的橫坐標、縱坐標D
40、raw(CDC* pDC);/重新定義Draw函數CPoint p_start; /定義直線起點CPoint p_end;/定義直線終點virtual CLine();在該類app中添加如下代碼: CLine:CLine()p_start.x=0;/將起點橫坐標初始為0p_start.y=0;/將起點縱坐標初始為0p_end.x=0;/將終點橫坐標初始為0p_end.y=0;/將終點縱坐標初始為0CLine:CLine(int sx,int sy,int ex,int ey)p_start.x=sx;/將sx的值賦給起點的橫坐標p_start.y=sy;/將sy的值賦給起點的縱坐標p_end.
41、x=ex;/將ex的值賦給終點的橫坐標p_end.y=ey;/將ey的值賦給終點的縱坐標CLine:Draw(CDC* pDC)pDC->MoveTo(p_start);/利用MoveTo()函數畫出直線起點pDC->LineTo(p_end);/利用LineTo()函數從起點畫直線到終點在CMyDraw2_0View的頭文件中引入直線類,#include “Line.h”添加私有變量,創(chuàng)建直線類的指針變量:CLine* line;3. 各基本形狀類在CMyDraw2_0View類中的調用與繪圖的實現(xiàn) (注:以矩形、圓形、正三角形為重點介紹) 3.1矩形類的調用與與繪圖的實現(xiàn)繪圖的
42、過程是:鼠標左鍵按下->鼠標移動->鼠標左鍵彈起在此,引入鼠標的三個響應函數,分別對應該三個過程:按下ctrl+w,彈出如圖所示對話框,并按如圖操作,選擇右側的Add Function(本應是黑色,由于已添加,變?yōu)榛疑?,將三個響應函數添加到CMyDraw2_0View類app中?,F(xiàn)在,需要告訴鼠標,當鼠標左鍵按下時開始進行繪畫,那么,需要添加一個變量,告訴鼠標是否進行繪畫:為View類添加私有成員變量:bool mDown;在View類的構造函數中對該值進行初始化,代碼如下:CMyDraw2_0View:CMyDraw2_0View()/ TODO: add constructi
43、on code heremDown=false;/將mDown初始為false,表示默認為不進行繪畫 在鼠標左鍵按下的響應函數中添加如下代碼:Void CMyDraw2_0View:OnLButtonDown(UINT nFlags, CPoint point) mDown=true;/將mDown標記為true,表示此時即將開始繪畫 在鼠標左鍵彈起的響應函數中添加如下代碼:void CMyDraw2_0View:OnLButtonUp(UINT nFlags, CPoint point) mDown=false;/將mDown重新標記為false,表明此時應停止繪畫 在鼠標移動時判斷鼠標是否
44、按下,如果按下則開始進行繪畫:void CMyDraw2_0View:OnMouseMove(UINT nFlags, CPoint point) if(mDown)/此處添加繪畫代碼(下面會說到) 到此,對鼠標是否進行繪畫的判斷已完成,接下來,需要告訴鼠標畫出的圖形應該是矩形,不妨設一個變量用來儲存類型:在View類中添加私有成員變量:int ShapeType;/該變量用來儲存圖形類型 在View類構造函數中進行該變量的初始化: ShapeType=-1;/默認為-1,表示為標的隨手畫(下面會提到)為View類添加菜單中矩形的響應函數: 同樣按下Ctrl+W,在彈出的對話框中如下選擇:圖中
45、,藍色條中的字符為在資源編輯時定義的矩形的ID,同樣選擇Add Functioin,在View類中出現(xiàn)如下代碼:void CMyDraw2_0View:OnMenuGraphRectangle() / TODO: Add your command handler code here在該函數中添加如下代碼:ShapeType=2;/用2來代表矩形這樣,就能用數字來表示各個基本形狀了有了這個變量后,在鼠標左鍵按下時,首先判斷該變量是否為-1(因為初始為-1,對應的是隨手畫),假如不是,則對ShapeType的值進行判斷,用switch函數進行相應的操作:在鼠標左鍵按下的相應函數中添加如下代碼:if
46、(ShapeType!=-1)/判斷當前的ShapeType值是否為-1switch(ShapeType)/對當前傳入的ShapeType值進行選擇,分別進行隊形的操作當然,畫矩形需要給矩形類傳入矩形的左上角坐標和右下角坐標,在繪圖時對應的就是鼠標按下時的坐標(我們把它叫做起始點)、鼠標移動時的坐標(我們把它叫做終點),這樣,需要用兩個變量來存儲這兩個點:在View類中添加私有成員變量:CPoint ponit_start;/用來存儲起點CPoint point_end;/用來存儲終點在鼠標左鍵按下的響應函數中添加以下代碼:point_start=point;/將鼠標按下時的點存儲在point
47、_start中point_end.x=0;/將鼠標移動時的點橫坐標賦值為0point_end.y=0;/將鼠標移動時的點縱坐標賦值為0最后,一切準備就緒,該進行矩形的繪畫了:矩形對應的數字為2,在鼠標按下的相應函數中,在switch()函數中添加以下代碼:case 2:rectangle=new CRectangle(point_start.x,point_start.y);break;/new一個矩形對象,將該地址存儲在rectangle中,并將鼠標按下時的點(起點)傳入,作為矩形的左上角的點此時,當鼠標按下時,鼠標就能知道即將要進行的是矩形的繪畫。在鼠標移動的響應函數中也要對ShapeTy
48、pe值作出判斷,告訴鼠標該進行矩形的繪畫,方法與前面類似:在該函數的開頭添加如下代碼:CDC* pDC=GetDC();/打開圖形設備接口,簡單來說,就是用pDC來進行繪畫在if(mDown)中添加如下代碼:switch(ShapeType)case 2:pDC->SetROP2(R2_NOTXORPEN);/將顏色設置為反色if(point_end.x!=0)/判斷鼠標是否移動了rectangle->Draw(pDC);/調用矩形類中的Draw函數point_end=point;/將終點設置為鼠標當前所在的點rectangle->width=point_end.x-poin
49、t_start.x;/將終點與起點的橫坐標之差賦給矩形類中的寬度widthrectangle->height=point_end.y-point_start.y;/將終點與起點的縱坐標之差賦給矩形類中的高度heightrectangle->Draw(pDC);調用矩形類中的Draw函數break;下面對以上代碼進行解釋:當鼠標按下時,終點point_end的值為0,判斷為false,將鼠標此時的點賦給point_end,儲存起來,畫出矩形,當鼠標移動后,判斷為true,此時畫出的矩形左上角坐標為鼠標按下時的點,高度和寬度為之前的高度和寬度,由于前面已將顏色設置為反色,所以將鼠標移動
50、之前畫的矩形覆蓋掉,不會再看見,所以看到的矩形為當前的矩形,之前的矩形已無法看見,否則將會看到一連串的矩形。3.2圓形類的調用在3.1中已經為繪圖做好了準備工作,下面只需要用一個數字表示圓形類看,并在鼠標左鍵按下和鼠標移動的響應函數中的switch語句中添加相應代碼即可: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 一個圓形類對象,將地址儲存在circle中,并將起點傳入,作為圓形的中心點在OnMouseMove()中的switch語句中添加如下代碼:case 3:pDC->SetROP2(R2_NOTXORPEN);/將顏色設為反
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網絡資源訪問控制試題及答案
- 企業(yè)管理中的風險文化與戰(zhàn)略思維試題及答案
- 信息處理技術員的應試寶典試題及答案
- 法學概論與社會變遷的法律反應探討試題及答案
- 2025至2030年中國氨基丙酸行業(yè)投資前景及策略咨詢研究報告
- 2025至2030年中國有線電視分支分配器行業(yè)投資前景及策略咨詢研究報告
- 2025至2030年中國無水氟比氫行業(yè)投資前景及策略咨詢研究報告
- 2025至2030年中國定載離心式風機行業(yè)投資前景及策略咨詢研究報告
- 2025年中國長螺栓系船柱市場調查研究報告
- 創(chuàng)新思維2025年VB考試試題及答案練習
- 準格爾礦區(qū)不連溝煤礦改擴建項目(1800萬噸-年)環(huán)評報告書
- 一把手講安全課件:提升全員安全意識
- 太陽能路燈安裝工程施工方案施工組織設計投標方案(技術標)
- 2024年福建省中考歷史試卷(含標準答案及解析)
- TSG+23-2021氣瓶安全技術規(guī)程
- 2025高考語文背誦篇目
- 繼子女斷絕關系協(xié)議書
- 綜合醫(yī)院感染病例報告卡
- 《玻璃纖維石膏板》行業(yè)標準征求意見稿編制說明
- DB32T3748-2020 35kV及以下客戶端變電所建設標準
- 2024-2030年國內汽車電動尾門行業(yè)市場深度分析及發(fā)展現(xiàn)狀與趨勢研究報告
評論
0/150
提交評論