c++課程設計-交互式繪圖軟件設計指導書_第1頁
c++課程設計-交互式繪圖軟件設計指導書_第2頁
c++課程設計-交互式繪圖軟件設計指導書_第3頁
c++課程設計-交互式繪圖軟件設計指導書_第4頁
c++課程設計-交互式繪圖軟件設計指導書_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質文檔-傾情為你奉上精選優(yōu)質文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質文檔-傾情為你奉上專心-專注-專業(yè)C+面向對象程序設計課程設計指導書指導實例:交互式繪圖軟件設計指導書說明:1.本實例軟件經(jīng)設計實作,為可實際運行的軟件。指導書中所列程序代碼,均為VC+6.0編程環(huán)境中可運行代碼復制所得,所列示圖,均為制作過程中屏幕截圖,其目的是使學習者盡快弄清設計原理,掌握過程、方法,起到舉一反三、正真領會面向對象程序設計的思想方法,原理,和操作技能的作用。使用中,“1.設計原理”(第3頁),供系統(tǒng)設計分析用,實際操作可從“2.操作過程與步驟”(第6頁)開始。2.其余推薦題目,可根據(jù)

2、自身實際情況,酌情參考使用。1.設計原理面向對象的程序設計是現(xiàn)在最外流行的程序設計方法。面向對象的方法模仿人們建立現(xiàn)實世界模型的方法,認為客觀世界是由各種各樣的對象組成的,每個對象都有各自的內部狀態(tài)和運動規(guī)律,不同對象之間的相互作用和聯(lián)系就構成了各種各樣的系統(tǒng)。利用人們對事物分類和抽象的自然傾向,引進了類的概念,具有封裝性、繼承性和多態(tài)性等特點。面向對象的程序設計吸取了傳統(tǒng)的結構化程序設計的優(yōu)點,采用數(shù)據(jù)抽象和信息隱藏技術、將數(shù)據(jù)與操作封裝在一起,用類來抽象代表現(xiàn)實的實體,用類之間的繼承關系來代表設計的抽象過程,將問題求解看作是一個非類演繹過程。1.1 類與數(shù)據(jù)封裝在C+中,類是指由用戶定義的

3、一種抽象數(shù)據(jù)類型,將一組具有相關性的數(shù)據(jù)成員結合在一起,要使用類中所包含的數(shù)據(jù)時,必須通過有該類所提供的成員函數(shù)來存取。數(shù)據(jù)封裝是指將類中的數(shù)據(jù)成員以其可被使用或不可被使用的方式進行分類,即有條件地限制類中部分或全部的數(shù)據(jù)成員被使用,在定義數(shù)據(jù)成員時在其前面冠以private、protected或public,分別表示私有的、保護的和公有的。因此,類是實現(xiàn)數(shù)據(jù)封裝的一個有力方法,類的特性是實現(xiàn)了數(shù)據(jù)封裝或數(shù)據(jù)抽象。在本設計中,可以把各種圖形形狀,如直線、矩形、圓、曲線、多邊形等定義為各種各樣的圖形類,將圖的具體繪制、存儲操作和屬性設置定義為圖形類的public成員函數(shù),這樣就實現(xiàn)了類與數(shù)據(jù)封裝

4、。例如,直線類可以定義為:class Clineprivate:COLORREF m_color;/直線的顏色int m_lineWidth, m_lineStyle;/直線的線寬和直線的線型POINT m_beginPoint, m_endPoint;/直線的起點和終點public:COLORREF getColor();/返回直線的顏色void setColor(COLORREF color);/設置直線的顏色int getLineStyle();/返回直線的線型void setLingStyle(UINT style);/設置直線的線型int getLineWidth();/返回直線的線

5、寬void setLineWidth(int width);/設置直線的線寬POINT getBeginPoint();/返回直線的起點POINT getEndPoint();/返回直線的終點void Draw(CDC *pDC);/直線的具體繪制void Serialize(CArchive &ar);;1.2 派生類與繼承性在C+中,派生類和繼承性是指用戶可以利用已有的類(稱為基類或父類)定義出新的類(派生類或子類),派生類中不但擁有基類中的全部或部分數(shù)據(jù)成員與成員函數(shù),而且還可以定義新的數(shù)據(jù)成員與成員函數(shù)。在本設計中,要繪制的圖形形狀很多,如直線、矩形、圓、曲線、多邊形等。雖然圖形的形狀

