mfc簡單繪圖程序_第1頁
mfc簡單繪圖程序_第2頁
mfc簡單繪圖程序_第3頁
mfc簡單繪圖程序_第4頁
mfc簡單繪圖程序_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

MFC簡單得繪圖程序——王帥目錄摘要 2關(guān)鍵字?2TOC\o”1-3”\u1引言 2設(shè)計目得 PAGEREF_Toc279309297\h32功能說明?22、1菜單欄?PAGEREF_Toc279309298\h32、1、1圖形?32、1、2畫筆?42、1、3畫硬幣?42、2工具欄 52、3狀態(tài)欄 53功能得實現(xiàn)?53、1視圖設(shè)計?53、2編輯資源 63、3編程思路及各個函數(shù)得實現(xiàn) 7(1)思路?7(2)代碼得實現(xiàn) 71、為基本形狀創(chuàng)建一個基類?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、8直線類得創(chuàng)建及定義 193、各基本形狀類在CMyDraw2_0類中得調(diào)用與繪圖得實現(xiàn) 203、1矩形類得調(diào)用與與繪圖得實現(xiàn)?203、2圓形類得調(diào)用?243、3正三角形類得調(diào)用?253、4基本類型調(diào)用得剩余代碼 264、畫筆得使用、顏色及大小得調(diào)整 295、畫硬幣?356、工具欄中得自定義控件 387、狀態(tài)欄中得顯示?394程序功能得測試?415最后總結(jié) 42摘要:本繪圖程序能夠進(jìn)行基本圖形得繪畫,如直線,圓,矩形,三角形等等,并且在此基礎(chǔ)上添加了多邊形得繪畫,如正五邊形等。除此之外,還能夠進(jìn)行隨手畫,即用鼠標(biāo)隨意畫線條。為了更好得繪圖,還添加了對畫筆粗細(xì)得調(diào)整,以及對畫筆顏色得調(diào)整,除了特定得顏色,顏色還可根據(jù)輸入得RGB值隨意更改。還有一些老師得要求,加入了畫硬幣、顯示硬幣數(shù)目即鼠標(biāo)坐標(biāo)等信息。本程序主要采用面向?qū)ο髮懛ǎP(guān)鍵字:程序設(shè)計,MFC,繪圖引言設(shè)計目得本繪圖程序得設(shè)計不僅僅局限于老師課堂得要求,通過C++得編寫實現(xiàn)繪圖要求,我還想要在此基礎(chǔ)上,加入自己得一些想法,想要更好地了解MFC,更好地去實現(xiàn)自己得想法。功能說明2、1菜單欄2、1、1圖形圖形欄中包括直線、矩形、圓形、橢圓、多邊形,多邊形中包括正三角形、正四邊形、正五邊形、正六邊形。①選擇直線,可用鼠標(biāo)拖動畫出一條直線②選擇矩形,可用鼠標(biāo)拖動畫出矩形③選擇圓形,可用鼠標(biāo)拖動畫出圓形④選擇橢圓,可用鼠標(biāo)拖動畫出橢圓⑤選擇正三角形,可用鼠標(biāo)拖動畫出正三角形⑥選擇正四邊形,可用鼠標(biāo)拖動畫出正方形⑦選擇正五邊形,可用鼠標(biāo)拖動畫出正五邊形⑧選擇正六邊形,可用鼠標(biāo)拖動畫出正六邊形(注:為了驗證自己得想法以及想讓畫出得圖形隨意地變換方向,特意在正三角形一項中加入了旋轉(zhuǎn)效果,使鼠標(biāo)在拖動時能旋轉(zhuǎn)三角形)2、1、2畫筆畫筆欄中包括顏色、大小及鉛筆(1)顏色顏色中包括黑色、紅色、綠色、藍(lán)色、橙色、黃色、青色、紫色、粉色、自定義①選擇黑色,畫出得圖形將為黑色②選擇紅色,畫出得圖形將為紅色③選擇綠色,畫出得圖形將為綠色④選擇橙色,畫出得圖形將為橙色⑤選擇黃色,畫出得圖形將為黃色⑥選擇青色,畫出得圖形將為青色⑦選擇紫色,畫出得圖形將為紫色⑧選擇粉色,畫出得圖形將為粉色⑨選擇自定義,可輸入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個③選擇減少,窗口中得硬幣數(shù)目將減少1個④選擇清除,刷新窗口,將硬幣消去2、2工具欄工具欄中除了原有得圖標(biāo)外,還加入了自定義得圖標(biāo)①選擇,可用鼠標(biāo)拖動畫出一條直線②選擇,可用鼠標(biāo)拖動畫出矩形③選擇,可用鼠標(biāo)拖動畫出圓形④選擇,可用鼠標(biāo)拖動畫出正三角形⑤選擇,可用鼠標(biāo)進(jìn)行隨手畫⑥選擇,可在窗口畫出硬幣后,將硬幣數(shù)量+1⑦選擇,可在窗口畫出硬幣后,將硬幣數(shù)量-1⑧選擇,可利用鼠標(biāo)對所繪圖形進(jìn)行擦除,橡皮擦得大小與畫筆大小相同2、3狀態(tài)欄狀態(tài)欄中除了原有得顯示外,還加入了硬幣得數(shù)量以及鼠標(biāo)得x坐標(biāo)與y坐標(biāo)功能得實現(xiàn)3、1視圖設(shè)計利用MFC生成畫圖應(yīng)用程序框架具體步驟如下:(1)執(zhí)行VC程序,選擇命令,彈出New對話框、單擊Projects標(biāo)簽,轉(zhuǎn)到Projects選項卡,選擇MFCAppWizard(exe)選項,然后在Projectname文本框中輸入MyDraw2_0(原來也做過一個,不過并沒有以面向?qū)ο蟮脤懛ㄈ?,這個就當(dāng)作就是我得第二個版本),文本框就是指項目得本地路徑。(2)由于本程序就是實現(xiàn)畫線,要在視圖中完成,所以首先創(chuàng)建一個基于單文檔得應(yīng)用程序3、2編輯資源利用ResourceView中得Menu編輯器在菜單欄添加菜單,該流程圖如下3、2所示:圖3、2利用ResourceView中得ToolBar編輯器,在工具欄中添加自定義控件??丶D案如下所示:3、3編程思路及各個函數(shù)得實現(xiàn)(1)思路:首先,畫定義好得形狀.直線、矩形、圓形等等都屬于基本得形狀,那么我設(shè)定一個基類,稱它為CShape,給這個基類定義一個畫畫得虛函數(shù)Draw(CDC*pDC),在這個類里面派生出各個需要得類,如CCircle類,并為這些派生類定義各自得屬性及方法,重寫基類得Draw函數(shù).當(dāng)我需要用到這些類得時候,只需要在View類里創(chuàng)建指針,然后調(diào)用里面Draw方法。由于就是當(dāng)鼠標(biāo)拖動得時候畫出所需得圖形,需要添加鼠標(biāo)響應(yīng)函數(shù),onLButtonDown(),onLButtonUp,以及onMouseMove()。畫畫主要就是在onMouseMove()里實現(xiàn)。接著,就是畫筆得顏色與大小,本來就是想單獨創(chuàng)建一個畫筆類,定義顏色與大小屬性,使CCircle等派生類多繼承,在繼承一個畫筆類,但嘗試了幾遍,發(fā)現(xiàn)在菜單里選擇顏色時就會使程序停止運行,于就是就放棄了.重新構(gòu)思之后,由于畫圖就是在CMyDraw2_0里實現(xiàn)得,就直接在CMyDraw2_0中定義了顏色與大小得變量,這樣也方便。然后就是畫硬幣.并沒有為這個創(chuàng)建單獨得類,直接在CMyDraw2_0中得OnDraw()中畫硬幣,并且在CMyDraw2_0中添加了增加與減少硬幣得方法。工具欄中只要與為各個圖標(biāo)添加函數(shù),作用與菜單欄中得圖形一欄中對應(yīng)即可.最后還有硬幣得數(shù)量與鼠標(biāo)坐標(biāo)放在狀態(tài)欄中顯示,下面開始進(jìn)行函數(shù)代碼得實現(xiàn)。代碼得實現(xiàn):為基本形狀創(chuàng)建一個基類,命名為CShape。在ClassViewz中右鍵點擊MyDraw2_0classes—〉newclass,在彈出窗口得頂部下拉框中選擇GenericClass,如圖所示在頭文件中添加虛函數(shù)Draw(CDC*pDC)public: CShape(); virtualDraw(CDC*pDc)=0;//添加得虛函數(shù) virtual~CShape();基本形狀類得創(chuàng)建(注:以矩形、圓形、正五邊形、正三邊形為重點介紹)? 2、1矩形類得創(chuàng)建及定義創(chuàng)建一個矩形類,繼承CShape類,如圖在該類中重新定義畫畫函數(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;//矩形得高度?virtual~CRectangle();在無參數(shù)構(gòu)造函數(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值賦給width?height=h; ? //將傳入得h值賦給height重寫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ù)畫出矩形,其中得值分別為矩形得左上角橫坐標(biāo),?左上角縱坐標(biāo),右下角橫坐標(biāo),右下角縱坐標(biāo)}在CMyDraw2_0View中引入矩形類得頭文件:雙擊CMyDraw2_0View,在代碼//MyDraw2_0View、h:interfaceoftheCMyDraw2_0Viewclass///////////////////////////////////////////////////////////////////////////////#if!defined(AFX_MYDRAW2_0VIEW_H__3809529C_6744_4AD2_80A4 _D44683D0A5A(chǔ)F__INCLUDED_)#define AFX_MYDRAW2_0VIEW_H__3809529C_6744_4AD2_80A4_D44683D0?A5AF__(dá)INCLUDED_下添加如下代碼:#include"Rectangle、h”并在View類中添加私有成員變量,創(chuàng)建矩形類得指針:右鍵點擊CMyDraw2_0View,選擇AddMemberVariable,在彈出得對話框中如下輸入:將在CMyDraw2_0View頭文件中出現(xiàn)如下代碼Private:CRectangle*rectangle;//定義指向矩形類得指針, ?? 為私有變量2、2圓形類得創(chuàng)建及定義創(chuàng)建一個圓形類,命名為CCircle,繼承CShape類,在該類中添加公有成員變量,代碼如下:public:?CCircle();?CCircle(intx,inty,intradius=0);//帶參數(shù)得構(gòu)造函數(shù),其中,x表示圓心得x值,y表示圓心得y值,radius表示圓得半徑?Draw(CDC*pDC);//重新定義Draw函數(shù)?virtual~CCircle(); intRadius;//定義圓得半徑 CPointcenter_point;//定義圓得中心點在無參數(shù)得構(gòu)造函數(shù)中初始化變量值,代碼如下:CCircle::CCircle(){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值賦給圓得半徑}重寫定義得Draw函數(shù),代碼如下:CCircle::Draw(CDC*pDC){ pDC-〉Ellipse(center_point、x—Radius,center_point、y-Radius,center_p ?oint、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)建一個正五邊形類,命名為CPentangle,繼承CShape類,在該類中添加公有成員變量,代碼如下:public: ? CPentangle();????CPentangle(intx,inty,intradius=0);//帶參數(shù)得構(gòu)造函數(shù),x為外接圓圓心得橫坐標(biāo),y為外接圓圓心得縱坐標(biāo),radius為外接圓得半徑? ? intRadius;//定義外接圓半徑? CPointcP;//定義外接圓圓心 Draw(CDC*pDC);//重新定義Draw函數(shù) ? virtual~CPentangle();在無參數(shù)得構(gòu)造函數(shù)中初始化各變量,代碼如下:CPentangle::CPentangle(){cP、x=0;//圓心橫坐標(biāo)初始為0cP、y=0;//圓心縱坐標(biāo)初始為0 Radius=0;//外接圓半徑初始為0}在帶參數(shù)得構(gòu)造函數(shù)中將傳入得值賦給各變量,代碼如下:CPentangle::CPentangle(intx,inty,intradius){ cP、x=x;//將傳入得x值賦給圓心得橫坐標(biāo) cP、y=y;//將傳入得y值賦給圓心得縱坐標(biāo)?Radius=radius;//將傳入得radius值賦給外接圓半徑}下面重寫得Draw函數(shù)與前兩個不同,需要用到數(shù)學(xué)函數(shù)cos()以及sin(),由于兩個函數(shù)用得就是弧度制,還需引入數(shù)學(xué)變量PI,為了能夠順利得寫入這些函數(shù),需要在CPentangle類得客戶端中引入數(shù)學(xué)類得頭文件:雙擊ClassView中得CPentangle(),在出現(xiàn)得構(gòu)造函數(shù)上方,在如下代碼//Pentangle、cpp:implementationoftheCPentangleclass、////////////////////////////////////////////////////////////////////////#include”stdafx、h"#include"MyDraw2_0、h"#include”Pentangle、h"下添加數(shù)學(xué)類頭文件:#include“math、h"再定義一個宏變量PI,添加如下代碼:#definePI3、1415926開始重寫Draw(CDC*pDC)函數(shù),代碼如下:CPentangle::Draw(CDC*pDC){?doublerc=Radius*cos(36*PI/180);//將半徑與36度得余弦值相乘并且賦給新得變量rc?doublers=Radius*sin(36*PI/180);//將半徑與36度得正弦值相乘并且賦給新得變量rs?doubleRc=Radius*cos(18*PI/180);//將半徑與18度得余弦值相乘并且賦給新得變量Rc doubleRs=Radius*sin(18*PI/180); //將半徑與18度得正弦值相乘并且賦給新得變量Rs POINTpts[]={{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}};//利用點類得數(shù)組將五個點儲存在點數(shù)組pts中pDC—〉Polygon(pts,5);//利用函數(shù)Polygon()進(jìn)行多邊形得繪畫,其中pts為儲存得點,5為點得個數(shù)}下面對Draw函數(shù)中各數(shù)據(jù)進(jìn)行深層次得分析,表明它們得來歷:如圖所示:以外接圓圓心為坐標(biāo)軸中心,設(shè)該點得坐標(biāo)為(cP、x,cP、y);則右下角得坐標(biāo)為cP、x+R*sin(36*PI/180),cP、y+R*cos(36*PI/180)按順時針方向瞧,接下去得幾個點得坐標(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*sin(18*PI/180)以上為正五邊形5個點得來歷,接下來在CMyDraw2_0View中引入正五邊形類得頭文件:#include“Pentangle、h"添加一個私有變量,創(chuàng)建指向正五邊形得指針變量:CPentangle*pentangle;2、4正三角形類得創(chuàng)建及定義(這個類中添加了旋轉(zhuǎn))創(chuàng)建一個正三角形類,命名為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)過得角度 doublest;//該變量儲存得就是sin(theta) doublect;//該變量儲存得事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ù)中將傳入得值賦給各變量,代碼如下: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ù)時將cos(theta)設(shè)置為1 ?st=0;//調(diào)用該函數(shù)時將sin(theta)設(shè)置為0}與正五邊形相同,要引入數(shù)學(xué)類得頭文件以及定義宏變量PI,#include“math”#definePI3、1415926開始重寫定義得Draw(CDC*pDC)函數(shù),代碼如下:CDelta::Draw(CDC*pDC){?doublerc=Radius*cos(60*PI/180);//外接圓半徑與60度余弦值相乘后賦給rc?doublers=Radius*sin(60*PI/180);//外接圓半徑與60度正弦值相乘后賦給rs?ct=cos(theta);//將theta得余弦值賦給ct st=sin(theta);//將theta得正弦值賦給st?POINTdx1,dx11;//定義兩個點(接下來會詳細(xì)說明)?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+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}};//定義點數(shù)組,存儲正三角形得三個點pDC-〉Polygon(pts,3);//利用畫多邊形得函數(shù)Polygon()畫正三角形,pts為儲存得三個點,3為點得個數(shù)}接下來對Draw函數(shù)里得變量以及運算進(jìn)行解釋:R如圖所示,正三角形得中心到各頂點得距離為半徑,R設(shè)中心點得坐標(biāo)為(cp、x,cp、y),則可得到右下角得坐標(biāo)為cp、x+R*sin(60*PI/180),cp、y+R*cos(60*PI/180)按順時針方向,接下來兩個點得坐標(biāo)分別為cp、x—R*sin(60*PI/180),cp、y-R*cos(60*PI/180)cp、x,cp、x-R此時,我們得到了三個頂點得坐標(biāo),如果按這三個點得坐標(biāo)畫圖,就會得到如圖所示得三角形,在此基礎(chǔ)上,不妨設(shè)此圖形逆時針轉(zhuǎn)過得角度為,有以下原理作為基礎(chǔ):設(shè)一個點得坐標(biāo)為(x1,y1),它繞另一個點(x2,y2)旋轉(zhuǎn)角,得到新得點得坐標(biāo)為:x=(x1-x2)*cos-(y1—y2)*sin+x2;y=(y1—y2)*cos+(x1—x2)*sin+y2;顯然,只需得到三個點繞中心旋轉(zhuǎn)后各自得新坐標(biāo),我們就可以根據(jù)旋轉(zhuǎn)得角得到新得正三角形在Draw(CDC*pDC)函數(shù)中,用theta來代替,以右下角頂點為例,原坐標(biāo)為cp、x+rs,cp、y+rc按如下代碼將cos(theta)與sin(theta)替換:ct=cos(theta);st=sin(theta);用dx3、x儲存該點與中心點橫坐標(biāo)得差dx3、y儲存該點與中心點縱坐標(biāo)得差,如下:dx3、x=cp、x+rs—cp、x;dx3、y=cp、y+rc—cp、y; ??用dx33儲存該點旋轉(zhuǎn)后得到得新得坐標(biāo):dx33、x=dx3、x*ct-dx3、y*st+cp、x;dx33、y=dx3、y*ct+dx3、x*st+cp、y;這樣就得到了該點旋轉(zhuǎn)后得坐標(biāo),其它兩點按同樣方法即可得到新坐標(biāo),dx22為左下角得新坐標(biāo),dx11為正上方得新坐標(biāo)接下來,在CMyDraw2_0View得頭文件中引入正三角形類,#include“Delta、h”添加私有變量,創(chuàng)建正三角形類得指針變量:CDelta*delta;接下來我直接給出剩下基本形狀類得代碼(只在當(dāng)中作注釋,不再詳細(xì)解釋)2、5橢圓類得創(chuàng)建與定義創(chuàng)建名為CEllipse得類,繼承CShape,在該頭文件中添加如下代碼:classCEllipse:publicCShape{public: CEllipse();?CEllipse(intx,inty,intw=0,inth=0);//帶參數(shù)得構(gòu)造函數(shù),值分別為外接矩形左上角得橫坐標(biāo)、縱坐標(biāo)、寬度、高度?intwidth;//外接矩形得寬度 intheight;//外接矩形得高度 CPointcenter_point;//橢圓中心點?Draw(CDC*pDC);//重新定義Draw函數(shù) virtual~CEllipse();};在該類app中添加如下代碼:CEllipse::CEllipse(){center_point、x=0;//將中心點橫坐標(biāo)初始為0center_point、y=0;//將中心點縱坐標(biāo)初始為0width=0;//將外接矩形寬度初始為0height=0;//將外接矩形高度初始為0}CEllipse::CEllipse(intx,inty,intw,inth){center_point、x=x;//將傳入得x值賦給中心點得橫坐標(biāo)center_point、y=y;//將傳入得y值賦給中心點得縱坐標(biāo)width=w;//將傳入得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ù)畫橢圓}在CMyDraw2_0View得頭文件中引入橢圓類,#include“Ellipse、h"添加私有變量,創(chuàng)建橢圓類得指針變量:CEllipse*ellipse;2、6正四邊形類得創(chuàng)建及定義命名為CQuadrangle,頭文件中添加如下代碼:public:?CQuadrangle(); CQuadrangle(intx,inty,intradius=0);//帶參數(shù)得構(gòu)造函數(shù),參數(shù)分別為中心點得橫坐標(biāo)、縱坐標(biāo)、外接圓半徑?intRadius;//外接圓半徑 CPointcPoint;//中心點?Draw(CDC*pDC);//重新定義Draw函數(shù) virtual~CQuadrangle();在該類app中添加如下代碼:CQuadrangle::CQuadrangle(){cPoint、x=0;//將中心點得橫坐標(biāo)初始為0cPoint、y=0;//將中心點得縱坐標(biāo)初始為0Radius=0;//將外接圓得半徑初始為0}CQuadrangle::CQuadrangle(intx,inty,intradius){cPoint、x=x;//將傳入得x值賦給中心點得橫坐標(biāo)cPoint、y=y;//將傳入得y值賦給中心點得縱坐標(biāo)Radius=radius;//將傳入得radius賦給外接圓半徑}CQuadrangle::Draw(CDC*pDC){?doubleRc=Radius*cos(45*PI/180);//將半徑與45度余弦值得乘積賦給RcPOINTpts[]={{cPoint、x+Rc,cPoint、y+Rc},{cPoint、x+Rc,cPoint、y—Rc},{cPoint、x—Rc,cPoint、y-Rc},{cPoint、x-Rc,cPoint、y+Rc}};//定義點數(shù)組,儲存四個頂點 pDC—〉Polygon(pts,4);//利用多邊形繪畫函數(shù)畫正四邊形}在CMyDraw2_0View得頭文件中引入正四邊形類,#include“Quadrangle、h”添加私有變量,創(chuàng)建正四邊形類得指針變量:CQuadrangle*quadrangle;2、7正六邊形得創(chuàng)建及定義命名為CRegularHexagon,頭文件中添加如下代碼:public: CQuadrangle(); CQuadrangle(intx,inty,intradius=0);//帶參數(shù)得構(gòu)造函數(shù),參數(shù)分別為中心點得橫坐標(biāo)、縱坐標(biāo)、外接圓半徑 intRadius;//外接圓半徑?CPointcPoint;//中心點 Draw(CDC*pDC);//重新定義Draw函數(shù)?virtual~CQuadrangle();在該類app中添加如下代碼:CRegularHexagon::CRegularHexagon(){cp、x=0;//將中心點得橫坐標(biāo)初始為0cp、y=0;//將中心點得縱坐標(biāo)初始為0Radius=0;//將外接圓得半徑初始為0}CRegularHexagon::CRegularHexagon(intx,inty,intradius){ cp、x=x;//將傳入得x值賦給中心點得橫坐標(biāo) cp、y=y;//將傳入得y值賦給中心點得縱坐標(biāo) Radius=radius;//將傳入得radius值賦給外接圓半徑}CRegularHexagon::Draw(CDC*pDC){ doublers=Radius*sin(30*PI/180);//將半徑與30度正弦值得乘積賦給rs?doublerc=Radius*cos(30*PI/180);//將半徑與30度余弦值得乘積賦給rc?doubleRs=Radius*sin(60*PI/180);//將半徑與60度正弦值得乘積賦給Rs?doubleRc=Radius*cos(60*PI/180);//將半徑與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},{cp、x+Rc,cp、y—Rs},{cp、x+Radius,cp、y}};//定義點數(shù)組pts,儲存正六邊形得六個頂點?pDC—>Polygon(pts,6);//利用多邊形繪畫函數(shù)畫出正六邊形}在CMyDraw2_0View得頭文件中引入正六邊形類,#include“RegularHexagon、h"添加私有變量,創(chuàng)建正六邊形類得指針變量:CRegularHexagon*regularhexagon;2、8直線類得創(chuàng)建及定義命名為CLine,在頭文件中添加如下代碼:public: CLine(); CLine(intsx,intsy,intex=0,intey=0);//帶參數(shù)得構(gòu)造函數(shù),分別為直線起點得橫坐標(biāo)、縱坐標(biāo),終點得橫坐標(biāo)、縱坐標(biāo)?Draw(CDC*pDC);//重新定義Draw函數(shù) CPointp_start;//定義直線起點?CPointp_end;//定義直線終點?virtual~CLine();在該類app中添加如下代碼:CLine::CLine(){p_start、x=0;//將起點橫坐標(biāo)初始為0p_start、y=0;//將起點縱坐標(biāo)初始為0p_end、x=0;//將終點橫坐標(biāo)初始為0p_end、y=0;//將終點縱坐標(biāo)初始為0}CLine::CLine(intsx,intsy,intex,intey){? ? ?p_start、x=sx;//將sx得值賦給起點得橫坐標(biāo)?p_start、y=sy;//將sy得值賦給起點得縱坐標(biāo)?? ?? p_end、x=ex;//將ex得值賦給終點得橫坐標(biāo) ?? p_end、y=ey;//將ey得值賦給終點得縱坐標(biāo)}CLine::Draw(CDC*pDC){ pDC-〉MoveTo(p_start);//利用MoveTo()函數(shù)畫出直線起點 pDC-〉LineTo(p_end);//利用LineTo()函數(shù)從起點畫直線到終點}在CMyDraw2_0View得頭文件中引入直線類,#include“Line、h”添加私有變量,創(chuàng)建直線類得指針變量:CLine*line;各基本形狀類在CMyDraw2_0View類中得調(diào)用與繪圖得實現(xiàn)(注:以矩形、圓形、正三角形為重點介紹)3、1矩形類得調(diào)用與與繪圖得實現(xiàn)繪圖得過程就是:鼠標(biāo)左鍵按下->鼠標(biāo)移動->鼠標(biāo)左鍵彈起在此,引入鼠標(biāo)得三個響應(yīng)函數(shù),分別對應(yīng)該三個過程:按下ctrl+w,彈出如圖所示對話框,并按如圖操作,選擇右側(cè)得AddFunction(本應(yīng)就是黑色,由于已添加,變?yōu)榛疑?,將三個響應(yīng)函數(shù)添加到CMyDraw2_0View類app中?,F(xiàn)在,需要告訴鼠標(biāo),當(dāng)鼠標(biāo)左鍵按下時開始進(jìn)行繪畫,那么,需要添加一個變量,告訴鼠標(biāo)就是否進(jìn)行繪畫:為View類添加私有成員變量:boolmDown;在View類得構(gòu)造函數(shù)中對該值進(jìn)行初始化,代碼如下:CMyDraw2_0View::CMyDraw2_0View(){ //TO(shè)DO:addconstructioncodehere?mDown=false;//將mDown初始為false,表示默認(rèn)為不進(jìn)行繪畫}在鼠標(biāo)左鍵按下得響應(yīng)函數(shù)中添加如下代碼:VoidCMyDraw2_0View::OnLButtonDown(UINTnFlags,CPointpoint){mDown=true;//將mDown標(biāo)記為true,表示此時即將開始繪畫}在鼠標(biāo)左鍵彈起得響應(yīng)函數(shù)中添加如下代碼:voidCMyDraw2_0View::OnLButtonUp(UINTnFlags,CPointpoint){mDown=false;//將mDown重新標(biāo)記為false,表明此時應(yīng)停止繪畫}在鼠標(biāo)移動時判斷鼠標(biāo)就是否按下,如果按下則開始進(jìn)行繪畫:voidCMyDraw2_0View::OnMouseMove(UINTnFlags,CPointpoint){if(mDown){//此處添加繪畫代碼(下面會說到)}}到此,對鼠標(biāo)就是否進(jìn)行繪畫得判斷已完成,接下來,需要告訴鼠標(biāo)畫出得圖形應(yīng)該就是矩形,不妨設(shè)一個變量用來儲存類型:在View類中添加私有成員變量:intShapeType;//該變量用來儲存圖形類型在View類構(gòu)造函數(shù)中進(jìn)行該變量得初始化:ShapeType=—1;//默認(rèn)為-1,表示為標(biāo)得隨手畫(下面會提到)為View類添加菜單中矩形得響應(yīng)函數(shù):同樣按下Ctrl+W,在彈出得對話框中如下選擇:圖中,藍(lán)色條中得字符為在資源編輯時定義得矩形得ID,同樣選擇AddFunctioin,在View類中出現(xiàn)如下代碼:voidCMyDraw2_0View::OnMenuGraphRectangle(){ ? //TODO:Addyourmandhandlercodehere}在該函數(shù)中添加如下代碼:ShapeType=2;//用2來代表矩形這樣,就能用數(shù)字來表示各個基本形狀了有了這個變量后,在鼠標(biāo)左鍵按下時,首先判斷該變量就是否為-1(因為初始為-1,對應(yīng)得就是隨手畫),假如不就是,則對ShapeType得值進(jìn)行判斷,用switch函數(shù)進(jìn)行相應(yīng)得操作:在鼠標(biāo)左鍵按下得相應(yīng)函數(shù)中添加如下代碼:if(ShapeType!=-1)//判斷當(dāng)前得ShapeType值就是否為-1?{ switch(ShapeType)//對當(dāng)前傳入得ShapeType值進(jìn)行選擇,分別進(jìn)行隊形得操作 {}?}當(dāng)然,畫矩形需要給矩形類傳入矩形得左上角坐標(biāo)與右下角坐標(biāo),在繪圖時對應(yīng)得就就是鼠標(biāo)按下時得坐標(biāo)(我們把它叫做起始點)、鼠標(biāo)移動時得坐標(biāo)(我們把它叫做終點),這樣,需要用兩個變量來存儲這兩個點:在View類中添加私有成員變量:CPointponit_start;//用來存儲起點CPointpoint_end;//用來存儲終點在鼠標(biāo)左鍵按下得響應(yīng)函數(shù)中添加以下代碼:point_start=point;//將鼠標(biāo)按下時得點存儲在point_start中?point_end、x=0;//將鼠標(biāo)移動時得點橫坐標(biāo)賦值為0?point_end、y=0;//將鼠標(biāo)移動時得點縱坐標(biāo)賦值為0最后,一切準(zhǔn)備就緒,該進(jìn)行矩形得繪畫了:矩形對應(yīng)得數(shù)字為2,在鼠標(biāo)按下得相應(yīng)函數(shù)中,在switch()函數(shù)中添加以下代碼:case2:rectangle=newCRectangle(point_start、x,point_start、y);break;//new一個矩形對象,將該地址存儲在rectangle中,并將鼠標(biāo)按下時得點(起點)傳入,作為矩形得左上角得點此時,當(dāng)鼠標(biāo)按下時,鼠標(biāo)就能知道即將要進(jìn)行得就是矩形得繪畫。在鼠標(biāo)移動得響應(yīng)函數(shù)中也要對ShapeType值作出判斷,告訴鼠標(biāo)該進(jìn)行矩形得繪畫,方法與前面類似:在該函數(shù)得開頭添加如下代碼:CDC*pDC=GetDC();//打開圖形設(shè)備接口,簡單來說,就就是用pDC來進(jìn)行繪畫在if(mDown){}中添加如下代碼:switch(ShapeType){case2:pDC—>SetROP2(R2_NOTXORPEN);//將顏色設(shè)置為反色 ??if(point_end、x!=0)//判斷鼠標(biāo)就是否移動了 ??{ ??rectangle-〉Draw(pDC);//調(diào)用矩形類中得Draw函數(shù)? ?}? point_end=point;//將終點設(shè)置為鼠標(biāo)當(dāng)前所在得點 ??rectangle—〉width=point_end、x—point_start、x;//將終點與起點得橫坐標(biāo)之差賦給矩形類中得寬度width?? rectangle-〉height=point_end、y-point_start、y;//將終點與起點得縱坐標(biāo)之差賦給矩形類中得高度height? rectangle->Draw(pDC);調(diào)用矩形類中得Draw函數(shù) ? break;}下面對以上代碼進(jìn)行解釋:當(dāng)鼠標(biāo)按下時,終點point_end得值為0,判斷為false,將鼠標(biāo)此時得點賦給point_end,儲存起來,畫出矩形,當(dāng)鼠標(biāo)移動后,判斷為true,此時畫出得矩形左上角坐標(biāo)為鼠標(biāo)按下時得點,高度與寬度為之前得高度與寬度,由于前面已將顏色設(shè)置為反色,所以將鼠標(biāo)移動之前畫得矩形覆蓋掉,不會再瞧見,所以瞧到得矩形為當(dāng)前得矩形,之前得矩形已無法瞧見,否則將會瞧到一連串得矩形.3、2圓形類得調(diào)用在3、1中已經(jīng)為繪圖做好了準(zhǔn)備工作,下面只需要用一個數(shù)字表示圓形類瞧,并在鼠標(biāo)左鍵按下與鼠標(biāo)移動得響應(yīng)函數(shù)中得switch語句中添加相應(yīng)代碼即可:voidCMyDraw2_0View::OnMenuGraphCircle(){ //TODO:Addyourmandhandlercodehere ShapeType=3;//用3來表示圓形}在OnLButtonDown()中得switch語句中添加如下代碼:Case3:circle=newCCircle(point_start、x,point_start、y);break;//new一個圓形類對象,將地址儲存在circle中,并將起點傳入,作為圓形得中心點在OnMouseMove()中得switch語句中添加如下代碼:case3:pDC—>SetROP2(R2_NOTXORPEN);//將顏色設(shè)為反色 if(point_end、x!=0)//判斷鼠標(biāo)就是否移動 ??{ ? ?circle-〉Draw(pDC);//調(diào)用圓形類中得Draw()函數(shù)? ?} ?point_end=point;//將鼠標(biāo)當(dāng)前所在得點保存在ponit_end中 ??xx=point_end、x—point_start、x;//將終點與起點得橫坐標(biāo)之差賦給xx(由于很多地方都會用到該變量,我將它作為View類得私有成員變量)???yy=point_end、y-point_start、y;//將終點與起點得縱坐標(biāo)之差賦給yy(同上) ?circle->Radius=(int)sqrt(xx*xx+yy*yy);//將兩點間得距離作為圓得半徑 ??circle—>Draw(pDC);//調(diào)用圓形類中得Draw函數(shù) ? break;接下來,相同作用得代碼不再做注釋3、3正三角形類得調(diào)用voidCMyDraw2_0View::OnMenuGraphPolygonDelta(){?//TODO:Addyourmandhandlercodehere ShapeType=5;//用5來表示正三角形}在OnLButtonDown()中得switch語句中添加如下代碼:case5:delta=newCDelta(point_start、x,point_start、y);break;//new一個正三角形類對象,將地址保存在delta中,并將起點傳入,作為正三角形得中心點在OnMouseMove()中得switch語句中添加如下代碼:case5:pDC-〉SetROP2(R2_NOTXORPEN); ?if(point_end、x!=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得取值范圍就是0~360度,類型為double,假如直接用數(shù)學(xué)函數(shù)asin(),只能取到-90度到90度,所以,當(dāng)鼠標(biāo)繞著中心轉(zhuǎn)動得時候,會有余弦得函數(shù)cos(),該值為point、x-point_start、x,取值范圍就是—1~1,只要讓該值與2*PI相乘,就能得到—2*PI~2*PI得值,就能符合theta得取值(注:代碼中得強制轉(zhuǎn)型(double)為關(guān)鍵,否則所得到得值會被近似為0) ?delta—〉Draw(pDC); ? break;接下來,將基本類型調(diào)用得剩余代碼給出:3、4基本類型調(diào)用得剩余代碼用數(shù)字表示各基本形狀:voidCMyDraw2_0View::OnMenuGraphLine(){ //TO(shè)DO:Addyourmandhandlercodehere?ShapeType=1;}voidCMyDraw2_0View::OnMenuGraphEllipse(){?//TODO:Addyourmandhandlercodehere ShapeType=4;}voidCMyDraw2_0View::OnMenuGraphPolygonQuadrangle(){?//TODO:Addyourmandhandlercodehere?ShapeType=6;}voidCMyDraw2_0View::OnMenuGraphPolygonPentangle(){?//TODO:Addyourmandhandlercodehere ShapeType=7;}voidCMyDraw2_0View::OnMenuGraphPolygonRegularHexagon(){?//TODO:Addyourmandhandlercodehere?ShapeType=8;}在OnLButtonDown中:case1:line=newCLine(point_start、x,point_start、y);break;case4:ellipse=newCEllipse(point_start、x,point_start、y);break;case6:quadrangle=newCQuadrangle(point_start、x,point_start、y);break;case7:pentangle=newCPentangle(point_start、x,point_start、y);break;case8:regularhexagon=newCRegularHexagon(point_start、x,point_start、y);break在OnMouseMove中:case1:? pDC—〉SetROP2(R2_NOTXORPEN); if(point_end、x!=0)???{ ? line—〉Draw(pDC);?? } point_end=point;? ?line—>p_end=point;? ?line—〉Draw(pDC);? break;??case6:pDC—>SetROP2(R2_NOTXORPEN);? ?if(point_end、x!=0)?? {? ???quadrangle-〉Draw(pDC);? ?} point_end=point;???xx=point_end、x—point_start、x;? ?yy=point_end、y—point_start、y;???quadrangle—>Radius=(int)sqrt(xx*xx+yy*yy); quadrangle->Draw(pDC);? break; case7:pDC->SetROP2(R2_NOTXORPEN);? if(point_end、x!=0) { ?? pentangle-〉Draw(pDC);? ?}? ?point_end=point;? ?xx=point_end、x-point_start、x;? yy=point_end、y—point_start、y;? ?pentangle—>Radius=(int)sqrt(xx*xx+yy*yy);? ?pentangle-〉Draw(pDC); ??break;??case8:pDC-〉SetROP2(R2_NOTXORPEN); ? if(point_end、x!=0) ??{? ??regularhexagon-〉Draw(pDC);???} ??point_end=point;? xx=point_end、x-point_start、x; yy=point_end、y-point_start、y; ?regularhexagon->Radius=(int)sqrt(xx*xx+yy*yy); ?regularhexagon—>Draw(pDC);? }最后,還有一種畫法,就就是"隨手畫”我們已經(jīng)判斷過ShapeType!=-1時執(zhí)行以上代碼,而ShapeType默認(rèn)為-1,所以如果要隨手畫,就要將ShapeType值重新變?yōu)椋?為畫筆菜單中得鉛筆添加響應(yīng)函數(shù),并將ShapeType值變?yōu)椤?:voidCMyDraw2_0View::OnPencil(){ //TODO:Addyourmandhandlercodehere ShapeType=-1;}并在OnMouseMove中,再增加以下代碼:if(—1==ShapeType) ?{???pDC—>MoveTo(point_start);//將畫出起點 ??pDC—>LineTo(point);//畫出起點到終點得線條 ? point_start=point;//將終點設(shè)置為上一個點? }以上即為繪圖(不包括改變畫筆及畫硬幣、工具欄)得所有代碼,接下來,開始講解畫筆顏色及大小得調(diào)整畫筆得使用、顏色及大小得調(diào)整在MFC里有一個CPen類,用來設(shè)定畫筆得屬性,使用方法為:CPen自定義名稱(線條類型,大小,顏色)所以,我們可以在鼠標(biāo)移動得時候設(shè)定畫筆屬性:在打開圖形設(shè)備接口(即CDC*pDC)后,開始設(shè)定,添加如下代碼:CPenpen(PS_SOLID,1,RGB(0,0,0));//其中,畫筆類型為實現(xiàn),大小為1,顏色為黑色pDC—>SelectObject(&pen);//將pen傳給pDC,使其能夠使用定義得畫筆既然可以調(diào)用,那么如果想要由自己去改變畫筆屬性,可以定義兩個變量,用來保存畫筆大小與顏色:為View類添加私有成員變量:intpen_width;//用來保存畫筆大小COLORREFpen_color;//該變量類型為COLORREF,可以用來保存顏色得RGB值在View類構(gòu)造函數(shù)中初始兩個變量:pen_color=RGB(0,0,0);//顏色默認(rèn)為黑色 pen_width=1;//畫筆大小默認(rèn)為1所以,在設(shè)定畫筆屬性時,可以這樣設(shè)定:CPenpen(PS_SOLID,pen_width,pen_color);//pen_width與pen_color可以隨意改變與基本形狀類得情況相同,可以在用戶選擇顏色與大小后,將pen_color與pen_width設(shè)置為對應(yīng)得RGB值與數(shù)字以紅色與大小2為例:為畫筆菜單里得紅色選項創(chuàng)建響應(yīng)函數(shù),并將pen_color設(shè)置為對應(yīng)RGB值:voidCMyDraw2_0View::OnMenuCpenColorRed(){?//TODO:Addyourmandhandlercodehere pen_color=RGB(255,0,0);}為畫筆菜單里得2選項創(chuàng)建響應(yīng)函數(shù),并將pen_width設(shè)置為對應(yīng)數(shù)字:voidCMyDraw2_0View::OnMenuCepnWidthTwo(){ //TODO:Addyourmandhandlercodehere pen_width=2;}接下來,直接給出顏色及大小調(diào)整得剩余代碼:顏色得設(shè)定:voidCMyDraw2_0View::OnMenuCpenColorBlack(){ //TO(shè)DO:Addyourmandhandlercodehere pen_color=RGB(0,0,0);//將顏色設(shè)置為黑色}voidCMyDraw2_0View::OnMenuCpenColorGreen(){?//TODO:Addyourmandhandlercodehere?pen_color=RGB(0,255,0);//將顏色設(shè)置為綠色}voidCMyDraw2_0View::OnMenuCpenColorBlue(){ //TODO:Addyourmandhandlercodehere?pen_color=RGB(0,0,255);//將顏色設(shè)置為藍(lán)色}voidCMyDraw2_0View::OnMenuCpenColorOrange(){ //TODO:Addyourmandhandlercodehere?pen_color=RGB(255,97,0);//將顏色設(shè)置為橙色}voidCMyDraw2_0View::OnMenuCpenColorYellow(){?//TODO:Addyourmandhandlercodehere pen_color=RGB(255,255,0);//將顏色設(shè)置為黃色}voidCMyDraw2_0View::OnMenuCpenColorCyan(){ //TODO:Addyourmandhandlercodehere pen_color=RGB(0,255,255);//將顏色設(shè)置為青色}voidCMyDraw2_0View::OnMenuCpenColorPurple(){?//TODO:Addyourmandhandlercodehere pen_color=RGB(153,51,102);//將顏色設(shè)置為紫色}voidCMyDraw2_0View::OnMenuCpenColorPink(){ //TODO:Addyourmandhandlercodehere pen_color=RGB(255,0,156);//將顏色設(shè)置為粉色}大小得設(shè)定:voidCMyDraw2_0View::OnMenuCepnWidthOne(){ //TO(shè)DO:Addyourmandhandlercodehere pen_width=1;//大小設(shè)置為1}voidCMyDraw2_0View::OnMenuCepnWidthThree(){?//TO(shè)DO:Addyourmandhandlercodehere pen_width=3;//大小設(shè)置為3}voidCMyDraw2_0View::OnMenuCepnWidthFour(){ //TODO:Addyourmandhandlercodehere pen_width=4;//大小設(shè)置為4}voidCMyDraw2_0View::OnMenuCepnWidthFive(){ //TODO:Addyourmandhandlercodehere?pen_width=5;//大小設(shè)置為5}voidCMyDraw2_0View::OnMenuCepnWidthSix(){?//TODO:Addyourmandhandlercodehere?pen_width=6;//大小設(shè)置為6}voidCMyDraw2_0View::OnMenuCepnWidthSeven(){ //TODO:Addyourmandhandlercodehere pen_width=7;//大小設(shè)置為7}到此,就能夠畫出定義得各種形狀,還能選擇定義得顏色,當(dāng)然,畢竟顏色有限,為了能夠隨意改變顏色,還添加了一個顏色選項,名為”自定義”,用來自定義顏色,下面進(jìn)行詳細(xì)講解:由于需要用戶自己輸入RGB值,所以需要一個對話框來完成信息得交互:在ResourceView中右鍵Dialog,選擇”插入Dialog”,對出現(xiàn)得原始對話框如圖進(jìn)行編輯:將ID設(shè)置為IDD_DIALOG_COLOR,雙擊對話框,將會彈出信息框,詢問就是否為該對話框創(chuàng)建新得類,如圖選擇,會彈出如下對話框,如圖所示進(jìn)行選擇與命名,在ClassView中會出現(xiàn)CDialogColor得類,在該類中添加共有成員變量:public:intR;intG;intB;回到ResourceView中得對話框編輯界面,雙擊對話框中得”編輯”按鈕,分別創(chuàng)建響應(yīng)函數(shù),在響應(yīng)函數(shù)中如下去寫:voidCDialogColor::OnChangeColorR(){?//TO(shè)DO:IfthisisaRICHEDITcontrol,thecontrolwillnot?//sendthisnotificationunlessyouoverridetheCDialog::OnInitDialog() //functionandcallCRichEditCtrl()、SetEventMask() //withtheENM_CHANGEflagORedintothemask、 //TODO:Addyourcontrolnotificationhandlercodehere CStringstrR;//定義String類型變量strR,用來保存編輯框中傳入得值 GetDlgItemText(IDC_COLOR_R,strR);//通過GetDlgItemText函數(shù)獲得編輯框中傳入得值并賦給strR,其中得參數(shù)分別為編輯框得ID、變量strR?R=atof(strR);//將strR轉(zhuǎn)化為浮點數(shù),并賦值給R}voidCDialogColor::OnChangeColorG(){ //TODO:IfthisisaRICHEDITcontrol,thecontrolwillnot //sendthisnotificationunlessyouoverridetheCDialog::OnInitDialog()?//functionandcallCRichEditCtrl()、SetEventMask()?//withtheENM_CHANGEflagORedintothemask、 //TO(shè)DO:Addyourcontrolnotificationhandlercodehere?CStringstrG; GetDlgItemText(IDC_COLOR_G,strG); G=atof(strG);}voidCDialogColor::OnChangeColorB(){ //TODO:IfthisisaRICHEDITcontrol,thecontrolwillnot //sendthisnotificationunlessyouoverridetheCDialog::OnInitDialog() //functionandcallCRichEditCtrl()、SetEventMask() //withtheENM_CHANGEflagORedintothemask、 //TODO:Addyourcontrolnotificat(yī)ionhandlercodehere?CStringstrB;?GetDlgItemText(IDC_COLOR_B,strB); B=at(yī)of(strB);}通過以上代碼,就可以獲取對話框中輸入得值了,就可以在View類中使用它們:為View類添加私有成員變量:intR;intG;intB;在自定義得響應(yīng)函數(shù)中添加如下代碼:voidCMyDraw2_0View::OnMenuPenColorCustom(){?//TODO:Addyourmandhandlercodehere CDialogColorDlgColor;創(chuàng)建CDialogColor得引用 DlgColor、DoModal();調(diào)用DoModal()函數(shù)彈出對話框 R=DlgColor、R;//將CDialogColor中得R賦給View類得R G=DlgColor、G;//將CDialogColor中得G賦給View類得G B=DlgColor、B;//將CDialogColor中得B賦給View類得B?pen_color=RGB(R,G,B);//將傳入得值作為RGB值}畫硬幣畫硬幣菜單下有四個選項:畫、增加、減少、清除顯然,就是在點擊”畫”之后才開始在窗口上顯示畫出得硬幣,由于畫硬幣得代碼直接寫在View類得OnDraw中,所以需要一個標(biāo)記,判斷就是否需要畫:為View類添加私有成員變量:booldraw;在View類構(gòu)造函數(shù)中初始化該變量:draw=false;在”畫”得響應(yīng)函數(shù)中將其標(biāo)記為true:draw=true;這樣,在OnDraw函數(shù)中就會根據(jù)draw得值判斷就是否開始畫硬幣。畫硬幣還需要知道硬幣得數(shù)量,而且,在畫得時候,使用橢圓代替硬幣,變化得只就是橢圓得兩個縱坐標(biāo),所以,還需要為View類添加三個私有成員變量:intCoinsNumber;//硬幣得數(shù)量 intcoin_ly;//橢圓左上角得縱坐標(biāo)?intcoin_ry;//橢圓右上角得縱坐標(biāo)在構(gòu)造函數(shù)中初始硬幣數(shù)量:CoinsNumber=10;在OnDraw函數(shù)中,先定義第一個硬幣得左、右縱坐標(biāo):coin_ly=300;coin_ry=330;然后判斷就是否開始畫硬幣,當(dāng)條件為真時開始畫硬幣,代碼如下:if(draw){for(inti=0;i〈CoinsNumber;i++)//利用for循環(huán),畫出相應(yīng)數(shù)量得橢圓 {? pDC—>Ellipse(100,coin_ly,300,coin_ry);//畫出橢圓? coin_ly-=10;//循環(huán)一次就將左上角得縱坐標(biāo)—10,表示下一個橢圓得位置上移10??coin_ry—=10;//循環(huán)一次就將右下角得縱坐標(biāo)—10,表示下一個橢圓得位置上移10?}}此時,如果在菜單里選擇”畫”選項,就需要調(diào)用OnDraw()函數(shù),在響應(yīng)函數(shù)中添加如下代碼:CDC*pDC=GetDC();?OnDraw(pDC);在此基礎(chǔ)上,增加對硬幣數(shù)量得增減操作:很明顯,增減硬幣操作就是在畫硬幣之后才會執(zhí)行,所以需要一個標(biāo)記來判斷就是否已經(jīng)畫出硬幣:為View類添加一個私有成員變量:boolmenu_draw_coin;//用來標(biāo)記菜單里”畫"選項就是否執(zhí)行在View類構(gòu)造函數(shù)里初始化該變量:menu_draw_coin=false;當(dāng)選擇"畫"時,將該變量標(biāo)記為true:menu_draw_coin=true;已經(jīng)有了標(biāo)記后,只需判斷就是否已經(jīng)執(zhí)行"畫"命令,再對硬幣得數(shù)量進(jìn)行增減,代碼如下:voidCMyDraw2_0View::OnMenuDrawcoinAdd(){?if(menu_draw_coin)//判斷就是否已經(jīng)執(zhí)行過"畫”命令 {??draw=true;//將draw標(biāo)記為true,以便OnDraw函數(shù)中得畫硬幣順利執(zhí)行 CDC*pDC=GetDC();//打開圖形設(shè)備接口??//TODO:Addyourmandhandlercodehere??if(CoinsNumber<=30)//為硬幣數(shù)量設(shè)置最大值 CoinsNumber++;//將硬幣數(shù)量+1??GetDocument()-〉UpdateAllViews(NULL);//刷新視圖 ??ReleaseDC(pDC);//釋放?}}voidCMyDraw2_0View::OnMenuDrawcoinReduce(){?if(menu_draw_coin)//判斷就是否已經(jīng)執(zhí)行過”畫”命令?{ ?draw=true;;//將draw標(biāo)記為true,以便OnDraw函數(shù)中得畫硬幣順利執(zhí)行??CDC*pDC=GetDC();//打開圖形設(shè)備接口 ?//TODO:Addyourmandhandlercodehere?

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論