用c++編畫板的實訓(xùn)報告_第1頁
用c++編畫板的實訓(xùn)報告_第2頁
用c++編畫板的實訓(xùn)報告_第3頁
用c++編畫板的實訓(xùn)報告_第4頁
用c++編畫板的實訓(xùn)報告_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、一 實訓(xùn)目的 (1)培養(yǎng)分析問題、解決問題的能力(2)培養(yǎng)考慮問題的周密性和邏輯思維能力(3)培養(yǎng)實際動手能力(4)培養(yǎng)C+知識的綜合運用能力二 實訓(xùn)任務(wù)和要求1.圖形: 帶顏色的圖形。(增加選色功能) 線粗不同的圖形。(修改線粗的功能) 塊狀圖。(圖形的填充色和邊線顏色可以不同,由用戶選擇) 等等。 2. 界面 工具欄,狀態(tài)欄,改變鼠標(biāo),查看窗口等等 3. 編輯 在重新打開時和在正常情況下一樣畫圖或者選中圖形進(jìn)行圖形編輯。 4. 文件保存 EMF文件, 導(dǎo)入位圖文件成為一個(由位圖填充的)矢量矩形等等。 5. 編輯 單個圖像拖動,改變圖形節(jié)點位置能夠進(jìn)行基本的圖形繪制功能:直線,圓、矩形和多

2、邊形; 數(shù)據(jù)保存功能,能夠把圖形數(shù)據(jù)保存到文件中; 簡單的編輯功能:改變線條和填充顏色以及線寬;三 實訓(xùn)過程和內(nèi)容3.1需求分析(1)認(rèn)識C+編程軟件C+是一種使用非常廣泛的計算機編程語言。C+是一種靜態(tài)數(shù)據(jù)類型檢查的,支持多重編程范式的通用程序設(shè)計語言。它支持過程化程序設(shè)計、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計、制作圖標(biāo)等等泛型程序設(shè)計等多種程序設(shè)計風(fēng)格。C+支持C語言的幾乎全部功能,在語法上與C語言僅有極微妙的差別;C+語言原本不具備面向?qū)ο蟮脑O(shè)計功能,然而隨著面向?qū)ο缶幊痰母拍畹奶岢鲆约叭鏙ava等語言的發(fā)展成熟,C+語言也開發(fā)出了支持面向?qū)ο蠊δ艿陌姹?,現(xiàn)在編程者常用的VC+就是一種面向?qū)ο蟮恼Z

3、言;C+強大(但容易失控的)模板功能使它能在編譯期完成許多工作,從而大大提高運行期效率。STL(C+標(biāo)準(zhǔn)模板庫,Standard Template Library);隨著STL的不斷發(fā)展,它已經(jīng)逐漸成為C+程序設(shè)計中不可或缺的部分,其效率可能比一般的native代碼低些,但是其安全性與規(guī)范性使它大受歡迎。(2)計算機圖形的認(rèn)識在計算機科學(xué)中,圖形和圖像這兩個概念是有區(qū)別的:圖形一般指用計算機繪制的畫面,如直線、圓、圓弧、任意曲線和圖表等;圖像則是指由輸入設(shè)備捕捉的實際場景畫面或以數(shù)字化形式存儲的任意畫面。圖像是由一些排列的像素組成的,在計算機中的存儲格式有BMP、PCX、TIF、GIFD等,一

4、般數(shù)據(jù)量比較大。它除了可以表達(dá)真實的照片外,也可以表現(xiàn)復(fù)雜繪畫的某些細(xì)節(jié),并具有靈活和富有創(chuàng)造力等特點,而與圖像不同,在圖形文件中只記錄生成圖的算法和圖上的某些特點,也稱矢量圖。在計算機還原時,相鄰的特點之間用特定的很多段小直線連接就形成曲線,若曲線是一條封閉的圖形,也可靠著色算法來填充顏色。它最大的優(yōu)點就是容易進(jìn)行移動、壓縮、旋轉(zhuǎn)和扭曲等變換。3.2 設(shè)計(1)C+程序中的應(yīng)用程序?qū)ο?(a)基于窗口的應(yīng)用程序還是使用MFC比較多,所以主要介紹一下MFC。CWnd窗口:它是大多數(shù)“看得見的東西”的父類(Windows里幾乎所有看得見的東西都是一個窗口,大窗口里有許多小窗口),比如視圖CVie