6、差別很大,其數(shù)據(jù)成員和成員函數(shù)也有許多不同之處,但是如果從抽象的角度出發(fā),它們有些數(shù)據(jù)成員和成員函數(shù)是相同的,如顏色、線型、線寬屬性以及設置或獲取這些屬性的成員函數(shù),因此可以把這些共同點定義為一個基類CShape,然后從CShape類派生出直線類、矩形類、圓類、曲線類、多邊形類等,這樣,每個派生類都繼承有這些共同點,又可以定義自己獨特的數(shù)據(jù)成員和成員函數(shù),程序結構更加簡練合理。CShape類的定義如下:class CShapeprotected:COLORREF m_color;/顏色int m_lineWidth, m_lineStyle;/線寬和線型public:virtual COLOR

7、REF getColor();/返回顏色virtual void setColor(COLORREF color);/設置顏色 virtual int getLineStyle();/返回線型virtual int setLineStyle(int style);/設置線型virtual int getLineWidth();/返回線寬virtual void setLineWidth(int width);/設置線寬virtual void Draw(CDC *pDC);/繪圖virtual void Serialize(Carchive &ar);/存儲操作;而CLine類派生于CShap

8、e類,定義如下:class CLine: public CShapeprivate:POINT m_beginPoint, m_endPoint;/直線的起點和終點public:POINT getBeginPoint();/返回直線的起點POINT getEndPoint();/返回直線的終點void Draw(CDC *pDC);/直線的具體繪制void Serialize(Carchive &ar);/直線的具體存儲操作;1.3 虛函數(shù)與多態(tài)性在面向對象中,多態(tài)性是指一個名字有多種含義,或相同界面有多種實現(xiàn)。在繼承體系中,如果在派生類中對所繼承的成員函數(shù)重新定義其功能,該函數(shù)應在基類中被定

9、義為虛函數(shù),在成員函數(shù)定義時在其前面加上關鍵字virtual。C+系統(tǒng)能自動判別應該調用哪一個類對象的成員函數(shù)。因此,虛函數(shù)是一種單界面多實現(xiàn)版本的方法,即函數(shù)名、返回類型、參數(shù)類型和個數(shù)及順序完全相同,但函數(shù)體內容可以完全不同。在本設計中,可以把抽象的圖形基類CShape的繪圖操作Draw定義為虛函數(shù),直線、矩形、圓、曲線、多邊形等作為CShape的派生類,把它們的具體繪圖操作定義在各自類中,保留其函數(shù)原型(函數(shù)名、返回值類型、參數(shù)個數(shù)及類型、順序)都不變,然后用指向基類CShape的指針來調用Draw函數(shù),就可以實現(xiàn)虛函數(shù)與多態(tài)性,即同樣的調用語句因指針所指向的對象不同而畫出不同的圖像。如

10、下所示:CShape *pShape;/定義指向基類CShape的指針pShapeCLine line;/定義一個直線類的對象linepShape=&line;/將line的地址賦給pShapepShape-Draw(pDC);/繪制直線Crectangle rect;/定義一個矩形類的對象rectpShape=▭/將CRectangle的地址賦給pShapepShape-Draw(pDC);/繪制矩形CCircle circle ;/定義一個圓對象circlepShape=&circle;/將circle的地址賦給pShapepShape-Draw(pDC);/繪制圓可見,同樣的語

11、句“pShape-Draw(pDC);”,卻能繪制出不同的圖形,這就是虛函數(shù)與多態(tài)性的功能特點。1.4 數(shù)據(jù)存儲與屏幕重繪繪圖程序Draw要求能用鼠標在屏幕上繪制直線、貝濟埃曲線、圓、橢圓、矩形、多邊形等基本二維圖形,并提供相應的文件保存和屏幕重繪功能。二維圖形包括許多種類型,用于表征這些二維圖形對象的數(shù)據(jù)是不同的,它們都有顏色、線型和線寬3個屬性數(shù)據(jù),但它們的幾何數(shù)據(jù)不同,點用一個坐標點數(shù)據(jù)表示,直線、圓、橢圓和矩形用兩個坐標點數(shù)據(jù)表示,圓角矩形用兩個坐標點數(shù)據(jù)和兩個整型數(shù)據(jù)來表示,圓弧或橢圓弧、餅圖或扇形用4個坐標點數(shù)據(jù)表示,貝濟埃曲線用4個以上的坐標點數(shù)據(jù)表示,而多邊形所需的坐標點數(shù)據(jù)個

