2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論