5、w、框架窗口CFrameWnd、工具條CToolBar、對話框CDialog、按鈕CButton,etc;一個例外是菜單(CMenu)不是從窗口派生的。CDocument文檔,負(fù)責(zé)內(nèi)存數(shù)據(jù)與磁盤的交互。最重要的是OnOpenDocument(讀入),OnSaveDocument(寫盤),Serialize(讀寫) CView視圖:負(fù)責(zé)內(nèi)存數(shù)據(jù)與用戶的交互。包括數(shù)據(jù)的顯示、用戶操作的響應(yīng)(如菜單的選取、鼠標(biāo)的響應(yīng))。最重要的是OnDraw(重畫窗口),通常用CWnd:Invalidate()來啟動它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。CDC設(shè)備文本:無論是顯示器還是打

6、印機,都是畫圖給用戶看。這圖就抽象為CDC。CDC與其他GDI(圖形設(shè)備接口)一起,完成文字和圖形、圖像的顯示工作。把CDC想象成一張紙,每個窗口都有一個CDC相聯(lián)系,負(fù)責(zé)畫窗口。CDC有個常用子類CClientDC(窗口客戶區(qū)),畫圖通常通過CClientDC完成。 CDialog:對話框 CWinApp應(yīng)用程序類:似于C中的main函數(shù),是程序執(zhí)行的入口和管理者,負(fù)責(zé)程序建立、消滅,主窗口和文檔模板的建立。CGdiObject及子類:用于向設(shè)備文本畫圖。它們都需要在使用前選進(jìn)DC。 CPen筆:畫線 CBrush刷子:填充 CFont字體:控制文字輸出的字體 CBitmap:位圖 CPal

7、ette:調(diào)色板 CRgn區(qū)域:指定一塊區(qū)域可以用于做特殊處理。 CFile文件:最重要的不外是Open(打開),Read(讀入),Write(寫) CString字符串:封裝了C中的字符數(shù)組CPoint點: (x,y)對 CRect矩形:(left,top,right,bottom) CSize大?。海╟x,cy)對(寬、高)(b) MFC五大群組General Purpose classes:提供字符串類、數(shù)據(jù)處理類(如數(shù)組與鏈表),異常情況處理類、文件類等。 Windows API classes:用來封裝Windows API,例如窗口類、對話框類、DC類等。 Application

8、framework classes:組成應(yīng)用程序骨干類,即此組類,包括Dcoument/View、消息泵、消息映射、消息傳遞、動態(tài)創(chuàng)建、文件讀寫等等。 High level abstractions:包括工具欄、狀態(tài)欄、拆分窗口、滾動窗口等等。視覺性UI對象屬于此類,例如工具欄CToolBar、狀態(tài)欄CStatusBar、對話框列CDialogBar。加強型的View也屬此類,如可滾動的ScrollView、以對話框為基礎(chǔ)的CFormView、小型文字編輯器CEditView、樹狀結(jié)構(gòu)的CTreeView,支持RTF文件格式的CRichEditView等等。 operation system

9、extensions:包括OLE、ODBC、DAO、MAPI、WinSock、ISAPI等等。(2)文檔對象、視圖對象和框架對象在MFC中引入了文檔-視圖結(jié)構(gòu)的概念,文檔相當(dāng)于數(shù)據(jù)容器,視圖相當(dāng)于查看數(shù)據(jù)的窗口或是和數(shù)據(jù)發(fā)生交互的窗口。因此一個完整的應(yīng)用一般由四個類組成:CWinApp應(yīng)用類,CFrameWnd窗口框架類,CDocument文檔類,CView視類。在程序運行時CWinApp將創(chuàng)建一個CFrameWnd框架窗口實例,而框架窗口將創(chuàng)建文檔模板,然后有文檔模板創(chuàng)建文檔實例和視實例,并將兩者關(guān)聯(lián)。一般來講我們只需對文檔和視圖進(jìn)行操作,框架的各種行為已經(jīng)被MFC安排好了而不需人為干預(yù),這