12、數(shù)是任意的。另外,對于封閉圖形,還可以有填充與不填充選擇,若填充,還可以選擇顏色、影線和圖案3種模式之一。因此,如何實現(xiàn)對這些具有不同數(shù)據(jù)類型和個數(shù)圖形對象的保存,以及如何根據(jù)保存的數(shù)據(jù)區(qū)別不同圖形對象并進行屏幕重繪,是本設計要解決的關鍵問題。從MFC的文檔/視圖結構可知,應用程序的數(shù)據(jù)保存專門由文檔類的Serialize函數(shù)負責具體完成,應用程序的數(shù)據(jù)顯示或屏幕重繪專門由視圖類的OnDraw函數(shù)負責具體完成。如果在二維圖形基類CShape定義中把負責數(shù)據(jù)保存的成員函數(shù)Serialize和負責圖形繪制的成員函數(shù)Drawing說明為虛函數(shù),在派生類即具體的二維圖形類定義中只對Serialize和

13、Drawing的函數(shù)內容重新定義,保留其函數(shù)名、返回值類型和參數(shù)(包括類型和個數(shù))不變,用一個指向基類CShape的指針訪問虛函數(shù)Serialize和Drawing,就可以實現(xiàn)畫圖程序具有不同數(shù)據(jù)類型和個數(shù)的二維圖形對象的保存,以及根據(jù)保存的數(shù)據(jù)區(qū)別不同圖形對象在屏幕上重新繪制出來。在MFC類庫中,集合類是專門用于數(shù)據(jù)保存的。集合類又分為數(shù)組類、鏈表類和映射類(也稱數(shù)據(jù)字典類)。它們都能適用于各種數(shù)據(jù)類型,如BYTE、WORD、int、float、String、對象地址或對象指針等。從前面的分析可以看出,在畫圖程序中需要保存的數(shù)據(jù)是各二維圖形對象的地址,因此可以選用數(shù)組類的CObArray/C

14、PtrArray或鏈表類的CObList/CPtrList。在MFC中,數(shù)組是采用動態(tài)數(shù)組,鏈表是采用雙向鏈表。數(shù)組和鏈表對存取數(shù)據(jù)的操作各有優(yōu)缺點。在本設計中,可以簡單地選用CObArray來存放二維圖形對象的地址。1.5 設計思路綜上所述,可以總結設計思路如下:首先定義一個二維圖形的基類CShape,它包含顏色、線型和線寬3個共有的數(shù)據(jù)成員,定義串行化Serialize和繪圖Drawing兩個虛函數(shù),然后從CShape類派生上述各二維圖形類:CLine、CCircle、CEllipse、CRectangle、CBezier和CPolygon等,在每一個二維圖形類中定義自己的幾何數(shù)據(jù),定義構

15、造函數(shù)以便生產各自的圖形對象,重載Serialize和Drawing函數(shù),以實現(xiàn)各自不同的數(shù)據(jù)序列化和屏幕重繪。其次,在文檔類中定義一個可以保存各二維圖形對象地址的CObArray數(shù)組,并定義3個操作該CObArray數(shù)組的文檔類成員函數(shù)AddShape、GetShape、GetShapeNumber。視圖類是使用這些函數(shù)的重要用戶。在文檔類的Serialize函數(shù)中簡單地調用CObArray.Serialize函數(shù),而CObArray的Serialize函數(shù)又依據(jù)所存放的對象指針類型調用相應類對象的Serialize函數(shù),完成實際的數(shù)據(jù)讀寫操作,從而實現(xiàn)了二維圖形對象不同數(shù)據(jù)類型和個數(shù)的序列

16、化。再次,在用鼠標進行屏幕繪圖的鼠標消息處理函數(shù)代碼中,在OnLButtonUp函數(shù)內,對不同的二維圖形對象,分別調用各自的構造函數(shù)生成二維圖形對象,再把該二維圖形對象地址用AddShape函數(shù)保存在CObArray數(shù)組中,以矩形為例,如下所示:if(CurrentDraw= =DRAW_RECTANGLE)pShape=new CRectangle(m_pOrigin, point, m_pWidth, m_pStyle, m_pColor); /其他二維對象的相應語句段pDoc-AddShape(pShape);其中,pDoc為指向文檔的指針;m_pWidth、m_pStyle和m_pCo

17、lor為視圖類的數(shù)據(jù)成員,分別代表二維圖形的線寬、線型和顏色。最后,在OnDraw成員函數(shù)中定義一個基類CShape的指針變量pShape,采用循環(huán)方法遍歷CObArray數(shù)組中的所有元素,在for循環(huán)內把調用GetShape函數(shù)獲得的二維圖形對象的地址賦給pShape,用pShape調用虛函數(shù)Drawing,就可以實現(xiàn)虛函數(shù)的多態(tài)性,即相同的pShape-Drawing(pDC)函數(shù)調用語句,由于pShape所指向的對象不同,實現(xiàn)了調用不同Drawing函數(shù)體內容的目的。從而在屏幕上繪出不同的二維圖形。實現(xiàn)不同二維圖形對象的數(shù)據(jù)保存和屏幕重繪的過程可以概括為:在視圖類中利用鼠標消息處理函數(shù)用

