




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一 實(shí)訓(xùn)目的 (1)培養(yǎng)分析問(wèn)題、解決問(wèn)題的能力(2)培養(yǎng)考慮問(wèn)題的周密性和邏輯思維能力(3)培養(yǎng)實(shí)際動(dòng)手能力(4)培養(yǎng)C+知識(shí)的綜合運(yùn)用能力二 實(shí)訓(xùn)任務(wù)和要求1.圖形: 帶顏色的圖形。(增加選色功能) 線粗不同的圖形。(修改線粗的功能) 塊狀圖。(圖形的填充色和邊線顏色可以不同,由用戶選擇) 等等。 2. 界面 工具欄,狀態(tài)欄,改變鼠標(biāo),查看窗口等等 3. 編輯 在重新打開(kāi)時(shí)和在正常情況下一樣畫(huà)圖或者選中圖形進(jìn)行圖形編輯。 4. 文件保存 EMF文件, 導(dǎo)入位圖文件成為一個(gè)(由位圖填充的)矢量矩形等等。 5. 編輯 單個(gè)圖像拖動(dòng),改變圖形節(jié)點(diǎn)位置能夠進(jìn)行基本的圖形繪制功能:直線,圓、矩形和多
2、邊形; 數(shù)據(jù)保存功能,能夠把圖形數(shù)據(jù)保存到文件中; 簡(jiǎn)單的編輯功能:改變線條和填充顏色以及線寬;三 實(shí)訓(xùn)過(guò)程和內(nèi)容3.1需求分析(1)認(rèn)識(shí)C+編程軟件C+是一種使用非常廣泛的計(jì)算機(jī)編程語(yǔ)言。C+是一種靜態(tài)數(shù)據(jù)類型檢查的,支持多重編程范式的通用程序設(shè)計(jì)語(yǔ)言。它支持過(guò)程化程序設(shè)計(jì)、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計(jì)、制作圖標(biāo)等等泛型程序設(shè)計(jì)等多種程序設(shè)計(jì)風(fēng)格。C+支持C語(yǔ)言的幾乎全部功能,在語(yǔ)法上與C語(yǔ)言僅有極微妙的差別;C+語(yǔ)言原本不具備面向?qū)ο蟮脑O(shè)計(jì)功能,然而隨著面向?qū)ο缶幊痰母拍畹奶岢鲆约叭鏙ava等語(yǔ)言的發(fā)展成熟,C+語(yǔ)言也開(kāi)發(fā)出了支持面向?qū)ο蠊δ艿陌姹?,現(xiàn)在編程者常用的VC+就是一種面向?qū)ο蟮恼Z(yǔ)
3、言;C+強(qiáng)大(但容易失控的)模板功能使它能在編譯期完成許多工作,從而大大提高運(yùn)行期效率。STL(C+標(biāo)準(zhǔn)模板庫(kù),Standard Template Library);隨著STL的不斷發(fā)展,它已經(jīng)逐漸成為C+程序設(shè)計(jì)中不可或缺的部分,其效率可能比一般的native代碼低些,但是其安全性與規(guī)范性使它大受歡迎。(2)計(jì)算機(jī)圖形的認(rèn)識(shí)在計(jì)算機(jī)科學(xué)中,圖形和圖像這兩個(gè)概念是有區(qū)別的:圖形一般指用計(jì)算機(jī)繪制的畫(huà)面,如直線、圓、圓弧、任意曲線和圖表等;圖像則是指由輸入設(shè)備捕捉的實(shí)際場(chǎng)景畫(huà)面或以數(shù)字化形式存儲(chǔ)的任意畫(huà)面。圖像是由一些排列的像素組成的,在計(jì)算機(jī)中的存儲(chǔ)格式有BMP、PCX、TIF、GIFD等,一
4、般數(shù)據(jù)量比較大。它除了可以表達(dá)真實(shí)的照片外,也可以表現(xiàn)復(fù)雜繪畫(huà)的某些細(xì)節(jié),并具有靈活和富有創(chuàng)造力等特點(diǎn),而與圖像不同,在圖形文件中只記錄生成圖的算法和圖上的某些特點(diǎn),也稱矢量圖。在計(jì)算機(jī)還原時(shí),相鄰的特點(diǎn)之間用特定的很多段小直線連接就形成曲線,若曲線是一條封閉的圖形,也可靠著色算法來(lái)填充顏色。它最大的優(yōu)點(diǎn)就是容易進(jìn)行移動(dòng)、壓縮、旋轉(zhuǎn)和扭曲等變換。3.2 設(shè)計(jì)(1)C+程序中的應(yīng)用程序?qū)ο?(a)基于窗口的應(yīng)用程序還是使用MFC比較多,所以主要介紹一下MFC。CWnd窗口:它是大多數(shù)“看得見(jiàn)的東西”的父類(Windows里幾乎所有看得見(jiàn)的東西都是一個(gè)窗口,大窗口里有許多小窗口),比如視圖CVie
5、w、框架窗口CFrameWnd、工具條CToolBar、對(duì)話框CDialog、按鈕CButton,etc;一個(gè)例外是菜單(CMenu)不是從窗口派生的。CDocument文檔,負(fù)責(zé)內(nèi)存數(shù)據(jù)與磁盤(pán)的交互。最重要的是OnOpenDocument(讀入),OnSaveDocument(寫(xiě)盤(pán)),Serialize(讀寫(xiě)) CView視圖:負(fù)責(zé)內(nèi)存數(shù)據(jù)與用戶的交互。包括數(shù)據(jù)的顯示、用戶操作的響應(yīng)(如菜單的選取、鼠標(biāo)的響應(yīng))。最重要的是OnDraw(重畫(huà)窗口),通常用CWnd:Invalidate()來(lái)啟動(dòng)它。另外,它通過(guò)消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。CDC設(shè)備文本:無(wú)論是顯示器還是打
6、印機(jī),都是畫(huà)圖給用戶看。這圖就抽象為CDC。CDC與其他GDI(圖形設(shè)備接口)一起,完成文字和圖形、圖像的顯示工作。把CDC想象成一張紙,每個(gè)窗口都有一個(gè)CDC相聯(lián)系,負(fù)責(zé)畫(huà)窗口。CDC有個(gè)常用子類CClientDC(窗口客戶區(qū)),畫(huà)圖通常通過(guò)CClientDC完成。 CDialog:對(duì)話框 CWinApp應(yīng)用程序類:似于C中的main函數(shù),是程序執(zhí)行的入口和管理者,負(fù)責(zé)程序建立、消滅,主窗口和文檔模板的建立。CGdiObject及子類:用于向設(shè)備文本畫(huà)圖。它們都需要在使用前選進(jìn)DC。 CPen筆:畫(huà)線 CBrush刷子:填充 CFont字體:控制文字輸出的字體 CBitmap:位圖 CPal
7、ette:調(diào)色板 CRgn區(qū)域:指定一塊區(qū)域可以用于做特殊處理。 CFile文件:最重要的不外是Open(打開(kāi)),Read(讀入),Write(寫(xiě)) CString字符串:封裝了C中的字符數(shù)組CPoint點(diǎn): (x,y)對(duì) CRect矩形:(left,top,right,bottom) CSize大?。海╟x,cy)對(duì)(寬、高)(b) MFC五大群組General Purpose classes:提供字符串類、數(shù)據(jù)處理類(如數(shù)組與鏈表),異常情況處理類、文件類等。 Windows API classes:用來(lái)封裝Windows API,例如窗口類、對(duì)話框類、DC類等。 Application
8、framework classes:組成應(yīng)用程序骨干類,即此組類,包括Dcoument/View、消息泵、消息映射、消息傳遞、動(dòng)態(tài)創(chuàng)建、文件讀寫(xiě)等等。 High level abstractions:包括工具欄、狀態(tài)欄、拆分窗口、滾動(dòng)窗口等等。視覺(jué)性UI對(duì)象屬于此類,例如工具欄CToolBar、狀態(tài)欄CStatusBar、對(duì)話框列CDialogBar。加強(qiáng)型的View也屬此類,如可滾動(dòng)的ScrollView、以對(duì)話框?yàn)榛A(chǔ)的CFormView、小型文字編輯器CEditView、樹(shù)狀結(jié)構(gòu)的CTreeView,支持RTF文件格式的CRichEditView等等。 operation system
9、extensions:包括OLE、ODBC、DAO、MAPI、WinSock、ISAPI等等。(2)文檔對(duì)象、視圖對(duì)象和框架對(duì)象在MFC中引入了文檔-視圖結(jié)構(gòu)的概念,文檔相當(dāng)于數(shù)據(jù)容器,視圖相當(dāng)于查看數(shù)據(jù)的窗口或是和數(shù)據(jù)發(fā)生交互的窗口。因此一個(gè)完整的應(yīng)用一般由四個(gè)類組成:CWinApp應(yīng)用類,CFrameWnd窗口框架類,CDocument文檔類,CView視類。在程序運(yùn)行時(shí)CWinApp將創(chuàng)建一個(gè)CFrameWnd框架窗口實(shí)例,而框架窗口將創(chuàng)建文檔模板,然后有文檔模板創(chuàng)建文檔實(shí)例和視實(shí)例,并將兩者關(guān)聯(lián)。一般來(lái)講我們只需對(duì)文檔和視圖進(jìn)行操作,框架的各種行為已經(jīng)被MFC安排好了而不需人為干預(yù),這
10、也是設(shè)計(jì)文檔-視結(jié)構(gòu)的本意,讓我們將注意力放在完成任務(wù)上而從界面編寫(xiě)中解放出來(lái)。在應(yīng)用中一個(gè)視圖對(duì)應(yīng)一個(gè)文檔,但一個(gè)文檔可以包含多個(gè)視圖。一個(gè)應(yīng)用中只用一個(gè)框架窗口,對(duì)多文檔界面來(lái)講可能有多個(gè)MDI子窗口。每一個(gè)視圖都是一個(gè)子窗口,在單文檔界面中父窗口即是框架窗口,在多文檔界面中父窗口為MDI子窗口。一個(gè)多文檔應(yīng)用中可以包含多個(gè)文檔模板,一個(gè)模板定義了一個(gè)文檔和一個(gè)或多個(gè)視圖之間的對(duì)應(yīng)關(guān)系。同一個(gè)文檔可以屬于多個(gè)模板,但一個(gè)模板中只允許定義一個(gè)文檔。同樣一個(gè)視圖也可以屬于多個(gè)文檔模板。一般來(lái)說(shuō)用戶的輸入/輸出基本都是通過(guò)視圖進(jìn)行,但一些例外的情況下可能需要和框架直接發(fā)生作用。 在使用菜單時(shí)大家
11、會(huì)發(fā)現(xiàn)當(dāng)一個(gè)菜單沒(méi)有進(jìn)行映射處理時(shí)為禁止?fàn)顟B(tài),在多視圖的情況下菜單的狀態(tài)和處理映射是和當(dāng)前活動(dòng)視相聯(lián)系的,這樣MFC可以保證視他能正確的接收到各種消息,但有時(shí)候也會(huì)產(chǎn)生不便。有一個(gè)解決辦法就是在框架中對(duì)消息進(jìn)行處理,這樣也可以保證當(dāng)前文檔可以通過(guò)框架得到當(dāng)前消息。 在用戶進(jìn)行輸入后如何使視的狀態(tài)得到更新?這個(gè)問(wèn)題在一個(gè)文檔對(duì)應(yīng)一個(gè)視圖時(shí)是不存在的,但是現(xiàn)在有一個(gè)文檔對(duì)應(yīng)了兩個(gè)視圖,當(dāng)在一個(gè)視上進(jìn)行了輸入時(shí)如何保證另一個(gè)視圖也得到通知呢?MFC的做法是利用文檔來(lái)處理的,因?yàn)槲臋n管理著當(dāng)前和它聯(lián)系的視圖,由它來(lái)通知各個(gè)視圖是最合適的。例如: 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)用時(shí)和此文檔相關(guān)的所有視圖對(duì)象的OnUpdate都會(huì)被調(diào)用,而參數(shù)lHint和pHint都會(huì)被傳遞。那么還有一個(gè)問(wèn)題:如何在OnUpdate中知道是那個(gè)視圖發(fā)生了改變呢,這就可以利用pHint參數(shù),只要調(diào)用者將this指針賦值給參數(shù)就可以了,當(dāng)然完全可以利用該參數(shù)傳遞更復(fù)雜的結(jié)構(gòu)。 視圖對(duì)象的初始化
13、,當(dāng)一個(gè)文檔被打開(kāi)或是新建一個(gè)文檔時(shí)視圖的CView:OnInitialUpdate()會(huì)被調(diào)用,你可以通過(guò)重載該函數(shù)對(duì)視圖對(duì)象進(jìn)行初始化,并在結(jié)束前調(diào)用父類的OnInitialUpdate,因?yàn)檫@樣可以保證OnUpdate會(huì)被調(diào)用。 文檔中內(nèi)容的清除,當(dāng)文檔被關(guān)閉時(shí)(比如退出或是新建前上一個(gè)文檔清除)void CDocument:DeleteContents ()會(huì)被調(diào)用,你可以通過(guò)重載該函數(shù)來(lái)進(jìn)行清理工作。 在單文檔結(jié)構(gòu)中上面兩點(diǎn)尤其重要,因?yàn)檐浖\(yùn)行文檔對(duì)象和視圖對(duì)象只會(huì)被產(chǎn)生并刪除一次。所以應(yīng)該將上面兩點(diǎn)和C+對(duì)象構(gòu)造和構(gòu)析分清楚。 文檔模板分為兩類單文檔模板和多文檔模板,分別由CSi
14、ngleDocTemplate和CMultiDocTemplate表示,模板的作用在于記錄文檔對(duì)象,視圖對(duì)象,框架對(duì)象之間的對(duì)應(yīng)關(guān)系。還有一點(diǎn)就是模板可以記錄應(yīng)用程序可以打開(kāi)的文件的類型,當(dāng)打開(kāi)文件時(shí)會(huì)根據(jù)文檔模板中的信息選擇正確的文檔和視圖。當(dāng)使用者通過(guò)視圖對(duì)象修改了數(shù)據(jù)時(shí),應(yīng)該調(diào)用GetDocument()->SetModifiedFlag(TRUE)通知文檔數(shù)據(jù)已經(jīng)被更新,這樣在關(guān)閉文檔時(shí)會(huì)自動(dòng)詢問(wèn)用戶是否保存數(shù)據(jù)。(3)菜單設(shè)計(jì) (a) 菜單的種類: 生成數(shù)據(jù) 插入排序 希爾排序 起泡排序 快速排序 選擇排序 堆排序 歸并排序(非遞歸) 歸并排序(遞歸) 退出(b) 工具條的實(shí)現(xiàn)
15、例如,24位工具條的實(shí)現(xiàn): 在mainframe.h文件中聲明成員變量: CToolBar m_hotToolBar; 在 CMainFrame:OnCreate() 中創(chuàng)建工具條,假設(shè)你已經(jīng)創(chuàng)建了一個(gè)ToolBar資源和兩個(gè)工具條位圖(Bitmap)資源:IDB_TOOLBAR_COLD 和 IDB_TOOLBAR_HOT,前者表示的是常態(tài)按鈕,而后者表示的是鼠標(biāo)移到上面時(shí)的狀態(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()中還要添加如下代碼,它們實(shí)現(xiàn)對(duì)位圖資源的存?。?/ 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ù),這個(gè)工具條有五個(gè)按鈕,那么在
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)繪圖的實(shí)現(xiàn) 窗口消息:WM_CREATE,WM_DESTROY,WM_CLOSE我們創(chuàng)建一個(gè)窗口對(duì)象的時(shí)候,這個(gè)窗口對(duì)象在創(chuàng)建過(guò)程中收到的就是WM_CREATE消息,對(duì)這個(gè)消息的處理過(guò)程一般用來(lái)設(shè)置一些顯示窗口前的初始化工作,如設(shè)置窗口的大小,背景顏色等,WM_DESTROY消息指示窗口即將要被撤消,在這個(gè)消息處理過(guò)程中,我們就可以做窗口撤消前的一些工作。WM_CLOSE wm_close消息發(fā)生在窗口將要被關(guān)閉之前,在收到這個(gè)消息后,一般性的操作是回收所有分配給這個(gè)窗口的各種資源。 鍵盤(pán)消息:WM_CHAR,WM_K
21、EYDOWN,WM_KEYUP這三個(gè)消息用來(lái)處理用戶的鍵盤(pán)數(shù)據(jù),當(dāng)用戶在鍵盤(pán)上按下某個(gè)鍵的時(shí)候,會(huì)產(chǎn)生WM_KEYDOWN消息,釋放按鍵的時(shí)候又回產(chǎn)生WM_KEYUP消息,所以WM_KEYDOWN與WM_KEYUP消息一般總是成對(duì)出現(xiàn)的,至于WM_CHAR消息是在用戶的鍵盤(pán)輸入能產(chǎn)生有效的ASCII碼時(shí)才會(huì)發(fā)生。這里特別提醒要注意前兩個(gè)消息與WM_CHAR消息在使用上是有區(qū)別的。在前兩個(gè)消息中,伴隨消息傳遞的是按鍵的虛擬鍵碼,所以這兩個(gè)消息可以處理非打印字符,如方向鍵,功能鍵等。而伴隨WM_CHAR消息的參數(shù)是所按的鍵的ASCII碼,ASCII碼是可以區(qū)分字母的大小寫(xiě)的。而虛擬鍵碼是不能區(qū)分大
22、小寫(xiě)的。 鼠標(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)移動(dòng)的時(shí)候,剩余的六個(gè)消息則分別對(duì)應(yīng)于鼠標(biāo)左右鍵的按下、釋放、雙擊事件,要指出的是WINDOWS系統(tǒng)并不是在鼠標(biāo)每移動(dòng)一個(gè)像素時(shí)都產(chǎn)生MOUSEMOVE消息,這一點(diǎn)要特別注意。 另一組窗口消息:WM_MOVE , WM_SIZE , WM_PAINT 當(dāng)窗口移動(dòng)的時(shí)候產(chǎn)生WM_MOVE 消息,窗口的
23、大小改變的時(shí)候產(chǎn)生WM_SIZE消息,而當(dāng)窗口工作區(qū)中的內(nèi)容需要重畫(huà)的時(shí)候就會(huì)產(chǎn)生WM_PAINT消息。 焦點(diǎn)消息WM_SETFOCUS,WM_KILLFOCUS當(dāng)一個(gè)窗口從非活動(dòng)狀態(tài)變?yōu)榫哂休斎虢裹c(diǎn)的活動(dòng)狀態(tài)的時(shí)候,它就會(huì)收到WM_SETFOCUS消息,而當(dāng)窗口失去輸入焦點(diǎn)的時(shí)候它就會(huì)收到WM_KILLFOCUS消息。 定時(shí)器消息:WM_TIMER當(dāng)我們?yōu)橐粋€(gè)窗口設(shè)置了定時(shí)器資源之后,系統(tǒng)就會(huì)按規(guī)定的時(shí)間間隔向窗口發(fā)送WM_TIMER消息,在這個(gè)消息中就可以處理一些需要定期處理的事情。最后要指出的一點(diǎn)是,在WINDOWS環(huán)境下,消息的來(lái)源是多方面的,最常見(jiàn)的是用戶的操作產(chǎn)生消息,系統(tǒng)在必要的
24、時(shí)候也會(huì)向程序發(fā)送系統(tǒng)消息,其他在運(yùn)行中的程序也可以向程序發(fā)送消息。此外,在程序的內(nèi)部,也可以根據(jù)需要在適當(dāng)?shù)臅r(shí)候主動(dòng)產(chǎn)生消息,比如主動(dòng)產(chǎn)生WM_PAINT消息以實(shí)現(xiàn)需要的重畫(huà)功能。例如,創(chuàng)建一個(gè)定時(shí)器。點(diǎn)擊查看,建立類向?qū)D2 創(chuàng)建定時(shí)器 建立類向?qū)纠?)在class name下點(diǎn)擊ctestview,然后再messages 選擇 WM TIMER。然后選擇Add Function. 圖3 創(chuàng)建定時(shí)器 建立類向?qū)纠?)自己命名一下確定就建立成功。 消除鼠標(biāo)移動(dòng)過(guò)程中的繪圖痕跡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è)計(jì)圖形是矢量圖。就是說(shuō)繪
36、制出來(lái)的圖形數(shù)據(jù)是以坐標(biāo)形式存儲(chǔ),而不是以位圖形式存儲(chǔ)。對(duì)矢量圖進(jìn)行任意倍數(shù)的放大縮小,圖形不會(huì)失真,線粗不變。 所謂線粗不變,是說(shuō)比如原圖線粗是1,無(wú)論放大多少倍之后,線粗都是1,僅僅是圖像大小變化。 基本功能中只要求單色的線圖。就是說(shuō)只需使用一種顏色作為圖形的邊線就可以了。圖形內(nèi)部是透明的。不需增加選色功能。并且圖形的線粗可以只是1, 不必增加線粗的改變功能。.帶顏色的圖形。(增加選色功能).線粗不同的圖形。(修改線粗的功能)圖形的填充色和邊線顏色可以不同,由用戶選擇等等。 例如:畫(huà)圖板的實(shí)現(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 畫(huà)圖板的實(shí)現(xiàn)示例(6)對(duì)話框的實(shí)現(xiàn) 定義一個(gè)對(duì)話框資源。在WORKSPACE窗口當(dāng)中RESOURCE一頁(yè),在DIALOG小圖標(biāo)上面單擊鼠標(biāo)右鍵,彈出菜單,選擇INSERT命令,圖5 對(duì)話框的實(shí)現(xiàn)(1)接下來(lái)在彈出的資源類型對(duì)話框中選擇DIALOG,表示添加一個(gè)對(duì)話框資源。單擊NEW按鈕。接下來(lái)我們就開(kāi)始布置這個(gè)對(duì)話框。對(duì)話框上面已經(jīng)有了兩個(gè)按鈕:OK和CANCEL。 圖6 對(duì)話框的實(shí)現(xiàn)(2) 對(duì)話框中控件與成員變量之間如何進(jìn)行數(shù)據(jù)交換DoDataExchange函數(shù)就是對(duì)話框類和對(duì)話框資源進(jìn)行DDX數(shù)據(jù)交換的函數(shù)。在對(duì)話框初始化的時(shí)候或者在程序中調(diào)用UpdateData()函數(shù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度游艇俱樂(lè)部個(gè)人保潔合同
- 二零二五年度房地產(chǎn)項(xiàng)目銷售代理及客戶關(guān)系維護(hù)合同
- 綠茶茶園承包經(jīng)營(yíng)合同(2025年度)含茶文化體驗(yàn)項(xiàng)目
- 二零二五年度個(gè)人車輛抵押保險(xiǎn)理賠合同
- 二零二五實(shí)習(xí)律師實(shí)習(xí)合同(反壟斷與反不正當(dāng)競(jìng)爭(zhēng))
- 2025年度藝人經(jīng)紀(jì)違約金及違約行為處理合同
- 二零二五年度房產(chǎn)交易傭金糾紛解決合同
- 二零二五年度北京特色小鎮(zhèn)拆遷補(bǔ)償與文化旅游合作協(xié)議
- 第部分面向制造和裝配的產(chǎn)品設(shè)計(jì)鐘元
- 書(shū)畫(huà)展發(fā)言稿
- 交通安全宣傳意義
- 智慧農(nóng)業(yè)的智能農(nóng)機(jī)與裝備
- 并聯(lián)有源電力濾波器工程應(yīng)用關(guān)鍵技術(shù)的研究的開(kāi)題報(bào)告
- 跨文化語(yǔ)境下的國(guó)家形象塑造與傳播以中國(guó)《國(guó)家形象》宣傳片為例
- 志愿服務(wù)與志愿者精神知識(shí)考試題庫(kù)大全(含答案)
- 工業(yè)機(jī)器人應(yīng)用基礎(chǔ) 教案(教學(xué)設(shè)計(jì)) 模塊二-任務(wù)二-ABB工業(yè)機(jī)器人編程基礎(chǔ)
- 文創(chuàng)產(chǎn)品設(shè)計(jì):文創(chuàng)產(chǎn)品設(shè)計(jì)與創(chuàng)新
- 麻醉復(fù)蘇護(hù)理進(jìn)修匯報(bào)
- 企業(yè)安全與風(fēng)險(xiǎn)管控課件
- 小學(xué)語(yǔ)文《文學(xué)閱讀與創(chuàng)意表達(dá)》
- 醫(yī)保定點(diǎn)納入預(yù)測(cè)性研究的報(bào)告
評(píng)論
0/150
提交評(píng)論