10、也是設(shè)計文檔-視結(jié)構(gòu)的本意,讓我們將注意力放在完成任務(wù)上而從界面編寫中解放出來。在應(yīng)用中一個視圖對應(yīng)一個文檔,但一個文檔可以包含多個視圖。一個應(yīng)用中只用一個框架窗口,對多文檔界面來講可能有多個MDI子窗口。每一個視圖都是一個子窗口,在單文檔界面中父窗口即是框架窗口,在多文檔界面中父窗口為MDI子窗口。一個多文檔應(yīng)用中可以包含多個文檔模板,一個模板定義了一個文檔和一個或多個視圖之間的對應(yīng)關(guān)系。同一個文檔可以屬于多個模板,但一個模板中只允許定義一個文檔。同樣一個視圖也可以屬于多個文檔模板。一般來說用戶的輸入/輸出基本都是通過視圖進(jìn)行,但一些例外的情況下可能需要和框架直接發(fā)生作用。 在使用菜單時大家

11、會發(fā)現(xiàn)當(dāng)一個菜單沒有進(jìn)行映射處理時為禁止?fàn)顟B(tài),在多視圖的情況下菜單的狀態(tài)和處理映射是和當(dāng)前活動視相聯(lián)系的,這樣MFC可以保證視他能正確的接收到各種消息,但有時候也會產(chǎn)生不便。有一個解決辦法就是在框架中對消息進(jìn)行處理,這樣也可以保證當(dāng)前文檔可以通過框架得到當(dāng)前消息。 在用戶進(jìn)行輸入后如何使視的狀態(tài)得到更新?這個問題在一個文檔對應(yīng)一個視圖時是不存在的,但是現(xiàn)在有一個文檔對應(yīng)了兩個視圖,當(dāng)在一個視上進(jìn)行了輸入時如何保證另一個視圖也得到通知呢?MFC的做法是利用文檔來處理的,因為文檔管理著當(dāng)前和它聯(lián)系的視圖,由它來通知各個視圖是最合適的。例如: void CView:OnUpdate( CView*

12、pSender, LPARAM lHint, CObject* pHint ) void CDocument:UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL ) 當(dāng)文檔的UpdateAllViews被調(diào)用時和此文檔相關(guān)的所有視圖對象的OnUpdate都會被調(diào)用,而參數(shù)lHint和pHint都會被傳遞。那么還有一個問題:如何在OnUpdate中知道是那個視圖發(fā)生了改變呢,這就可以利用pHint參數(shù),只要調(diào)用者將this指針賦值給參數(shù)就可以了,當(dāng)然完全可以利用該參數(shù)傳遞更復(fù)雜的結(jié)構(gòu)。 視圖對象的初始化

13、,當(dāng)一個文檔被打開或是新建一個文檔時視圖的CView:OnInitialUpdate()會被調(diào)用,你可以通過重載該函數(shù)對視圖對象進(jìn)行初始化,并在結(jié)束前調(diào)用父類的OnInitialUpdate,因為這樣可以保證OnUpdate會被調(diào)用。 文檔中內(nèi)容的清除,當(dāng)文檔被關(guān)閉時(比如退出或是新建前上一個文檔清除)void CDocument:DeleteContents ()會被調(diào)用,你可以通過重載該函數(shù)來進(jìn)行清理工作。 在單文檔結(jié)構(gòu)中上面兩點尤其重要,因為軟件運行文檔對象和視圖對象只會被產(chǎn)生并刪除一次。所以應(yīng)該將上面兩點和C+對象構(gòu)造和構(gòu)析分清楚。 文檔模板分為兩類單文檔模板和多文檔模板,分別由CSi

14、ngleDocTemplate和CMultiDocTemplate表示,模板的作用在于記錄文檔對象,視圖對象,框架對象之間的對應(yīng)關(guān)系。還有一點就是模板可以記錄應(yīng)用程序可以打開的文件的類型,當(dāng)打開文件時會根據(jù)文檔模板中的信息選擇正確的文檔和視圖。當(dāng)使用者通過視圖對象修改了數(shù)據(jù)時,應(yīng)該調(diào)用GetDocument()->SetModifiedFlag(TRUE)通知文檔數(shù)據(jù)已經(jīng)被更新,這樣在關(guān)閉文檔時會自動詢問用戶是否保存數(shù)據(jù)。(3)菜單設(shè)計 (a) 菜單的種類: 生成數(shù)據(jù) 插入排序 希爾排序 起泡排序 快速排序 選擇排序 堆排序 歸并排序(非遞歸) 歸并排序(遞歸) 退出(b) 工具條的實現(xiàn)

