版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 1設(shè)計目的</b></p><p> 設(shè)計一個單文檔類型的MFC AppWizard (exe)工程,工程取名為:Draw。此程序?qū)崿F(xiàn)簡單的繪圖功能,包括點、直線、矩形、橢圓、連續(xù)線的繪制。并且能實現(xiàn)繪圖的控制,包括線寬、線型和顏色的設(shè)置,圖形的保存和打開的使用。</p><p> 2 總體設(shè)計 設(shè)計圖如圖6</
2、p><p><b> 3詳細設(shè)計</b></p><p> 首先,新建一個單文檔類型的MFC AppWizard (exe)工程,工程取名為:Graphic。為此程序添加一個子菜單,菜單名稱為“繪圖”,并為其添加六個菜單項,分別用來控制不同圖形的繪制。當(dāng)用戶選擇其中的一個菜單項后,程序?qū)凑债?dāng)前的選擇進行相應(yīng)圖形的繪制。添加的六個菜單項的ID及名稱如表1所示。然后分別
3、為這六個菜單項添加命令響應(yīng),本程序讓視類(CGraphicView)對這些菜單命令進行響應(yīng),這六個響應(yīng)函數(shù)的名稱分別如表1所示。</p><p><b> 表1添加的菜單項</b></p><p> 在程序運行以后,當(dāng)用戶單擊某個菜單項時,應(yīng)該把用戶的選擇保存起來,以便隨后的繪圖操作使用。因此在CDrawView類中添加一個私有變量m_nDrawType;用來保存
4、用戶的選擇,該變量的定義如下所述:</p><p> private: UINT m_nDrawType;</p><p> 接著,在視類的構(gòu)造函數(shù)中將此變量初始化為0,程序代碼如下:</p><p> CDrawView::CDrawView()</p><p><b> {</b></p>
5、<p> // TODO: add construction code here</p><p> m_nDrawType=0;</p><p><b> }</b></p><p> 利用switch/case語句,來分別完成相應(yīng)圖形的繪制。當(dāng)用戶選擇【繪圖】菜單下的不同子菜單項時,將變量m_nDrawType設(shè)置為不同的值
6、。程序代碼如下:</p><p> void CDrawView::OnDot() </p><p><b> {</b></p><p> // TODO: Add your command handler code here</p><p> m_nDrawType=1;</p><p&g
7、t;<b> }</b></p><p> void CDrawView::OnEllipse() </p><p><b> {</b></p><p> // TODO: Add your command handler code here</p><p> m_nDrawType=4
8、;</p><p><b> }</b></p><p> void CDrawView::OnLine() </p><p><b> {</b></p><p> // TODO: Add your command handler code here</p><p&g
9、t; m_nDrawType=2;</p><p><b> }</b></p><p> void CDrawView::OnRectangle() </p><p><b> {</b></p><p> // TODO: Add your command handler code h
10、ere</p><p> m_nDrawType=3;</p><p><b> }</b></p><p> 3.1點、直線、矩形、橢圓,畫筆繪制</p><p> 對于直線、矩形和橢圓,在繪制時都可有兩點來確定其圖形。當(dāng)鼠標(biāo)左擊時得到一個點,當(dāng)鼠標(biāo)左鍵松開時得到另外一個點。為視類CDrawView分別捕獲鼠標(biāo)
11、左鍵按下和彈起這兩個消息。另外當(dāng)鼠標(biāo)左鍵按下時,需要將鼠標(biāo)當(dāng)前按下點保存,因此我們?yōu)镃DrawView再增加一個CPoint類型的私有成員變量:m_ptOrigin,在視類的構(gòu)造函數(shù)中將此變量初始化為0。在鼠標(biāo)按下消息響應(yīng)函數(shù)中,保存該點,代碼如下:</p><p> void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) </p><
12、;p><b> {</b></p><p> // TODO: Add your message handler code here and/or call default</p><p> m_ptOrigin=point; //保存鼠標(biāo)按下得到點,也是繪制一個點</p><p> CView::OnLButtonDown(n
13、Flags, point);</p><p><b> }</b></p><p> 在鼠標(biāo)左鍵彈起消息響應(yīng)函數(shù)中實現(xiàn)繪圖,代碼如下:</p><p> void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) </p><p><b> {</
14、b></p><p> // TODO: Add your message handler code here and/or call default</p><p> //創(chuàng)建并獲得設(shè)備描述</p><p> CClientDC dc(this); </p><p> CPen pen(m_nLineStyle,m_nLine
15、Width,m_clr);</p><p> CPen *oldPen=m_dcMetaFile.SelectObject(&pen);</p><p> dc.SelectObject(&pen);</p><p> OnPrepareDC(&dc);</p><p> dc.DPtoLP(&m_pt
16、Origin);</p><p> dc.DPtoLP(&point);</p><p> switch(m_nDrawType)</p><p><b> {</b></p><p><b> case 1:</b></p><p> m_dcMetaFi
17、le.SetPixel(point,m_clr);點以及顏色</p><p><b> break;</b></p><p><b> case 2:</b></p><p> m_dcMetaFile.MoveTo(m_ptOrigin);</p><p> m_dcMetaFile.Li
18、neTo(point);</p><p> dc.MoveTo(m_ptOrigin);</p><p> dc.LineTo(point);</p><p><b> break;</b></p><p><b> case 3:</b></p><p> m_d
19、cMetaFile.Rectangle(CRect(m_ptOrigin,point));</p><p> dc.Rectangle(CRect(m_ptOrigin,point));</p><p><b> break;</b></p><p><b> case 4:</b></p><p
20、> m_dcMetaFile.Ellipse(CRect(m_ptOrigin,point));</p><p> dc.Ellipse(CRect(m_ptOrigin,point));</p><p><b> break;</b></p><p><b> }</b></p><p&
21、gt; CGraph*pGraph=new CGraph(m_clr,point,m_ptOrigin,m_nDrawType,m_nLineStyle,m_nLineWidth);</p><p> m_ptrArray.Add(pGraph);</p><p> CScrollView::OnLButtonUp(nFlags,point);</p><p>
22、;<b> }</b></p><p> void CDrawView::OnPen() </p><p><b> {</b></p><p> // TODO: Add your command handler code here</p><p> m_nDrawType=5;<
23、/p><p><b> }</b></p><p> 在上述程序中,設(shè)置一個點,用到的函數(shù)是SetPixel,這也是CDC類的一個成員方法,該函數(shù)的生命形式如下:COLORREF SetPixel (POINT point,COLORREF crColor);該函數(shù)是在指定的點設(shè)置一個像素。其中第一個參數(shù)(point)是指定的點,第二個參數(shù)(crColor)是指定的顏
24、色。在程序中設(shè)定的顏色在系統(tǒng)顏色表中可能不存在,但系統(tǒng)會選擇一種和這個顏色最接近的顏色。RGB是一個宏,它有三個參數(shù),分別代表紅、綠、藍三種顏色的值。這三個參數(shù)BYTE類型,取值范圍為0~255。RGB(0,0,0)是黑色,RGB(255,255,255)是白色,將這三個分量設(shè)置成為0~255之間的任意值,從而得到各種不同的顏色。這里的RGB(255,0,0)是紅色。</p><p> 繪制直線時,首先調(diào)用Mo
25、veTo函數(shù)移動到原點,然后調(diào)用LineTo函數(shù)繪制到終點。</p><p> 繪制矩形時使用Rectangle函數(shù),該函數(shù)聲明形式為:BOOL Rectangle (LPCRECT lpRect);</p><p> 該函數(shù)有一個指向Crect對象的參數(shù),后者可以利用兩個點來構(gòu)造。需要注意的是該函數(shù)需要的是指向Crect對象的指針,而上述代碼中傳遞的卻是Crect對象,但運行編譯時也
26、能成功通過,運行時也不會報錯,這是為什么呢?我們知道C系列的語言都是強類型語言,如果類型不匹配的話,需要進行強制類型轉(zhuǎn)換。但這里為什么沒有進行這樣的強制類型轉(zhuǎn)換程序也可以通過呢?實際上,Crect類提供了這樣一個成員函數(shù):重載LPCRECT操作符,其作用是將Crect轉(zhuǎn)換為LPCRECT類型。因此,當(dāng)在程序中給Rectangle函數(shù)的參數(shù)賦值時,如果它發(fā)現(xiàn)該參數(shù)是一個Crect對象,它就會隱式地調(diào)用LPCRECT操作符,將Crect類型
27、的對象轉(zhuǎn)換為LPRECT類型。因此,在給函數(shù)傳遞參數(shù)時,如果我們看到的傳遞的數(shù)值類型和所需要的類型不匹配,但編譯和運行都正確的情況時,就要想想這其中的緣由了。當(dāng)然,有的情況下可能是這些類型之間本來就可以互相轉(zhuǎn)換,例如short類型和int類型。但是參數(shù)是對象類的話,就要考慮了,它選擇的對象的構(gòu)造方法進行的隱式轉(zhuǎn)換,還是有其他重載的操作符。</p><p> 當(dāng)用戶選擇橢圓菜單項時,調(diào)用Ellipes函數(shù)繪制一個
28、橢圓。Windows系統(tǒng)為我們提供了一個畫圖程序,在該程序中,利用畫筆可以繪制連續(xù)的線條,下面我們設(shè)計繪制連續(xù)線和扇形。</p><p> 為了繪制連續(xù)的線條,首先要得到線條的起點,這在前面已經(jīng)實現(xiàn)。然后需要捕獲鼠標(biāo)移動過程中的每一個點,這可以通過捕獲鼠標(biāo)移動消息(WM_MOUSEMOVE)來實現(xiàn)。在此消息響應(yīng)函數(shù)中,在依次捕獲的各個點之間繪制一條條非常短的線段,從而就可以繪制出一條連續(xù)的線條。</p&g
29、t;<p> 遵照這一思路,我們開始增加程序的功能。首先為視類增加鼠標(biāo)移動消息(WM_MOUSEMOVE)的響應(yīng)函數(shù)(OnMouseMove)。這樣,只要鼠標(biāo)在應(yīng)用程序窗口中移動時都會進入到這個消息響應(yīng)函數(shù)中。但這并不是我們所期望的,我們希望在鼠標(biāo)左鍵按下后開始繪圖。因此,我們需要有一個變量來表示鼠標(biāo)左鍵是否按下這一狀態(tài),然后在鼠標(biāo)移動消息響應(yīng)函數(shù)中對這一變量進行判斷。當(dāng)此變量為真,即鼠標(biāo)左鍵已經(jīng)按下去,我們開始繪圖。于
30、是,為視類添加一個BOOL型的私有變量m_bDraw,當(dāng)鼠標(biāo)左鍵按下去時,此變量為真;當(dāng)鼠標(biāo)左鍵彈起時,此變量為假,這時,我們就不再繪制線條了。該變量在視類頭文件中的定義代碼如下:</p><p><b> Private:</b></p><p> BOOL m_bDraw;</p><p> 接下來在視類的構(gòu)造函數(shù)中,將此變量初始化為
31、FALSE。</p><p> m_bDraw=FALSE;</p><p> 當(dāng)鼠標(biāo)左鍵按下去時,在視類的OnLButtonDown函數(shù)中將此變量初始化為TRUE。</p><p> m_bDraw=TRUE;</p><p> 當(dāng)鼠標(biāo)左鍵彈起時,在視類的OnLButton函數(shù)中將此變量初始化為假。</p><p
32、> m_bDraw=FALSE;</p><p> 然后在OnMouseMove函數(shù)中首先對m_bdraw變量進行判斷,如果其值為真,說明鼠標(biāo)左鍵已經(jīng)按下去了,這時就可開始進行畫線操作。還有一點需要注意,因為每繪制一條線段后,下次應(yīng)該從這條線段的終點開始繼續(xù)繪制。因此,繪制完當(dāng)前線段后,應(yīng)該修改線段的起點,將當(dāng)前線段的終點作為下一條線段的起點,程序代碼如下:</p><p>
33、void CDrawcView::OnMouseMove(UINT nFlags, CPoint point) </p><p><b> {</b></p><p> //TODO: Add your message handler code here and/or call default</p><p> //創(chuàng)建并獲得設(shè)備描述&
34、lt;/p><p> CClientDC dc(this);</p><p> //創(chuàng)建寬度為1的實線紅色畫筆</p><p> CPen pen (PS_SOLID, 1, RGB(255,0,0));</p><p> //把創(chuàng)建的畫筆選入設(shè)備描述</p><p> CPen *pOldpen=dc.Sele
35、ctObject(&pen);</p><p> if(m_bDraw==true)</p><p><b> {</b></p><p> dc.MoveTo(m_ptOrigin);</p><p> dc.LineTo(point);</p><p><b> /
36、/修改線段的起點</b></p><p> m_ptOrigin=point;</p><p><b> }</b></p><p><b> //恢復(fù)設(shè)備描述</b></p><p> dc.SelectObject(pOldpen);</p><p>
37、 CView::OnMouseMove(nFlags, point);</p><p><b> }</b></p><p> 如果在上面繪制連續(xù)線條的程序中,保持每段小直線的起點不變,即以鼠標(biāo)左鍵按下時的起點為起點不變,分別繪制到鼠標(biāo)移動點的直線,這時就會出現(xiàn)扇形的效果。也就是去掉上述代碼OnMouseMove函數(shù)中修改線段起點的代碼。程序代碼如下:</
38、p><p> void CDrawView::OnMouseMove(UINT nFlags, CPoint point) </p><p><b> {</b></p><p> //TODO: Add your message handler code here and/or call default</p><p&
39、gt;<b> {</b></p><p> //創(chuàng)建并獲得設(shè)備描述</p><p> CClientDC dc(this);</p><p> //創(chuàng)建寬度為1的實線紅色畫筆</p><p> CPen pen (PS_SOLID, 1, RGB(255,0,0));</p><p>
40、 //把創(chuàng)建的畫筆選入設(shè)備描述</p><p> CPen *pOldpen=dc.SelectObject(&pen);</p><p> if(m_bDraw==true)</p><p><b> {</b></p><p> dc.MoveTo(m_ptOrigin);</p>&
41、lt;p> dc.LineTo(point);</p><p><b> }</b></p><p><b> //恢復(fù)設(shè)備描述</b></p><p> dc.SelectObject(pOldpen);</p><p> CView::OnMouseMove(nFlags, po
42、int);</p><p><b> }</b></p><p><b> 3.2設(shè)置對話框</b></p><p> 為程序添加一個設(shè)置對話框,允許用戶指定畫筆的類型、線寬,并讓隨后的繪圖操作就使用用戶指定的新設(shè)置值來進行繪制。</p><p> 為了實現(xiàn)這一功能,首先需要為程序添加一個對
43、話框資源,并按下表修改屬性。</p><p> 設(shè)置線型、線寬對話框的代碼如下:</p><p> void CDrawView::OnSetting() </p><p><b> {</b></p><p> // TODO: Add your command handler code here</p&
44、gt;<p> CSettingDlg dlg;</p><p> dlg.m_nLineWidth=m_nLineWidth;</p><p> dlg.m_nLineStyle=m_nLineStyle;</p><p> if(IDOK==dlg.DoModal())</p><p><b> {<
45、;/b></p><p> m_nLineWidth=dlg.m_nLineWidth;</p><p> m_nLineStyle=dlg.m_nLineStyle;</p><p><b> }</b></p><p><b> }3.3顏色</b></p><
46、p> 顏色對話框看起來比較復(fù)雜。實際上,MFC為我們提供了一個類:CColorDialog,可以很方便的創(chuàng)建這樣的一個顏色對話框。</p><p> void CDrawView::OnColor() </p><p><b> {</b></p><p> // TODO: Add your command handler co
47、de here</p><p> CColorDialog dlg;</p><p> dlg.m_cc.Flags|=CC_RGBINIT;</p><p> dlg.m_cc.rgbResult=m_clr;</p><p> if(IDOK==dlg.DoModal())</p><p><b>
48、; {</b></p><p> m_clr=dlg.m_cc.rgbResult;</p><p><b> }</b></p><p><b> }</b></p><p> 3.3.6打開與保存</p><p> void CGraphicVie
49、w::OnFileOpen() </p><p><b> {</b></p><p> // TODO: Add your command handler code here</p><p> HMETAFILE hmetaFile;</p><p> hmetaFile=GetMetaFile("m
50、eta.wmf");</p><p> m_dcMetaFile.PlayMetaFile(hmetaFile);</p><p> DeleteMetaFile(hmetaFile);</p><p> Invalidate();</p><p><b> }</b></p><p
51、> void CGraphicView::OnFileSave() </p><p><b> {</b></p><p> // TODO: Add your command handler code here</p><p> HMETAFILE hmetaFile;</p><p> hmetaFi
52、le=m_dcMetaFile.Close();</p><p> CopyMetaFile(hmetaFile,"meta.wmf");</p><p> m_dcMetaFile.Create();</p><p> DeleteMetaFile(hmetaFile);</p><p><b> }&
53、lt;/b></p><p><b> 心得:</b></p><p> 其實學(xué)任何一種語言都是一樣的。需要勤奮+毅力+運氣=成功,這是我認為的一個公式。這里毅力和勤奮是個人因素,而運氣這是先天的。如果以前沒有接觸過編程語言的話,在接觸VC前我建議你先學(xué)習(xí)一些基礎(chǔ)語言,比如C等都是一些比較好學(xué)的基礎(chǔ)語言,我當(dāng)初就是從C語言過度學(xué)VC的。學(xué)基礎(chǔ)語言的目的是學(xué)習(xí)
54、語法結(jié)構(gòu)和如何編寫概念,只有你理解和掌握了這些編程用的工具才能學(xué)習(xí)高級語言。這些基礎(chǔ)語言中我建議大家學(xué)C語言,其實VC就是C++也就是C語言的"兒子","父親"學(xué)習(xí)起來比較容易上手,但遇到類似WINDOWS的程序的時候比較固執(zhí)不容易溝通,在這種條件下才有了"兒子","兒子"比較開朗應(yīng)變能力強,但是就因為他這些優(yōu)點才使初學(xué)者難以掌握。 VC是C++語言,是一種
55、面向?qū)ο蟮木幊陶Z言。他于基礎(chǔ)語言不同點在于,基礎(chǔ)語言是一條路走到底的(中斷技術(shù)除外),而面向?qū)ο笫堑却愕闹噶畈磐伦?,是被動的編程語言。這點是學(xué)習(xí)VC前必須扭轉(zhuǎn)的概念。通過這次學(xué)年設(shè)計,我了解vc++是Windows平臺上的C++編程環(huán)境等。通過畫圖,我學(xué)到了以下知識:</p><p> 1.對項目和文檔的了解,我們在編寫程序時,要對不同的文件進行編寫。其中項目就是文件的集合,包括頭文件、源代碼文件、資源文件
56、。文檔窗口也稱編輯窗口,是用戶進行輸入或編輯頭文件、源文件、資源的區(qū)域。在編輯文件時,為了增加程序的可讀性,系統(tǒng)用綠色顯示注釋語句,用藍色顯示關(guān)鍵字。</p><p> 2.菜單:我們繪制畫圖板時,就要建立一個“繪圖”菜單。對于“繪圖”菜單下還有幾個子菜單項,通過建立菜單同時讓它實現(xiàn)菜單上的命令,這就要我們對每個菜單項進行設(shè)置,諸如,ID、標(biāo)題、快捷鍵、熱鍵等。還有一些屬性設(shè)置,設(shè)置不好,容易出錯,所以每次建立
57、菜單,都需謹慎設(shè)置,記住每個菜單對應(yīng)的參數(shù)。</p><p> 3.文件打開與保存,對于我們繪制出一幅圖片,那么我們就要把它保存下來。如果我們無法保存,我們做了也就沒沒什么意義了。對于圖形的保存于打開,我們還存在很多問題,自定義保存不同文件夾下尚未解決,所以還需要我們進一步的學(xué)習(xí)和了解,爭取實現(xiàn)我們心里多希望的。</p><p> 4.在編程時遇到了圖像在變換大小時,原來的圖形會消失,
58、后來通過老師的講解,及查看相關(guān)資料,這里涉及的一個重繪問題。經(jīng)過多次修改,添加代碼,才得以解決。所以我覺得學(xué)習(xí)VC++就要拿出那種堅持不懈的精神,做什么也是,只有你不放棄對它了解,才會實現(xiàn)我們自己想要的,這就要我們要不斷的學(xué)習(xí)VC++,從中學(xué)習(xí)更多我們沒了解到的知識。</p><p> 5.對于CView視圖,經(jīng)過查詢主要是負責(zé)內(nèi)存數(shù)據(jù)與用戶的交互。包括數(shù)據(jù)的顯示、用戶操作的響應(yīng)(如菜單的選取、鼠標(biāo)的響應(yīng))。最
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小型餐飲系統(tǒng)課程設(shè)計
- 超市小型管理系統(tǒng)課程設(shè)計
- matlab課程設(shè)計--matlab的繪圖
- 小型繪圖系統(tǒng)文檔
- 小型超市的系統(tǒng)課程設(shè)計報告
- c語言課程設(shè)計報告----簡易繪圖
- 數(shù)據(jù)庫課程設(shè)計---小型記賬系統(tǒng)
- java課程設(shè)計-- 小型圖書管理系統(tǒng)
- java課程設(shè)計--小型圖書管理系統(tǒng)
- 小型旅游信息管理系統(tǒng)課程設(shè)計
- 傳感器課程設(shè)計--小型稱重系統(tǒng)設(shè)計
- c++課程設(shè)計-小型超市管理系統(tǒng)
- java課程設(shè)計小型圖書管理系統(tǒng)
- java語言課程設(shè)計-小型超市管理系統(tǒng)
- java課程設(shè)計小型圖書管理系統(tǒng)
- c語言課程設(shè)計-小型超市管理系統(tǒng)
- 某小型軋鋼車間供電系統(tǒng)設(shè)計課程設(shè)計
- 課程設(shè)計--小型公司工資管理系統(tǒng)的設(shè)計
- 液壓課程設(shè)計--小型液壓機液壓系統(tǒng)設(shè)計
- 數(shù)據(jù)庫課程設(shè)計--小型超市管理系統(tǒng)
評論
0/150
提交評論