MFC課程設(shè)計實驗報告.doc_第1頁
MFC課程設(shè)計實驗報告.doc_第2頁
MFC課程設(shè)計實驗報告.doc_第3頁
MFC課程設(shè)計實驗報告.doc_第4頁
MFC課程設(shè)計實驗報告.doc_第5頁
免費預(yù)覽已結(jié)束,剩余48頁可下載查看

下載本文檔

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

文檔簡介

MFC課程設(shè)計面向?qū)ο罂梢暬瘜ο缶幊陶n程設(shè)計總結(jié)報告班級: 學號: 姓名: 2016.12.12-2016.12.23目錄一、課程設(shè)計的目的3二、課程設(shè)計的內(nèi)容與設(shè)計思路31.課設(shè)內(nèi)容32.設(shè)計思路4三、程序?qū)崿F(xiàn)過程與細節(jié)51.涉及的主要函數(shù)列表52.工程的新建73.建立圖元屬性對話框74.控件的關(guān)聯(lián)95.枚舉型106.定義動態(tài)數(shù)組117.建立Shape類及其子類128OnDraw()159. 鼠標左鍵消息響應(yīng)函數(shù)1610.鼠標右鍵雙擊消息響應(yīng)函數(shù)1711顏色按鈕1812獲取鼠標點擊處的邏輯坐標1913.對話框中控件的顯示與隱藏1914.文檔的存取20四、運行效果211.編譯運行,按下Ctrl+鼠標左鍵212.選擇文本,彈出角度框213.創(chuàng)建正方形、圓形、文本224.創(chuàng)建三角形和橢圓225.單擊鼠標左鍵修改正方形和文本屬性236.右鍵雙擊刪除三角形237.保存退出24五、設(shè)計小結(jié)24六、主要代碼清單251Shape.h252.Shape.cpp293.LwhView.cpp44一、課程設(shè)計的目的1. 參加本課程設(shè)計的同學已經(jīng)學習了C語言程序設(shè)計和面向?qū)ο罂梢暬幊虄砷T課程,現(xiàn)在需要通過一個相對實際性的開發(fā)過程來鞏固與鑒定一下學習成效,可以查看離實際需要還有哪些部分沒有完全掌握,需要加強檢測;2. 本課程設(shè)計可以提供一個稍微具有規(guī)模的程序開發(fā)的例子,讓同學們可以體會到程序的構(gòu)思、編碼以及調(diào)試的完整過程,最后并總結(jié)課程設(shè)計的過程;3.通過本次課程設(shè)計,可以對自身做一個評估,看看在哪方面不足從而加強學習;二、課程設(shè)計的內(nèi)容與設(shè)計思路1.課設(shè)內(nèi)容要求:采用單文檔方式,文檔中存儲圖形畫面的各個圖元數(shù)據(jù),視圖負責圖形的繪制。文檔支持圖形的序列化(連載),提供新建、打開、保存等操作。視圖除了繪制圖形,還提供圖形交互,能夠按住Ctrl鍵再鼠標左鍵單擊來創(chuàng)建圖元,鼠標左鍵雙擊編輯修改圖元屬性,鼠標右鍵雙擊刪除圖元。圖元創(chuàng)建與修改時的參數(shù)由參數(shù)對話框來編輯。創(chuàng)建時以鼠標左擊時光標的所在位置作為基點來創(chuàng)建圖元。2.設(shè)計思路我們的最終目的是顯示一個單文檔窗口,且可利用從對話框中輸入的數(shù)據(jù)繪制圖形。所以,首先建立一個單文檔程序,再添加對話框,用來創(chuàng)建與修改圖形參數(shù),之后給對話框中的各復(fù)選框,編輯框,按鈕添加消息響應(yīng)函數(shù),進行控件關(guān)聯(lián),并利用枚舉型使參數(shù)傳遞。定義一個動態(tài)數(shù)組以存儲從對話框中獲取的數(shù)據(jù),之后添加Shape類,用來繪圖,由Shape類定義一個指針指向動態(tài)數(shù)組,便可從中讀出之前存儲的數(shù)據(jù)進行繪圖,從而達到目的,思路圖參考如圖1,2:圖1.Shape的六個派生類圖2.工程思路圖解三、程序?qū)崿F(xiàn)過程與細節(jié)1.涉及的主要函數(shù)列表附表1函數(shù)定義與功能一覽表序號函數(shù)名函數(shù)定義定義所在文件名函數(shù)功能1OnInitDialog()BOOL CType:OnInitDialog()Type.cpp對對話框進行初始化處理2OnOk()void CType:OnOK()Type.cpp按確定按鈕時調(diào)用3OnFillColorButton()void CType:OnFillColorButton()Type.cpp按下按鈕,彈出顏色選擇對話框4OnLinelColorButton()void CType:OnLineColorButton()Type.cpp按下按鈕,彈出顏色選擇對話框5OnDraw()void CLwhView:OnDraw(CDC* pDC)LwhView.cpp應(yīng)用程序窗口的客戶區(qū)進行繪圖6OnLButtonDown()void CLwhView:OnLButtonDown(UINT nFlags, CPoint point)LwhView.cpp按下鼠標左鍵,執(zhí)行該函數(shù)7OnRButtonDblClk()void CLwhView:OnRButtonDblClk(UINT nFlags, CPoint point)LwhView.cpp雙擊鼠標右鍵時,執(zhí)行該函數(shù)8OnSelchangeComBoxTuYuanType()void CType:OnSelchangeComBoxTuYuanType()LwhView.cpp選擇圖元屬性組合框時,顯示或隱藏某個編輯框9Serialize()void CSquare:Serialize(CArchive &ar)void CRectangle:Serialize(CArchive &ar)void CTriangle:Serialize(CArchive &ar)void CCircle:Serialize(CArchive &ar)void CEllipse:Serialize(CArchive &ar)void CText:Serialize(CArchive &ar)Shape.cpp將表單內(nèi)容序列化10CSquare()CSquare:CSquare()Shape.cpp缺省構(gòu)造函數(shù),初始化11CSquare()CRectangle()CCircle()CEllipse()CTriangle()Ctext()CSquare:CSquare()CRectangle:CRectangle()CCircle:CCircle()CEllipse:CEllipse()CTriangle:CTriangle()CText:CText()Shape.cpp接受由對話框傳遞過來的參數(shù)12Draw(CDC*pDC)void CSquare:Draw(CDC*pDC)void CRectangle:Draw(CDC*pDC)void CCircle:Draw(CDC*pDC)void CEllipse:Draw(CDC*pDC)void CTriangle:Draw(CDC*pDC)void CText:Draw(CDC*pDC)Shape.cpp繪制函數(shù)13IsMatched(CPoint pnt)bool CSquare:IsMatched(CPoint pnt)bool CRectangle:IsMatched(CPoint pnt)bool CCircle:IsMatched(CPoint pnt)bool CEllipse:IsMatched(CPoint pnt)bool CTriangle:IsMatched(CPoint pnt)bool CText:IsMatched(CPoint pnt)Shape.cpp圖元匹配函數(shù)圖3.主要函數(shù)OnLButtonDown()2.工程的新建打開Microsoft Visual C+ 6.0 點擊File New 在Projects中選擇 MFC AppWizard (exe) ; 在 Project name中輸入工程的名字Lwh,在 Location中選擇工程存放的路徑。填完后點擊OK按鈕。填完后點擊OK按鈕,在彈出來的對話框中我們選擇Single document,再點擊Finish,完成工程的創(chuàng)建。之后編譯運行,結(jié)果參見圖3。圖4.新建工程結(jié)果示意圖3.建立圖元屬性對話框點擊ResouceView,右擊Dialog插入Dialog,這時會彈出來一個對話框,雙擊“確定”按鈕,選擇“Create a new class”,點擊OK,設(shè)置類名為CTypeOK,之后設(shè)置對話框?qū)傩詾镮DD_TYType,參見圖4,繪制對話框,參見附表2.屬性表給各復(fù)選框、編輯框、按鈕修改屬性。附表2屬性表序號名稱ID7角度IDC_Angle1圖元類型IDC_m_ComBox_TuYuanType8線型IDC_m_ComBoxLineType2線色按鈕IDC_LineColorButton9線色(R/G/B)IDC_LineColor(R/G/B)3填充色按鈕IDC_FillColorButton10填充色(R/G/B)IDC_FillColor(R/G/B)4高度IDC_High11原點XIDC_OrgX5寬度IDC_Width12原點YIDC_OrgY6線寬IDC_LineWidth13填充風格IDC_m_ComBoxFillType圖5.構(gòu)造對話框結(jié)果示意圖4.控件的關(guān)聯(lián)要實現(xiàn)這個步驟,首先要明白在MFC中變量的聲明定義,對于控件關(guān)聯(lián)型的數(shù)值變量,value類型(double,int,CString等等),在生成時向?qū)湍阕隽?件事:1)在.h文件中進行聲明;2)在.cpp中的構(gòu)造函數(shù)中,進行了初始化;3)在.cpp文件中的DoDataExchange()中進行控件關(guān)聯(lián);DDX_Text(pDX, IDOK, m_btnTest);所以,要進行控件關(guān)聯(lián),要做的也是這三件事(可在ClassWizard中進行添加,則系統(tǒng)自動生成。下面介紹手動添加,以圖元類型IDC_m_ComBox_TuYuanType為例)1) 在Type.h中聲明:protected:CComboBox m_ComBox_TuYuanType;2)在Type.cpp中進行初始化:BOOL CType:OnInitDialog() (在ClassWizard中添加)CDialog:OnInitDialog();/ TODO: Add extra initialization herem_ComBox_TuYuanType.AddString(正方形);m_ComBox_TuYuanType.AddString(矩形);m_ComBox_TuYuanType.AddString(三角形);m_ComBox_TuYuanType.AddString(圓);m_ComBox_TuYuanType.AddString(橢圓);m_ComBox_TuYuanType.AddString(文本);m_ComBox_TuYuanType.SetCurSel(0);3)在Type.cpp中進行控件關(guān)聯(lián)(DoDataExchange()中):DDX_Control(pDX, IDC_ComBox_TuYuanType, m_ComBox_TuYuanType);5.枚舉型枚舉類型定義的一般形式為:enum 枚舉名枚舉值表 。在枚舉值表中應(yīng)羅列出所有可用值。這些值也稱為枚舉元素。注意枚舉值是常量,不是變量,不能再對它賦值。 枚舉元素本身由系統(tǒng)定義了一個表示序號的數(shù)值,從0開始順序定義為0,1,21)定義(Type.h)public:EnumTuYuanTyp m_TuYuanTyp;2)枚舉(Type.h)enum EnumTuYuanTyp EnumTuYuanTyp_Square,/正方形 EnumTuYuanTyp_Rectangle,/矩形 EnumTuYuanTyp_Triangle,/三角形 EnumTuYuanTyp_Circle,/圓 EnumTuYuanTyp_Ellipse,/橢圓 EnumTuYuanTyp_Text/文本;3) 利用枚舉型傳參(Type.cpp)void CType:OnOK() UpdateData();/ TODO: Add extra validation hereint iSel=m_ComBox_TuYuanType.GetCurSel();/得到當前選擇的索引值 switch(iSel)case 0:m_TuYuanTyp=EnumTuYuanTyp_Square; break;case 1: m_TuYuanTyp=EnumTuYuanTyp_Rectangle; break;case 2: m_TuYuanTyp=EnumTuYuanTyp_Triangle;break;case 3: m_TuYuanTyp=EnumTuYuanTyp_Circle;break;case 4:m_TuYuanTyp=EnumTuYuanTyp_Ellipse;break;case 5:m_TuYuanTyp=EnumTuYuanTyp_Text;break;default:ASSERT(0);CDialog:OnOK();6.定義動態(tài)數(shù)組1)定義(LwhDoc.h)public:CObArray m_Elements;2)清除(LwhDoc.cpp)/清除圖元地址,釋放空間CLwhDoc:CLwhDoc()for(int i=0;im_Elements.GetSize();i+)delete m_Elementsi;m_Elementsi=NULL;m_Elements.RemoveAll();7.建立Shape類及其子類一個類要支持支持序列化Serialize,必須從CObject派生,并且在類的聲明(.h文件)中包含DECLARE_SERIAL申明,在類的實現(xiàn)(.cpp)中包含IMPLEMENT_SERIAL申明。所以,要建立支持序列化的Shape類,首先選擇ClassView,鼠標右鍵單擊工程名,選擇New Class,在類的類型中選擇Generic Class,輸入類名CShape,并在下方Derived From中輸入CObject,繼承類型為public,點擊確定,系統(tǒng)會生成相應(yīng)的Shape.cpp文件和Shape.h文件。在Shape.h中定義其成員變量和成員函數(shù),注意OnDraw函數(shù)應(yīng)定義為純虛函數(shù)(參見附表1.函數(shù)定義與功能一覽表)。然后由Shape類派生其六個子類CSquare,CRectangle,CTriangle,CCircle,CEllipse,CText,繼承方式均為public,在子類中也定義其成員函數(shù)及變量(以CSquare為例)class CShape : public CObject public:CShape();virtual CShape();virtual void Draw(CDC*pDC)=0;/繪制圖元virtual bool IsMatched(CPoint pnt)=0;/點是否落在圖形內(nèi)部virtual void Serialize(CArchive& ar) = 0;int OrgX;int OrgY;int width;int high;int linewidth; int R1,R2,G1,G2,B1,B2;class CSquare:public CShapepublic:CSquare();CSquare(int x,int y,int w,int line,int r1,int g1,int b1,int r2,int b2,int g2);void Draw(CDC*pDC);/繪制bool IsMatched(CPoint pnt);/重載點pnt是否落在圖元內(nèi)virtual void Serialize(CArchive& ar );/序列化正方形圖元private:DECLARE_SERIAL(CSquare)/聲明類CSquare支持序列化;在Shape.cpp中對Shape類極其子類進行序列化,并寫入子類的成員函數(shù),完成繪圖和進行圖元匹配功能(以CSquare為例)IMPLEMENT_SERIAL(CSquare, CObject, 1) /實現(xiàn)類CSquare的序列化,指定版本為1void CSquare:Serialize(CArchive &ar)if (ar.IsStoring()ar OrgX OrgY;/原點坐標ar width;ar OrgX OrgY;/原點坐標ar width;ar linewidth;/線寬CSquare:CSquare()/缺省構(gòu)造函數(shù),初始化OrgX = 400;/原點坐標OrgY = 400;linewidth= 1;/線寬width = 100;CSquare:CSquare(int x, int y, int w,int line,int r1,int g1,int b1,int r2,int b2,int g2)OrgX = x;/原點坐標OrgY = y; linewidth=line;width = w;R1=r1;R2=r2;G1=g1;G2=g2;B1=b1;B2=b2; void CSquare:Draw(CDC*pDC)/繪制函數(shù)CPen pen, *pOldPen;pen.CreatePen(PS_SOLID, linewidth,RGB(R1,G1,B1);pOldPen = (CPen*)pDC-SelectObject(&pen);CBrush brush, *pOldBrush;brush.CreateHatchBrush(HS_DIAGCROSS, RGB(R2,G2,B2);pOldBrush = (CBrush*)pDC-SelectObject(&brush);pDC-Rectangle(OrgX - width / 2, OrgY -width / 2, OrgX + width / 2, OrgY + width / 2);pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);bool CSquare:IsMatched(CPoint pnt)/圖元匹配函數(shù)if (OrgX-width/2 = pnt.x & pnt.x = OrgX + width/2) & (OrgY - width/2 = pnt.y & pnt.y m_Elements.GetSize() 0)for (int i=0; i m_Elements.GetSize(); i+)p = (CShape*)pDoc-m_Elementsi;p-Draw(pDC);/ TODO: add draw code for native data here9. 鼠標左鍵消息響應(yīng)函數(shù)按下Ctrl+W組合鍵,在彈出的MFC ClassWizard 對話框中選擇Message Map,在Class name選擇CLwhView類,在Object ID中選擇CLwhView,在右邊的Messages中為其添加鼠標左鍵的消息響應(yīng)函數(shù)OnLButtonDown,雙擊OnLButtonDown函數(shù)(參見附表1.函數(shù)定義與功能一覽表),出現(xiàn)OnLButtonDown()的定義模塊,寫入以下代碼:CType dlg;if (nFlags&MK_CONTROL) = MK_CONTROL)/Ctrl鍵按下 dlg.DoModal();即可實現(xiàn)在單文檔運行界面按下Ctrl+鼠標左鍵彈出對話框的操作,但是,要實現(xiàn)當彈出對話框按下OK鍵就可以畫出圖形的操作,就得利用枚舉型傳過來的參數(shù)進行選擇判斷(switch語句),然后執(zhí)行畫圖操作(以CSquare為例)if (dlg.DoModal() = IDOK) switch(dlg.m_TuYuanTyp) case EnumTuYuanTyp_Square: p = new CSquare(dlg.X,dlg.Y,dlg.Width,dlg.LineWidth, dlg.LineColorR,dlg.LineColorG,dlg.LineColorB, dlg.FillColorR,dlg.FillColorG,dlg.FillColorB); break; 當不按下Ctrl鍵,直接按左鍵,要進行修改圖元屬性的功能,則也是在此處添加相應(yīng)代碼,對應(yīng)之前的按下Ctrl鍵的if語句,寫入else語句,添加重新繪圖的功能代碼即可。(具體見主要代碼清單)10.鼠標右鍵雙擊消息響應(yīng)函數(shù)與添加鼠標左鍵消息相應(yīng)的方法一樣(參見附表1.函數(shù)定義與功能一覽表),先在ClassWizard中添加,雙擊進入定義模塊,要實現(xiàn)右鍵雙擊刪除,并彈出一個警告是否刪除的對話框,首先得明白我們基于圖元的數(shù)據(jù)存儲在于動態(tài)數(shù)組m_Elements,所以,要刪除圖元,只需刪除該圖元對應(yīng)數(shù)組中存儲的數(shù)據(jù)即可,主要代碼如下:for (int i=0;i m_Elements.GetSize(); i+)p = (CShape*)pDoc-m_Elementsi;if (p-IsMatched(pntLogical)CCut cut;if(cut.DoModal()=IDOK) pDoc-m_Elements.RemoveAt(i); delete p; Invalidate(); 11顏色按鈕 CColorDialog類實現(xiàn)了標準的顏色對話框,因此用創(chuàng)建CColorDialog類的對象去調(diào)用DoModal()函數(shù),即可顯示出對話框,如果DoModal()返回IDOK,則用GetColor()來獲取顏色對話框中選擇的顏色值 ,以下是線色按鈕的相關(guān)代碼:void CType:OnLineColorButton() / TODO: Add your control notification handler code here COLORREF color = RGB(47, 78, 107);/ 顏色對話框的初始顏色 CColorDialog colorDlg(color); / 構(gòu)造顏色對話框,傳入初始顏色值 if (IDOK = colorDlg.DoModal() color = colorDlg.GetColor();/ 獲取顏色對話框中選擇的顏色值 SetDlgItemInt(IDC_LineColorR, GetRValue(color); / 在線色編輯框中顯示所選顏色的R分量值 SetDlgItemInt(IDC_LineColorG, GetGValue(color);/ 在線色編輯框中顯示所選顏色的G分量值SetDlgItemInt(IDC_LineColorB, GetBValue(color);/ 在線色編輯框中顯示所選顏色的B分量值 12獲取鼠標點擊處的邏輯坐標函數(shù):Point();函數(shù)功能:該函數(shù)檢取光標的位置,以屏幕坐標表示;函數(shù)原型:BOOL GetCursorPos(LPPOINT lpPoint);參數(shù):IpPoint; (參見附表1.函數(shù)定義與功能一覽表)POINT結(jié)構(gòu)指針:接收光標的屏幕坐標;代碼如下:CType:CType(CWnd* pParent /*=NULL*/): CDialog(CType:IDD, pParent)POINT point;GetCursorPos(&point);X = point.x; Y = point.y; 13.對話框中控件的顯示與隱藏首先要清楚控件的顯示與隱藏是基于對其他控件進行操作,在該工程中,要實現(xiàn)我在圖元屬性組合框中選擇“文本”,則出現(xiàn)角度框,而選擇其他則不出現(xiàn)角度框,所以,應(yīng)對該組合框添加消息相應(yīng)函數(shù),在ClassWizard中,選中IDC_m_ComBox_TuYuanType(參見附表1.函數(shù)定義與功能一覽表),選擇Messages為CBN_CELCHANGE,雙擊進入定義模塊,寫入如下代碼:void CType:OnSelchangeComBoxTuYuanType() / TODO: Add your control notification handler code hereint iSel=m_ComBox_TuYuanType.GetCurSel();/得到當前選擇的索引值 switch(iSel)case 0:case 1:case 2:case 3:case 4:GetDlgItem(IDC_STATIC1)-ShowWindow(SW_HIDE);/隱藏角度框GetDlgItem(IDC_Angle)-ShowWindow(SW_HIDE);break;case 5:GetDlgItem(IDC_STATIC1)-ShowWindow(SW_SHOW);/顯示角度框GetDlgItem(IDC_Angle)-ShowWindow(SW_SHOW);break;default:ASSERT(0);break;Invalidate();14.文檔的存取文檔的存儲主要通過文檔類重載成員函數(shù)Serialize來實現(xiàn)。void COovpExam1Doc:Serialize(CArchive& ar)m_Elements.Serialize(ar);/其中m_Elements是文檔用來保存圖元對象的數(shù)組四、運行效果1.編譯運行,按下Ctrl+鼠標左鍵圖6.按下Ctrl+鼠標鍵結(jié)果示意圖2.選擇文本,彈出角度框圖7.角度框的顯示結(jié)果示意圖3.創(chuàng)建正方形、圓形、文本圖8.創(chuàng)建圖形結(jié)果示意圖14.創(chuàng)建三角形和橢圓圖9.創(chuàng)建圖形結(jié)果示意圖5.單擊鼠標左鍵修改正方形和文本屬性圖10.修改圖形屬性結(jié)果示意圖6.右鍵雙擊刪除三角形圖11.彈出刪除警告窗口結(jié)果示意圖圖12.刪除三角形結(jié)果示意圖7.保存退出五、設(shè)計小結(jié)1. 通過這次實驗,進一步加深了我對類的運用,使我大概了解了構(gòu)造函數(shù)和析構(gòu)函數(shù)在程序中的應(yīng)用,這次查找錯處也使我更小心去注意程序的細節(jié)問題。2. 即使在MFC中,MFC雖然是VC+中的一個特色,對我來說還是有很多的地方并不了解。我對VC+缺乏整體上的認識,我只是在程式化的執(zhí)行它。比如說,在系統(tǒng)已給的類的搭建,類中成員函數(shù)的插入,已有類的功能等等諸多,我的了解尚為淺薄。3. 通過這次實驗至少得到了認識和了解windows繪圖的功能,比如: CDC類和CObject類以及其派生類的應(yīng)用,還在實驗中通過調(diào)用OnDraw函數(shù)繪制不同尺寸、顏色、風格的幾個圖形和圖位。但是要想熟練掌握還需要大量的實踐。4. 通過這次實驗我掌握了動態(tài)數(shù)組的應(yīng)用,動態(tài)數(shù)組相對于靜態(tài)數(shù)組來說可以更加有效利用存儲空間。而這也是我以前沒有掌握的知識。5. 面向?qū)ο蟮牟僮饕笏悸非逦^程嚴謹,就好似一個連環(huán)扣,缺一環(huán)而不可。這次實驗中我深刻地了解到了編寫程序的思路與實驗過程,我很珍惜這次經(jīng)驗。6. 最后,感謝那些給予我?guī)椭睦蠋熀屯瑢W們!大家辛苦了!六、主要代碼清單1Shape.h/ Shape.h: interface for the CShape class./#include afx.h#include Type.h#include math.h#if !defined(AFX_SHAPE_H_9F3D8253_0729_4802_9938_EDAA421048A0_INCLUDED_)#define AFX_SHAPE_H_9F3D8253_0729_4802_9938_EDAA421048A0_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000class CShape : public CObject public:CShape();virtual CShape();virtual void Draw(CDC*pDC)=0;/繪制圖元virtual bool IsMatched(CPoint pnt)=0;/點是否落在圖形內(nèi)部virtual void Serialize(CArchive& ar) = 0;int OrgX;int OrgY;int width;int high;int linewidth; int R1,R2,G1,G2,B1,B2;class CSquare:public CShapepublic:CSquare();CSquare(int x,int y,int w,int line,int r1,int g1,int b1,int r2,int b2,int g2);void Draw(CDC*pDC);/繪制bool IsMatched(CPoint pnt);/重載點pnt是否落在圖元內(nèi)virtual void Serialize(CArchive& ar );/序列化正方形圖元private:DECLARE_SERIAL(CSquare)/聲明類CSquare支持序列化; class CRectangle:public CShapepublic:CRectangle();CRectangle(int x,int y,int w,int h,int line,int r1,int g1,int b1,int r2,int b2,int g2);void Draw(CDC*pDC);/繪制bool IsMatched(CPoint pnt);/重載點pnt是否落在圖元內(nèi)virtual void Serialize(CArchive& ar );/序列化正方形圖元private:DECLARE_SERIAL(CRectangle)/聲明類CRectangle支持序列化;class CTriangle:public CShapepublic:CTriangle();CTriangle(int x,int y,int w,int h,int line,int r1,int g1,int b1,int r2,int b2,int g2);void Draw(CDC*pDC);/繪制bool IsMatched(CPoint pnt);/重載點pnt是否落在圖元內(nèi)virtual void Serialize(CArchive& ar );/序列化正方形圖private:DECLARE_SERIAL(CTriangle)/聲明類CTriangle支持序列化;class CCircle:public CShapepublic:CCircle();CCircle(int x,int y,int w,int line,int r1,int g1,int b1,int r2,int b2,int g2);void Draw(CDC*pDC);/繪制bool IsMatched(CPoint pnt);/重載點pnt是否落在圖元內(nèi)virtual void Serialize(CArchive& ar );/序列化正方形圖private:DECLARE_SERIAL(CCircle)/聲明類CCircle支持序列化;class CEllipse:public CShapepublic:CEllipse();CEllipse(int x,int y,int w,int h,int line,int r1,int g1,int b1,int r2,int b2,int g2);void Draw(CDC*pDC);/繪制bool IsMatched(CPoint pnt);/重載點pnt是否落在圖元內(nèi)virtual void Serialize(CArchive& ar );/序列化正方形圖private:DECLARE_SERIAL(CEllipse)/聲明類CEllipse支持序列化;class CText:public CShapepublic:CText();CText(int x,int y,int r1,int g1,int b1,int a);void Draw(CDC*pDC);/繪制bool IsMatched(CPoint pnt);/重載點pnt是否落在圖元內(nèi)virtual void Serialize(CArchive& ar );/序列化正方形圖private:int angle;DECLARE_SERIAL(CText)/聲明類CText支持序列化;#endif / !defined(AFX_SHAPE_H_9F3D8253_0729_4802_9938_EDAA421048A0_INCLUDED_)2.Shape.cpp/ Shape.cpp: implementation of the CShape class./#include afx.h#include stdafx.h#include Lwh.h#include Shape.h#include Type.h#include math.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endif/ Construction/Destruction/IMPLEMENT_SERIAL(CSquare, CObject, 1)/實現(xiàn)類CSquare的序列化,指定版本為1IMPLEMENT_SERIAL(CCircle, CObject, 1)IMPLEMENT_SERIAL(CRectangle, CObject, 1)IMPLEMENT_SERIAL(CEllipse, CObject, 1)IMPLEMENT_SERIAL(CTriangle, CObject, 1)IMPLEMENT_SERIAL(CText, CObject, 1)CShape:CShape()CShape:CShape()/正方形void CSquare:Serialize(CArchive &ar)if (ar.IsStoring()ar OrgX OrgY;/原點坐標ar width;ar OrgX OrgY;/原點坐標ar width;ar linewidth;/線寬CSquare:CSquare()/缺省構(gòu)造函數(shù),初始化OrgX = 400;/原點坐標OrgY = 400;linewidth= 1;/線寬width = 100;CSquare:CSquare(int x, int y, int w,int line,int r1,int g1,int b1,int r2,int b2,int g2)OrgX = x;/原點坐標OrgY = y; linewidth=line;width = w;R1=r1;R2=r2;G1=g1;G2=g2;B1=b1;B2=b2; void CSquare:Draw(CDC*pDC)/繪制函數(shù)CPen pen, *pOldPen;pen.CreatePen(PS_SOLID, linewidth,RGB(R1,G1,B1);pOldPen = (CPen*)pDC-SelectObject(&pen);CBrush brush, *pOldBrush;brush.CreateHatchBrush(HS_DIAGCROSS, RGB(R2,G2,B2);pOldBrush = (CBrush*)pDC-SelectObject(&brush);pDC-Rectangle(OrgX - width / 2, OrgY -width / 2, OrgX + width / 2, OrgY + width / 2);pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);bool CSquare:IsMatched(CPoint pnt)/圖元匹配函數(shù)if (OrgX-width/2 = pnt.x & pnt.x = OrgX + width/2) & (OrgY - width/2 = pnt.y & pnt.y = OrgY+width/2)return true;elsereturn false;/矩形void CRectangle:Serialize(CArchive &ar)if (ar.IsStoring()ar OrgX OrgY;/原點坐標ar width;ar high;ar OrgX OrgY;/原點坐標ar width;ar high;ar linewidth;/線寬CRectangle:CRect

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論