15、例如,24位工具條的實現(xiàn): 在mainframe.h文件中聲明成員變量: CToolBar m_hotToolBar; 在 CMainFrame:OnCreate() 中創(chuàng)建工具條,假設(shè)你已經(jīng)創(chuàng)建了一個ToolBar資源和兩個工具條位圖(Bitmap)資源:IDB_TOOLBAR_COLD 和 IDB_TOOLBAR_HOT,前者表示的是常態(tài)按鈕,而后者表示的是鼠標(biāo)移到上面時的狀態(tài)按鈕。用下面的代碼創(chuàng)建工具條: if(!m_hotToolBar.CreateEx(this,TBSTYLE_FLAT|TBSTYLE_LIST,WS_CHILD|WS_VISIBLE | CBRS_TOP| CBR

16、S_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_hotToolBar.LoadToolBar(IDR_HOTBAR)TRACE0("Failed to create toolbarn");return -1; / fail to create 在CMainFrame:OnCreate()中還要添加如下代碼,它們實現(xiàn)對位圖資源的存取: / Set up hot bar image lists.CImageList imageList;CBitmap bitmap;/ Create and set

17、the normal toolbar image list.bitmap.LoadBitmap(IDB_TOOLBAR_COLD);imageList.Create(21, 20, ILC_COLORDDB|ILC_MASK, 13, 1);imageList.Add(&bitmap, RGB(255,0,255);m_hotToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList.m_hImageList);imageList.Detach();bitmap.Detach();/ Create and set the hot

18、toolbar image list.bitmap.LoadBitmap(IDB_TOOLBAR_HOT);imageList.Create(21, 20, ILC_COLORDDB|ILC_MASK, 13, 1);imageList.Add(&bitmap, RGB(255,0,255);m_hotToolBar.SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM)imageList.m_hImageList);imageList.Detach();bitmap.Detach(); 添加24位色工具條按鈕的消息處理函數(shù),這個工具條有五個按鈕,那么在

19、 mainframe.h中加入消息處理函數(shù)聲明: afx_msg void OnBack();afx_msg void OnForward();afx_msg void OnStop();afx_msg void OnRefresh();afx_msg void OnHome();在mainframe.cpp中添加消息處理代碼:消息映射 ON_COMMAND(ID_BACK, OnBack)ON_COMMAND(ID_FORWARD, OnForward)ON_COMMAND(ID_STOP, OnStop)ON_COMMAND(ID_REFRESH, OnRefresh)ON_COMMAND

20、(ID_HOME, OnHome) 以上的結(jié)果如下圖:圖1 工具條示例(4)繪圖的實現(xiàn) 窗口消息:WM_CREATE,WM_DESTROY,WM_CLOSE我們創(chuàng)建一個窗口對象的時候,這個窗口對象在創(chuàng)建過程中收到的就是WM_CREATE消息,對這個消息的處理過程一般用來設(shè)置一些顯示窗口前的初始化工作,如設(shè)置窗口的大小,背景顏色等,WM_DESTROY消息指示窗口即將要被撤消,在這個消息處理過程中,我們就可以做窗口撤消前的一些工作。WM_CLOSE wm_close消息發(fā)生在窗口將要被關(guān)閉之前,在收到這個消息后,一般性的操作是回收所有分配給這個窗口的各種資源。 鍵盤消息:WM_CHAR,WM_K

21、EYDOWN,WM_KEYUP這三個消息用來處理用戶的鍵盤數(shù)據(jù),當(dāng)用戶在鍵盤上按下某個鍵的時候,會產(chǎn)生WM_KEYDOWN消息,釋放按鍵的時候又回產(chǎn)生WM_KEYUP消息,所以WM_KEYDOWN與WM_KEYUP消息一般總是成對出現(xiàn)的,至于WM_CHAR消息是在用戶的鍵盤輸入能產(chǎn)生有效的ASCII碼時才會發(fā)生。這里特別提醒要注意前兩個消息與WM_CHAR消息在使用上是有區(qū)別的。在前兩個消息中,伴隨消息傳遞的是按鍵的虛擬鍵碼,所以這兩個消息可以處理非打印字符,如方向鍵,功能鍵等。而伴隨WM_CHAR消息的參數(shù)是所按的鍵的ASCII碼,ASCII碼是可以區(qū)分字母的大小寫的。而虛擬鍵碼是不能區(qū)分大

22、小寫的。 鼠標(biāo)消息:WM_MOUSEMOVE,WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBCLICK,WM_RBUTTONDOWN, WM_RBUTTONUP,WM_RBUTTONDBCLICK這組消息是與鼠標(biāo)輸入相關(guān)的,WM_MOUSEMOVE消息發(fā)生在鼠標(biāo)移動的時候,剩余的六個消息則分別對應(yīng)于鼠標(biāo)左右鍵的按下、釋放、雙擊事件,要指出的是WINDOWS系統(tǒng)并不是在鼠標(biāo)每移動一個像素時都產(chǎn)生MOUSEMOVE消息,這一點要特別注意。 另一組窗口消息:WM_MOVE , WM_SIZE , WM_PAINT 當(dāng)窗口移動的時候產(chǎn)生WM_MOVE 消息,窗口的

23、大小改變的時候產(chǎn)生WM_SIZE消息,而當(dāng)窗口工作區(qū)中的內(nèi)容需要重畫的時候就會產(chǎn)生WM_PAINT消息。 焦點消息WM_SETFOCUS,WM_KILLFOCUS當(dāng)一個窗口從非活動狀態(tài)變?yōu)榫哂休斎虢裹c的活動狀態(tài)的時候,它就會收到WM_SETFOCUS消息,而當(dāng)窗口失去輸入焦點的時候它就會收到WM_KILLFOCUS消息。 定時器消息:WM_TIMER當(dāng)我們?yōu)橐粋€窗口設(shè)置了定時器資源之后,系統(tǒng)就會按規(guī)定的時間間隔向窗口發(fā)送WM_TIMER消息,在這個消息中就可以處理一些需要定期處理的事情。最后要指出的一點是,在WINDOWS環(huán)境下,消息的來源是多方面的,最常見的是用戶的操作產(chǎn)生消息,系統(tǒng)在必要的