18、鼠標繪出二維圖形,獲得數(shù)據(jù);調用各自的構造函數(shù)生成二維圖形對象,調用AddShape函數(shù)把二維圖形對象的地址保存在CObArray數(shù)組中;在OnDraw函數(shù)中,調用GetShape函數(shù)從CObArray數(shù)組中獲得二維圖形對象的地址,并賦給基類的指針變量pShape,用pShape調用Drawing虛函數(shù),實現(xiàn)了不同二維圖形對象的屏幕重繪;由于CObArray數(shù)組本身具有數(shù)據(jù)序列化功能,因此在文檔類的Serialize函數(shù)中只需加入對CObArray的Serialize函數(shù)的兩次調用,即可實現(xiàn)不同圖形對象的保存。2. 設計過程與步驟具體的設計過程,可按下列步驟進行。2.1建立繪圖程序框架本設計的

19、第一步是使用MFC AppWizard來建立繪圖程序的基本框架,步驟為:(1)從File菜單選擇New菜單項,彈出New對話框。(2)選擇Projects選項卡,從項目類型表框中選擇MFC AppWizard(exe),在Project name文本框中輸入繪圖程序的名字,這里設定為Draw,其他采用默認值。(3)單擊OK按鈕,彈出MFC AppWizard-Step 1對話框,選中Single document單選按鈕和“中文中國”選項,表示要生成以中文為用戶界面的單文檔(SDI)繪圖程序。(4)單擊Next按鈕,在圖2.4所示的MFC AppWizard-Step 6對話框中,單擊CDra

20、wView,在Base class的下拉列表框中選擇CScrollView,使視圖窗口具有滾動功能。(5)單擊Finish按鈕,表示使用隨后的各項默認設置,再單擊OK按鈕,MFC AppWizard自動生成繪圖程序的各項源文件。為了使繪圖區(qū)(視圖客戶區(qū))出現(xiàn)水平和垂直滾動條,必須知道圖形的總尺寸。為此,需要修改視圖類的OnInitiaUpdate函數(shù)的內容,將原來的語句:sizeTotal.cx=sizeTotal.cy=100;修改為:sizeTotal.cx=640; sizeTotal.cy=480;其他內容保留不變。AppWizard自動生成了完整的應用程序的基本框架,可以立即選擇Bu

21、ild菜單中的Execute Draw.exe菜單項,Visual C+首先進行編譯和鏈接,然后運行該應用程序,可以看到該程序是一個標準的Win32應用程序,它包含有標題、菜單欄、工具欄和狀態(tài)欄,許多命令都可以操作了。當然,因為還沒有給這個程序添加任何自己的代碼,所以它還不能做出任何有實際意義的操作。2.2 圖形類的定義按照前面分析的設計思路,要定義一個二維圖形的基類CShape,它包含顏色、線型和線寬3個共有的數(shù)據(jù)成員,定義串行化Serialize和繪圖Drawing兩個虛函數(shù),然后從CShape類派生各類二維圖形類:CLine、CBezier、CRect、CEllipse和CPolygon

22、,在每一個二維圖形類中定義自己的幾何數(shù)據(jù),定義構造函數(shù)以便生成各自的圖像對象,重載Serialize和Drawing函數(shù),以實現(xiàn)各自不同的數(shù)據(jù)序列化和屏幕重繪。為了把新定義的圖形類單獨存放在一個頭文件中,在Draw項目已打開的情況下,選擇Project Add To Project New命令,在隨之彈出的New對話框的Files選項卡中,選擇C/C+ Header File,在File文本框中輸入新類CShape的頭文件名shape,最后單擊OK按鈕即可。Visual C+關閉New對話框,并在用戶工作區(qū)中打開一個空白窗口,讓用戶進行新類的定義。重復上述步驟,但在New對話框的Files選項

23、卡中,選擇C+ Source File,以便生成一個空白的實現(xiàn)文件。然后將下面7個類的定義代碼放到shape.h文件中,把它們的實現(xiàn)代碼放到shape.cpp文件中,并在shape.cpp文件的開頭加入下列兩行:#include “stdafx.h”#include “shape.h”最后在DrawDoc.h文件開頭加入對shape.h的包含語句:#include “shape.h”2.2.1 圖形基類CShape1. CShape定義代碼class CShape:public CObjectprotected:COLORREF m_pColor;int m_pWidth, m_pStyle;