24、時候也會向程序發(fā)送系統(tǒng)消息,其他在運行中的程序也可以向程序發(fā)送消息。此外,在程序的內(nèi)部,也可以根據(jù)需要在適當(dāng)?shù)臅r候主動產(chǎn)生消息,比如主動產(chǎn)生WM_PAINT消息以實現(xiàn)需要的重畫功能。例如,創(chuàng)建一個定時器。點擊查看,建立類向?qū)D2 創(chuàng)建定時器 建立類向?qū)纠?)在class name下點擊ctestview,然后再messages 選擇 WM TIMER。然后選擇Add Function. 圖3 創(chuàng)建定時器 建立類向?qū)纠?)自己命名一下確定就建立成功。 消除鼠標(biāo)移動過程中的繪圖痕跡void CShanView:OnDrawArraw() m_DrawMode=1;void CShanVie

25、w:OnUpdateDrawArraw(CCmdUI* pCmdUI) pCmdUI->SetCheck(m_DrawMode=1);void CShanView:OnDrawCircle() m_DrawMode=4;void CShanView:OnUpdateDrawCircle(CCmdUI* pCmdUI) pCmdUI->SetCheck( m_DrawMode=4);void CShanView:OnDrawLine() m_DrawMode=2;void CShanView:OnUpdateDrawLine(CCmdUI* pCmdUI) pCmdUI->Se

26、tCheck( m_DrawMode=2);void CShanView:OnDrawRect() m_DrawMode=3;void CShanView:OnUpdateDrawRect(CCmdUI* pCmdUI) pCmdUI->SetCheck(m_DrawMode=3);/void CShanView:OnDropFiles(HDROP hDropInfo) / TODO: Add your message handler code here and/or call default/CView:OnDropFiles(hDropInfo);/void CShanView:On

27、LButtonDown(UINT nFlags, CPoint point) CClientDC dc(this);dc.SetMapMode(MM_LOENGLISH);dc.DPtoLP(&point);m_originp = point; m_oldp = point;CView:OnLButtonDown(nFlags, point); void CShanView:OnMouseMove(UINT nFlags, CPoint point) CClientDC dc(this);dc.SetMapMode(MM_LOENGLISH); dc.DPtoLP(&point

28、);if(m_DrawMode != 0 )CPen *oldPen, pen(PS_DASH,1,RGB(0,0,0);oldPen = dc.SelectObject(&pen);dc.SetROP2(R2_NOTXORPEN);if(nFlags=MK_LBUTTON && m_DrawMode=2)dc.MoveTo(m_originp); dc.LineTo(m_oldp);dc.MoveTo(m_originp); dc.LineTo(point);if(nFlags=MK_LBUTTON && m_DrawMode=3)dc.Rectang

29、le(m_originp.x, m_originp.y, m_oldp.x, m_oldp.y);dc.Rectangle(m_originp.x, m_originp.y, point.x, point.y);if(nFlags=MK_LBUTTON && m_DrawMode=4)dc.Ellipse(m_originp.x, m_originp.y, m_oldp.x, m_oldp.y);dc.Ellipse(m_originp.x, m_originp.y, point.x, point.y);m_oldp=point; dc.SelectObject(oldPen)

30、;CView:OnMouseMove(nFlags, point);void CShanView:OnLButtonUp(UINT nFlags, CPoint point) if(m_DrawMode != 0)CShanDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CClientDC dc(this);dc.SetMapMode(MM_LOENGLISH);dc.DPtoLP(&point);CPen pen(PS_SOLID, m_penWidth, m_penColor);CPen *oldPen = dc.SelectObject(

31、&pen);CBrush brush(m_brushColor);CBrush *oldBrush = dc.SelectObject(&brush);if(m_DrawMode = 2)/dc.MoveTo(m_originp); dc.LineTo(point);MLine *p = new MLine(m_originp, point);pDoc->m_List.Add(p);p->m_brushColor = m_brushColor;p->m_penColor = m_penColor;p->m_penWidth = m_penWidth;p-

32、>Draw(&dc);if(m_DrawMode = 3)/dc.Rectangle(m_originp.x, m_originp.y, point.x, point.y);MRect *p = new MRect(m_originp, point);pDoc->m_List.Add(p);p->m_brushColor = m_brushColor;p->m_penColor = m_penColor;p->m_penWidth = m_penWidth;p->Draw(&dc);if(m_DrawMode = 4)/dc.Ellipse(

33、m_originp.x, m_originp.y, point.x, point.y);MCircle *p = new MCircle(m_originp, point);pDoc->m_List.Add(p);p->m_brushColor = m_brushColor;p->m_penColor = m_penColor;p->m_penWidth = m_penWidth;p->Draw(&dc); dc.SelectObject(oldPen);dc.SelectObject(oldBrush);CView:OnLButtonUp(nFlags,

34、 point);void CShanView:OnProPencolor() CColorDialog dlg;if(dlg.DoModal() = IDOK)m_penColor = dlg.GetColor();void CShanView:OnProBrushcolor() CColorDialog dlg;if(dlg.DoModal() = IDOK)m_brushColor = dlg.GetColor();void CShanView:OnProPenwidth() Cfgh dlg;dlg.DoModal();if(dlg.DoModal() = IDOK)m_penWidth

35、 = dlg.m_Width;void CShanView:OnMaaaaaaa() Cpp/shanDoc.cpp:implementation of the CShanDoc class/#include "stdafx.h"#include "shan.h"#include "shanDoc.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CShanDoc(5)圖形結(jié)構(gòu)的設(shè)計圖形是矢量圖。就是說繪

36、制出來的圖形數(shù)據(jù)是以坐標(biāo)形式存儲,而不是以位圖形式存儲。對矢量圖進(jìn)行任意倍數(shù)的放大縮小,圖形不會失真,線粗不變。 所謂線粗不變,是說比如原圖線粗是1,無論放大多少倍之后,線粗都是1,僅僅是圖像大小變化。 基本功能中只要求單色的線圖。就是說只需使用一種顏色作為圖形的邊線就可以了。圖形內(nèi)部是透明的。不需增加選色功能。并且圖形的線粗可以只是1, 不必增加線粗的改變功能。.帶顏色的圖形。(增加選色功能).線粗不同的圖形。(修改線粗的功能)圖形的填充色和邊線顏色可以不同,由用戶選擇等等。 例如:畫圖板的實現(xiàn)View窗口/ shanView.cpp : implementation of the CSha

37、nView class#include "stdafx.h"#include "shan.h"/#include "PenWidthDlg.h"#include "fgh.h"#include "shanDoc.h"#include "shanView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifIMPLEMENT_DYNCREATE(CSha

38、nView, CView)BEGIN_MESSAGE_MAP(CShanView, CView)/AFX_MSG_MAP(CShanView)ON_COMMAND(IDM_DRAW_ARRAW, OnDrawArraw)ON_UPDATE_COMMAND_UI(IDM_DRAW_ARRAW, OnUpdateDrawArraw)ON_COMMAND(IDM_DRAW_CIRCLE, OnDrawCircle)ON_UPDATE_COMMAND_UI(IDM_DRAW_CIRCLE, OnUpdateDrawCircle)ON_COMMAND(IDM_DRAW_LINE, OnDrawLine)