24、CShape()DECLARE_SERIAL(CShape)public:virtual void Drawing(CDC *pDC)virtual void Serialize(CArchive &ar);2.CShape類實現(xiàn)代碼IMPLEMENT_SERIAL(CShape, CObject, 1)void CShape:Serialize(CArchive &ar)if(ar.IsStoring()arm_pColorm_pWidthm_pColorm_pWidthm_pStyle;2.2.2 直線類CLine1. CLine類定義代碼class CLine:public CShape

25、protected:POINT m_pStart, m_pEnd;CLine()DECLARE_SERIAL(CLine)public:CLine(POINT pStart, POINT pEnd, int Width, int Style, COLORREF color);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);2. CLine類實現(xiàn)代碼IMPLEMENT_SERIAL(CLine, CShape, 1)CLine:CLine(POINT pStart, POINT pEnd, int Width, int St

26、yle, COLORREF Color)m_pStart=pStart; m_pEnd=pEnd;m_pWidth=Width; m_pStyle=Style; m_pColor=Color;void CLine:Drawing(CDC *pDC)CPen NewPen, *pOldPen;NewPen.CreatePen(m_pStyle, m_pWidth, m_pColor);pOldPen=pDC-SelectObject(&NewPen);pDC-MoveTo(m_pStart); pDC-LineTo(m_pEnd);pDC-SelectObject(pOldPen);void C

27、Line:Serialize(CArchive &ar)if(ar.IsStoring()arm_pStart.xm_pStart.ym_pEnd.xm_pStart.xm_pStart.ym_pEnd.xm_pEnd.y;CShape:Serialize(ar);2.2.3 貝濟埃曲線類CBezier1. CBezier類定義代碼class CBezier:public CShapeprotected:POINT m_pPoints20;int m_pNum;CBezier()DECLARE_SERIAL(CBezier)public:CBezier(POINT points20, int

28、n, int Width, int Style, COLORREF color);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);2. CBezier類實現(xiàn)代碼IMPLEMENT_SERIAL(CBezier, CShape, 1)CBezier:CBezier(POINT points20, int n, int Width, int Style, COLORREF Color)m_pNum=n;for(int i=0; iSelectObject(&NewPen);pDC-PolyBezier(m_pPoints, m

29、_pNum);pDC-SelectObject(pOldPen);void CBezier:Serialize(CArchive &ar)int i;if(ar.IsStoring()arm_pNum;for(i=0; im_pNum; i+) arm_pNum;for(i=0; im_pPointsi;CShape:Serialize(ar);2.2.4 矩形類CRectangle1. CRectangle類定義代碼class CRectangle:public CShapeprotected:POINT m_pFP, m_pSP;COLORREF m_FColor;int m_FFlag,

30、 m_HFlag, m_pHatch;CRectangle()DECLARE_SERIAL(CRectangle)public:CRectangle(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color,int m_FFlag, COLORREF FColor, int HFlag, int pHatch);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);2. CRectangle類實現(xiàn)代碼IMPLEMENT_SERIAL(CRectangle, CShape

31、, 1)CRectangle:CRectangle(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color, int FFlag, COLORREF FColor, int HFlag, int pHatch)m_pFP=pFP; m_pSP=pSP;m_pWidth=Width; m_pStyle=Style; m_pColor=Color;m_FFlag=FFlag; m_FColor=FColor;m_HFlag=HFlag; m_pHatch=pHatch;void CRectangle:Drawing(CDC *pDC)C

32、Pen NewPen, *pOldPen;NewPen.CreatePen(m_pStyle, m_pWidth, m_pColor);pOldPen=pDC-SelectObject(&NewPen);pDC-SelectStockObject(NULL_BRUSH);CBrush NewBrush, *pOldBrush;if(m_FFlag)if(m_HFlag=0)NewBrush.CreateSolidBrush(m_FColor);elseNewBrush.CreateHatchBrush(m_pHatch, m_FColor);pOldBrush=pDC-SelectObject

33、(&NewBrush);pDC-Rectangle(m_pFP.x, m_pFP.y, m_pSP.x, m_pSP.y);pDC-SelectObject(pOldPen);if(m_FFlag) pDC-SelectObject(pOldBrush);void CRectangle:Serialize(CArchive &ar)if(ar.IsStoring()arm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_FColorm_HFlagm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_FColorm_HFlagm_pHatch;CShap

34、e:Serialize(ar);2.2.5 圓類CCircle1. CCircle類定義代碼class CCircle: public CShapeprotected:POINT m_pFP, m_pSP;COLORREF m_FColor;int m_FFlag, m_HFlag, m_HPattern;CCircle()DECLARE_SERIAL(CCircle)public:CCircle(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color, int m_FFlag, COLORREF FColor, int HFlag

35、, int HPattern);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);void VCCircle(CDC *pDC);2. CCircle類實現(xiàn)代碼IMPLEMENT_SERIAL(CCircle, CShape, 1)CCircle:CCircle(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color, int FFlag, COLORREF FColor, int HFlag, int HPattern)m_pFP=pFP; m_pSP=pSP;

36、m_pWidth=Width; m_pStyle=Style; m_pColor=Color;m_FFlag=FFlag; m_FColor=FColor;m_HFlag=HFlag; m_HPattern=HPattern;void CCircle:Drawing(CDC *pDC)CPen NewPen, *pOldPen;NewPen.CreatePen(m_pStyle, m_pWidth, m_pColor);pOldPen=pDC-SelectObject(&NewPen);pDC-SelectStockObject(NULL_BRUSH);CBrush NewBrush, *pO

37、ldBrush;if(m_FFlag)if(m_HFlag=0)NewBrush.CreateSolidBrush(m_FColor);elseNewBrush.CreateHatchBrush(m_HPattern, m_FColor);pOldBrush=pDC-SelectObject(&NewBrush);pDC-Ellipse(m_pFP.x, m_pFP.y, m_pSP.x, m_pSP.y);pDC-SelectObject(pOldPen);if(m_FFlag) pDC-SelectObject(pOldBrush);void CCircle:VCCircle(CDC *p

38、DC) CPen NewPen,*pOldPen;NewPen.CreatePen(m_pStyle,m_pWidth,m_pColor);pOldPen=pDC-SelectObject(&NewPen); pDC-SelectStockObject(NULL_BRUSH); CBrush NewBrush,*pOldBrush; if(m_FFlag)if(m_HFlag=0)NewBrush.CreateSolidBrush(m_FColor); else NewBrush.CreateHatchBrush(m_HPattern,m_FColor); pOldBrush=pDC-Sele

39、ctObject(&NewBrush);pDC-Ellipse(m_pFP.x,m_pFP.y,m_pSP.x,m_pSP.y); pDC-SelectObject(pOldPen); if(m_FFlag)pDC-SelectObject(pOldBrush);void CCircle:Serialize(CArchive &ar)if(ar.IsStoring()arm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_FColorm_HFlagm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_pColorm_HFlagm_HPattern;CS

40、hape:Serialize(ar);2.2.6 橢圓類CEllipse1. CEllipse類定義代碼class CEllipse: public CShapeprotected:POINT m_pFP, m_pSP;COLORREF m_FColor;int m_FFlag, m_HFlag, m_pHatch;CEllipse()DECLARE_SERIAL(CEllipse)public:CEllipse(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color,int m_FFlag, COLORREF FColor, in

41、t HFlag, int pHatch);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);2. CEllipse類實現(xiàn)代碼IMPLEMENT_SERIAL(CEllipse, CShape, 1)CEllipse:CEllipse(POINT pFP, POINT pSP, int Width, int Style, COLORREF Color, int FFlag, COLORREF FColor, int HFlag, int pHatch)m_pFP=pFP; m_pSP=pSP;m_pWidth=Width; m

42、_pStyle=Style; m_pColor=Color;m_FFlag=FFlag; m_FColor=FColor;m_HFlag=HFlag; m_pHatch=pHatch;void CEllipse:Drawing(CDC *pDC)CPen NewPen, *pOldPen;NewPen.CreatePen(m_pStyle, m_pWidth, m_pColor);pOldPen=pDC-SelectObject(&NewPen);pDC-SelectStockObject(NULL_BRUSH);CBrush NewBrush, *pOldBrush;if(m_FFlag)i

43、f(m_HFlag=0)NewBrush.CreateSolidBrush(m_FColor);elseNewBrush.CreateHatchBrush(m_pHatch, m_FColor);pOldBrush=pDC-SelectObject(&NewBrush);pDC-Ellipse(m_pFP.x, m_pFP.y, m_pSP.x, m_pSP.y);pDC-SelectObject(pOldPen);if(m_FFlag) pDC-SelectObject(pOldBrush);void CEllipse:Serialize(CArchive &ar)if(ar.IsStori

44、ng()arm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_FColorm_HFlagm_pFP.xm_pFP.ym_pSP.xm_pSP.ym_FFlagm_FColorm_HFlagm_pHatch;CShape:Serialize(ar);2.2.7 多邊形類CPolygon1. CPolygon類定義代碼class CPolygon: public CShapeprotected:POINT m_pPoints20;int m_pNum;COLORREF m_FColor;int m_FFlag, m_HFlag, m_pHatch;CPolygon()DEC

45、LARE_SERIAL(CPolygon)public:CPolygon(POINT points20, int n, int Width, int Style, COLORREF Color,int FFlag, COLORREF FColor, int HFlag, int pHatch);void Drawing(CDC *pDC);virtual void Serialize(CArchive &ar);2. CPolygon類實現(xiàn)代碼IMPLEMENT_SERIAL(CPolygon, CShape, 1)CPolygon:CPolygon(POINT points20, int n

46、, int Width, int Style, COLORREF Color, int FFlag, COLORREF FColor, int HFlag, int pHatch)m_pNum=n;for(int i=0; iSelectObject(&NewPen);pDC-SelectStockObject(NULL_BRUSH);CBrush NewBrush, *pOldBrush;if(m_FFlag)if(m_HFlag=0)NewBrush.CreateSolidBrush(m_FColor);elseNewBrush.CreateHatchBrush(m_pHatch, m_F

47、Color);pOldBrush=pDC-SelectObject(&NewBrush);pDC-Polygon(m_pPoints, m_pNum);pDC-SelectObject(pOldPen);if(m_FFlag) pDC-SelectObject(pOldBrush);void CPolygon:Serialize(CArchive &ar)int i;if(ar.IsStoring()arm_pNum;for(i=0; im_pNum; i+) arm_pPointsi;arm_FFlagm_FColorm_HFlagm_pNum;for(i=0; im_pPointsi;ar

48、m_FFlagm_FColorm_HFlagm_pHatch;CShape:Serialize(ar);2.3 增加繪圖菜單為了能通過選擇菜單而選擇繪圖命令,并能通過菜單而選擇顏色、線型和填充等選項,首先必須設計好“繪圖”和“選項”菜單,然后進行消息映射,編寫消息處理函數(shù)的代碼。1. 增加菜單資源打開資源瀏覽器窗口,顯示程序資源。單擊Draw Resource左邊的“+”,使文件夾擴展,然后雙擊Menu項下的IDR_MAINFRAME標識符,打開菜單編輯器窗口,單擊“幫助”菜單,按Insert鍵,插入一個空白框,輸入新菜單名“繪圖(&D)”。然后在“繪圖”菜單下增加繪制二維圖形的菜單項共6個,

49、按表2.1所示設置各菜單項的標題和ID值。表2.1 “繪圖”菜單的命令標識符和標題 ID標題(Caption)ID_DRAW_VCLINEID_DRAW_BEZIERID_DRAW_RECTANGLEID_DRAW_VCCIRCLEID_DRAW_VCELLIPSEID_DRAW_POLYGON直線(&L)貝濟埃曲線(&B)矩形(&R)圓(&C)橢圓(&E)多邊形(&P)接著,再次單擊“幫助”菜單,按Insert鍵,插入一個空白框,輸入新菜單名“選項(&O)”。然后在“選項”菜單下增加“畫筆”、“線型顏色”、“填充顏色”、“填充影線”、“無填充”5個菜單項,其中“填充影線”帶有7個子菜單,如圖

50、2.1和表2.2所示。圖2.1 “選項”菜單及其“填充影線”子菜單表2.2 “選項”菜單的命令標識符和標題 ID標題(Caption) ID_OPTIONS_PEN ID_OPTIONS_COLOR ID_OPTIONS_FILLCOLOR ID_OPTIONS_HATCHF ID_OPTIONS_HATCHB ID_OPTIONS_HATCHC ID_OPTIONS_HATCHD ID_OPTIONS_HATCHH ID_OPTIONS_HATCHV ID_OPTIONS_HATCHNULL 畫筆(&P)線型顏色(&C)填充顏色(&Y)斜線(&F)反斜線(&B) 十字線(&C) 斜十字線(&

51、D) 水平線(&H) 垂直線(&V) 無影線(&F) 2. 進行菜單命令的消息映射為了便于保留用戶對菜單的單擊選擇,需要把這些菜單命令消息都映射給文檔。首先對“繪圖”菜單進行消息映射。選擇View菜單下的ClassWizard菜單項,在ClassWizard對話框中選擇Message Maps選項卡,在Class name下拉列表框中選擇CDrawView類,在Object IDs列表框中選擇ID_DRAW_LINE,在Message列表框中選擇COMMAND,然后單擊Add Function按鈕,在隨后的一個確認對話框中單擊OK按鈕,完成一個消息映射。用同樣的方法對Object IDs列表框

52、中其他的5個ID號,ID_DRAW_BEZIER、ID_DRAW_RECTANGLE、ID_DRAW_CIRCLE、ID_DRAW_ELLIPSE和ID_DRAW_POLYGON進行消息映射。用同樣的方法對“選項”菜單下的菜單項進行消息映射。3. 編寫菜單命令的消息處理函數(shù)代碼為了便于源程序閱讀,定義一些符號常量來方便用戶對“繪圖”菜單的選擇。在視圖類實現(xiàn)文件(DrawView.cpp)的開頭添加如下:enum DRAW_VCLINE, DRAW_BEZIER, DRAW_RECTANGLE, DRAW_VCCIRCLE,DRAW_VCELLIPSE, DRAW_POLYGON;同時必須在視圖

53、類定義(DrawView.h)中定義一些變量來保留用戶對菜單所做的選擇,如下:public:int m_pWidth, m_pStyle;COLORREF m_pColor;int CurrentDraw;COLORREF m_FColor;int m_FFlag, m_Hatch, m_HFlag;然后在視圖類構造函數(shù)中添加CurrentDraw的初始化代碼,如下:m_pWidth=1; m_pStyle=PS_SOLID;m_pColor=RGB(0,0,0);CurrentDraw=DRAW_VCLINE;m_FColor=RGB(0,0,0);m_FFlag=0; m_HFlag=0;

54、在以生成的消息處理函數(shù)框架中添加如下代碼(粗體部分):void CDrawView:OnDrawVcline() / TODO: Add your command handler code hereCurrentDraw=DRAW_VCLINE;void CDrawView:OnDrawBezier() / TODO: Add your command handler code hereCurrentDraw=DRAW_BEZIER;void CDrawView:OnDrawRectangle() / TODO: Add your command handler code hereCurren

55、tDraw=DRAW_RECTANGLE;void CDrawView:OnDrawVccircle() / TODO: Add your command handler code hereCurrentDraw=DRAW_VCCIRCLE;void CDrawView:OnDrawVcellipse() / TODO: Add your command handler code hereCurrentDraw=DRAW_VCELLIPSE;void CDrawView:OnDrawPolygon() / TODO: Add your command handler code hereCurr

56、entDraw=DRAW_POLYGON;void CDrawView:OnOptionsColor() / TODO: Add your command handler code hereCColorDialog ColorDialog;if(ColorDialog.DoModal()=IDOK)m_pColor=ColorDialog.GetColor();m_FFlag=1;void CDrawView:OnOptionsFillcolor() / TODO: Add your command handler code hereCColorDialog ColorDialog;if(Co

57、lorDialog.DoModal()=IDOK)m_FColor=ColorDialog.GetColor();m_FFlag=1;void CDrawView:OnOptionsHatchb() / TODO: Add your command handler code herem_Hatch=HS_BDIAGONAL;m_HFlag=1;m_FFlag=1;void CDrawView:OnOptionsHatchc() / TODO: Add your command handler code herem_Hatch=HS_CROSS;m_HFlag=1;m_FFlag=1;void

58、CDrawView:OnOptionsHatchd() / TODO: Add your command handler code herem_Hatch=HS_DIAGCROSS;m_HFlag=1;m_FFlag=1;void CDrawView:OnOptionsHatchf() / TODO: Add your command handler code herem_Hatch=HS_FDIAGONAL;m_HFlag=1;m_FFlag=1;void CDrawView:OnOptionsHatchh() / TODO: Add your command handler code he

59、rem_Hatch=HS_HORIZONTAL;m_HFlag=1;m_FFlag=1;void CDrawView:OnOptionsHatchnull() / TODO: Add your command handler code herem_HFlag=0;void CDrawView:OnOptionsHatchv() / TODO: Add your command handler code herem_Hatch=HS_VERTICAL;m_HFlag=1;m_FFlag=1;void CDrawView:OnOptionsNofill() / TODO: Add your com

60、mand handler code herem_FFlag=0;2.4 在屏幕上畫圖為了能用鼠標在屏幕上作圖,當然必須要控制鼠標。控制鼠標的方法就是對鼠標消息進行映射,在鼠標消息的處理函數(shù)中加上畫圖的代碼,這是實現(xiàn)用鼠標在屏幕上畫圖的基本思路。由于在屏幕上(空白區(qū))畫圖是與視圖有關的,所以,以下的具體步驟都是在視圖類中進行的。1. 用ClassWizard映射鼠標消息在視圖類中用ClassWizard來映射鼠標消息的方法為:(1)從View菜單中選擇ClassWizard命令,彈出MFC ClassWizard對話框。(2)選擇Message Maps選項卡(一般默認為Message Maps

溫馨提示

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

評論

0/150

提交評論