39、ON_UPDATE_COMMAND_UI(IDM_DRAW_LINE, OnUpdateDrawLine)ON_COMMAND(IDM_DRAW_RECT, OnDrawRect)ON_UPDATE_COMMAND_UI(IDM_DRAW_RECT, OnUpdateDrawRect)ON_WM_DROPFILES()ON_WM_LBUTTONDOWN()ON_WM_MOUSEMOVE()ON_WM_LBUTTONUP()ON_COMMAND(IDM_PRO_PENCOLOR, OnProPencolor)ON_COMMAND(IDM_PRO_BRUSHCOLOR, OnProBrushcol

40、or)ON_COMMAND(IDM_PRO_PENWIDTH, OnProPenwidth)ON_COMMAND(IDMAAAAAAA, OnMaaaaaaa)/AFX_MSG_MAP/ Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CShanVi

41、ew construction/destructionBOOL CShanView:OnPreparePrinting(CPrintInfo* pInfo)/ default preparationreturn DoPreparePrinting(pInfo);void CShanView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: add extra initialization before printingvoid CShanView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo*

42、 /*pInfo*/)/ TODO: add cleanup after printing/ CShanView diagnostics#ifdef _DEBUGvoid CShanView:AssertValid() constCView:AssertValid();void CShanView:Dump(CDumpContext& dc) constCView:Dump(dc);CShanDoc* CShanView:GetDocument() / non-debug version is inlineASSERT(m_pDocument->IsKindOf(RUNTIME_

43、CLASS(CShanDoc);return (CShanDoc*)m_pDocument;#endif /_DEBUG/ CShanView message handlersIMPLEMENT_DYNCREATE(CShanDoc, CDocument)IMPLEMENT_SERIAL(MShape,CObject,1)IMPLEMENT_SERIAL(MLine,MShape,1)IMPLEMENT_SERIAL(MRect,MShape,1)IMPLEMENT_SERIAL(MCircle,MShape,1)BEGIN_MESSAGE_MAP(CShanDoc, CDocument)/A

44、FX_MSG_MAP(CShanDoc)/ NOTE - the ClassWizard will add and remove mapping macros here./ DO NOT EDIT what you see in these blocks of generated code!/AFX_MSG_MAPEND_MESSAGE_MAP()/ CShanDoc construction/destructionCShanDoc:CShanDoc()/ TODO: add one-time construction code hereCShanDoc:CShanDoc()for(int i

45、 = 0; i < m_List.GetSize(); i+)MShape *shape = (MShape*)m_Listi;delete shape;m_List.RemoveAll();BOOL CShanDoc:OnNewDocument()if (!CDocument:OnNewDocument()return FALSE;for(int i = 0; i < m_List.GetSize(); i+)MShape *shape = (MShape*)m_Listi;delete shape;m_List.RemoveAll();/ (SDI documents will

46、 reuse this document)return TRUE;/ CShanDoc serializationvoid CShanDoc:Serialize(CArchive& ar)if (ar.IsStoring() m_List.Serialize(ar);elsem_List.Serialize(ar);/ CShanDoc diagnostics#ifdef _DEBUGvoid CShanDoc:AssertValid() constCDocument:AssertValid();void CShanDoc:Dump(CDumpContext& dc) cons

47、tCDocument:Dump(dc);#endif /_DEBUG/ CShanDoc commands圖4 畫圖板的實現(xiàn)示例(6)對話框的實現(xiàn) 定義一個對話框資源。在WORKSPACE窗口當(dāng)中RESOURCE一頁,在DIALOG小圖標(biāo)上面單擊鼠標(biāo)右鍵,彈出菜單,選擇INSERT命令,圖5 對話框的實現(xiàn)(1)接下來在彈出的資源類型對話框中選擇DIALOG,表示添加一個對話框資源。單擊NEW按鈕。接下來我們就開始布置這個對話框。對話框上面已經(jīng)有了兩個按鈕:OK和CANCEL。 圖6 對話框的實現(xiàn)(2) 對話框中控件與成員變量之間如何進(jìn)行數(shù)據(jù)交換DoDataExchange函數(shù)就是對話框類和對話框資源進(jìn)行DDX數(shù)據(jù)交換的函數(shù)。在對話框初始化的時候或者在程序中調(diào)用UpdateData()函數(shù)

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論