c++簡單畫圖程序_第1頁
c++簡單畫圖程序_第2頁
c++簡單畫圖程序_第3頁
c++簡單畫圖程序_第4頁
c++簡單畫圖程序_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、目錄1. 基本功能描述 12. 設(shè)計思路 13. 軟件設(shè)計 4設(shè)計步驟 4界面設(shè)計 6關(guān)鍵功能的實現(xiàn) 74. 結(jié)論與心得體會 85. 思考題 86. 附錄 10調(diào)試報告 10測試結(jié)果 10關(guān)鍵源代碼 10簡單畫圖程序1. 基本功能描述簡單畫圖程序?qū)崿F(xiàn)了常見圖形的繪制、圖形屬性的設(shè)置和圖形數(shù)據(jù)的暫存等功能。該 程序的具體功能模塊包括以下幾項:1) 圖形繪制模塊。該模塊實現(xiàn)直線段、橢圓、矩形等圖形的繪制功能。在鼠標移動 的過程中能實時顯示當前繪制的圖形。2) 圖形屬性設(shè)置模塊。該模塊實現(xiàn)繪圖線條的線寬,線色,圖形填充色等屬性設(shè)置 功能。3) 圖形數(shù)據(jù)暫存模塊。該模塊實現(xiàn)直線段、橢圓、矩形等圖形數(shù)據(jù)

2、暫存功能,涉及 圖形的坐標、線寬、線色、填充色等數(shù)據(jù)。2. 設(shè)計思路1) 對需要用到的變量進行初始化。2) 選擇相應(yīng)的圖形之后就響應(yīng)相應(yīng)的消息處理函數(shù),給 shape 賦對應(yīng)的值。選擇不 同的線寬,線色與填充色,即可改變畫筆或畫刷的屬性。3) 鼠標的按下響應(yīng)函數(shù) OnLButtonDown(),捕捉鼠標當前位置得到起點的坐標, 鼠標 的拖動響函數(shù) OnMouseMove(改) 變終點的坐標,鼠標的彈起響應(yīng) OnLButtonUp() ,確定終 點坐標,刷新,得到繪制圖形。4) 選擇圖形或其它屬性,可進行下一次繪制。5) 程序的流程圖如下:開始定義并初始化變 shape 線色 m_ncolor

3、填充色 m_fcolor畫筆 pen 畫刷 brush 繪圖起點 opoint 繪圖終點 cpoint改變畫筆屬性默認值( W=1)改變畫筆屬性默認值(黑色)改變畫刷屬性默認值(白色)鼠標左鍵按下 響應(yīng)函數(shù) OnLButtonDown()opoint=point鼠標移動 響應(yīng)函數(shù) OnMouseMove()epoint=point響應(yīng) OnPaint() ,繪制圖形鼠標左鍵彈起響應(yīng)函數(shù) OnLButtonUp()圖1 程序流程圖3. 軟件設(shè)計設(shè)計步驟1) 創(chuàng)建單文檔創(chuàng)建一個 MFCA ppWizardexe 工程,命名為“ LiYuJing ”,如圖 1 所示,并創(chuàng)建單文檔,如圖 2 所示。創(chuàng)

4、建成功后,系統(tǒng)自動生成相應(yīng)的類,如圖 3 所示。圖 2 創(chuàng)建工程圖3 創(chuàng)建單文檔圖4 生成類2)編輯菜單添加需要的菜單項, 如圖 4 所示;并在菜單的屬性中設(shè)定好所對應(yīng)的 ID,如圖 5所示, 各項菜單對應(yīng)的 ID 如表 1 所示(其中線寬菜單為彈出菜單,只需在菜單項目屬性中的彈 出選項前打勾即可,分隔線亦只需在菜單項目屬性中選中分隔符選項即可) 。圖5 添加菜單項圖 6 設(shè)置菜單 ID表 1 對應(yīng)菜單 ID菜單名ID菜單名ID直線ID_LINE線寬 1ID_W1矩形ID_RECT線寬 2ID_W2橢圓ID_ELLIPSE線寬 3ID_W3顏色ID_COLOR線寬 4ID_W4填充色ID_FI

5、LLCOLOR線寬 5ID_W5建立類向?qū)?,在視圖類 CLiYuJingView 中,對各菜單項添加對應(yīng)的 COMMAN消D息處理函數(shù),部分菜單項還添加對應(yīng)的 UPDATE_COMMAND消_息UI函數(shù),如圖 7 所示。圖7 建立類向?qū)?) 創(chuàng)建工具欄在插入處選擇資源,新建工具欄,如圖 8 所示;圖8 新建工具欄在工具欄上添加相應(yīng)的按鈕,在屬性處更改其 ID,如圖 9 所示。圖9 編輯工具欄4) 添加鼠標消息處理函數(shù)添加鼠標消息處理函數(shù) OnLButtonDown()、 OnMouseMove(、) OnLButtonUp() ,利用橡 皮筋技術(shù)實時顯示繪制圖形,并繪制最終圖形,具體源代碼參看

6、附錄。添加過程為:選擇 View 菜單下的 ClassWizard 菜單項打開類向?qū)В?在類列表中選擇 CLiYuJingView 類,在消 息列表框中選擇 WM_LBUTTONDO消W息N并用鼠標左鍵雙擊,此時類向?qū)ё詣釉诔蓡T函數(shù)列 表框中添加該消息的處理函數(shù)。 然后再用同樣方法添加 WM_MOUSEM消OV息E和 WM_LBUTTONUP 消息的處理函數(shù),如圖 10 所示。圖 10 添加相應(yīng)代碼界面設(shè)計各控件名稱,類型,屬性以及相關(guān)變量如表 2 所示。表2 界面控件表控件名稱控件類型屬性相關(guān)變量繪圖下拉式菜單無無直線菜單項工具欄按鈕ID_LINEint shape矩形菜單項工具欄按鈕ID_

7、RECTint shape橢圓菜單項工具欄按鈕ID_ELLIPSEint shape線寬彈出式菜單無int w顏色(線色)菜單項工具欄按鈕ID_COLORCOLORREF m_nColo填充色菜單項工具欄按鈕ID_FILLCOLORCOLORREF m_fColor整體界面如圖 11 所示圖 11 整體界面顯示關(guān)鍵功能的實現(xiàn)1) 選擇要繪制的圖形在直線、矩形以及橢圓的消息處理函數(shù)里為 shape 分別賦值為 1,2,3 ,在 OnPaint() 函數(shù)里添加 3個 if 語句的代碼來這實現(xiàn)這三個圖形的繪制:當選擇畫直線時, shape=1, 則執(zhí)行繪制直線代碼,當選擇畫矩形時, shape =2

8、, 則執(zhí)行繪制矩形的代碼,當性選擇畫 橢圓時 ,shape=3, 則執(zhí)行繪制橢圓的代碼。2) 改變線寬在 OnPaint() 創(chuàng)建的畫筆中, (PS_SOLID,w, m_nColor) ,線寬處用 w 表示,則改變 w 的值即改變了畫筆的粗細。選擇菜單繪圖線寬選擇劃線寬度值,此時所選的線寬值就賦 給線寬變量 w。若不選擇線寬值,則 w=1(即默認線寬值為 1) 。3) 改變線色在 OnPaint() 創(chuàng)建的畫筆中, (PS_SOLID,w, m_nColor) ,線的顏色處用 m_nColor 表示, 則改變 m_nColor 即改變了畫筆的顏色。選擇菜單繪圖顏色,會彈出通過 WM_COLO

9、RREF 從系統(tǒng)中引入的顏色選擇對話框,選擇顏色后,點擊確定則相應(yīng)顏色值就賦給變量m_nColor,此時畫筆的顏色就會發(fā)上變化。若不選擇顏色,則默認(線)顏色為黑色4) 改變填充色在 OnPaint() 創(chuàng)建的畫刷中, (m_fColor) ,顏色就是用 m_fColor 表示的,改變 m_fColor 即改變了畫刷的顏色。選擇菜單繪圖填充色,會彈出通過WM_COLORR從E系F 統(tǒng)中引入的顏色選擇對話框,選擇顏色后,點擊確定則相應(yīng)顏色值就賦給變量 m_fColor ,此時畫刷的 顏色就會發(fā)上變化。若不選擇顏色,則默認填充色為白色。5) 橡皮筋技術(shù)實現(xiàn)鼠標實時繪圖利用橡皮筋技術(shù)可以實現(xiàn)在鼠標拖

10、拽作圖時,實時顯示當前繪圖的情況。這樣,我們 就要在鼠標移動的消息處理函數(shù)中添加相應(yīng)的代碼。在鼠標左鍵按下的時候,記錄下圖元 起始點;在鼠標移動的時候,獲取鼠標當前位置,繪制出新的圖形,同時,將上一次繪制 的圖形擦除,這就是橡皮筋技術(shù)。在 OnMouseMove(函) 數(shù)中調(diào)用 SetROP2()函數(shù)將繪圖模 式設(shè)置為 NOTXORP(EN同或)模式,使用同或模式繪圖就可以畫上真實的圖形,并擦除上 次繪制的圖形。在 OnLButtonDown() 函數(shù)中調(diào)用 SetCapture() 函數(shù)捕捉鼠標, OnLButtonUp() 函數(shù)中 調(diào)用 ReleaseCapture() 函數(shù)釋放鼠標。整個

11、繪圖過程就是在鼠標左鍵按下時確定繪圖起 點,移動鼠標實時顯示繪制的圖形,鼠標左鍵彈起即完成圖形的繪制的過程。4. 結(jié)論與心得體會這次課設(shè)我成功地完成了設(shè)計要求,能用鼠標拖動繪制直線段、橢圓、矩形等基本圖 形;能控制所繪制圖形的線寬、線色、填充色等。經(jīng)過程序調(diào)試,該簡單畫圖程序能夠繪 制指定線寬、線色、填充色的圖形,在鼠標移動的過程中能實時顯示當前繪制的圖形。在拿到任務(wù)書后,我通過查閱資料,不斷編程調(diào)試,以及請教同學,最終實現(xiàn)繪圖程 序的要求。我學會了鼠標消息的分類,鼠標消息處理函數(shù)的常見編程方法,以及捕捉鼠標 SetCapture() 函數(shù),釋放鼠標 ReleaseCapture() 函數(shù)。同

12、時,利用橡皮筋技術(shù)實現(xiàn)鼠標繪 圖的實時顯示是我最大的收獲。我在調(diào)試程序時, 發(fā)現(xiàn)繪制直線時鼠標左鍵彈起直線并沒有繪制結(jié)束, 而再次單擊鼠標左鍵,又以上次繪制的直線段終點作為起點繪制直線,即繪制出的直線段是一段連著一 段的。在自己檢查數(shù)遍并未發(fā)現(xiàn)錯誤之處后,我求助了同學,在OnLButtonDown()函數(shù)中添加了一句 cpoint=opoint=point0 之后問題得以解決。通過這次課程設(shè)計,我學到了很多與計算機繪圖相關(guān)的基礎(chǔ)知識,并進一步體會到面 向?qū)ο蟮某绦蛟O(shè)計的強大,以及 Windows應(yīng)用程序用戶界面統(tǒng)一、友好,獨立于設(shè)備的圖 形操作特點。這次的課程設(shè)計雖只是做了一個簡單的繪圖工具,

13、但是也讓我從設(shè)計者的角 度了解了設(shè)計一個程序的過程,看似一個很簡單的工具,其制作的背后工作是繁瑣的。哪 怕是平時我們使用的很順手的一個小工具,其開發(fā)的一切步驟都不可小覷,所以,關(guān)于編 程還有太多的東西等著我們?nèi)チ私猓瑢W習。5. 思考題1) 說明直線、橢圓、矩形繪制使用的函數(shù),及其參數(shù)含義答:直線、橢圓、矩形繪制使用的函數(shù)是 OnPaint() 。函數(shù)里面定義和創(chuàng)建了繪圖的 畫筆 pen 和填充圖形的畫刷 brush ,3 種圖形本身對應(yīng)的消息處理函數(shù)里分別賦給 shape3 個不同的值: 1,2,3,在 OnPaint() 里有 3個 if 語句,用來這實現(xiàn)這三個圖形的繪制: 當選擇畫直線時,

14、 shape=1,則執(zhí)行繪制直線代碼,當選擇畫矩形時, shape =2, 則執(zhí)行繪 制矩形的代碼,當性選擇畫橢圓時 ,shape=3, 則執(zhí)行繪制橢圓的代碼。2) 如何控制菜單項的狀態(tài),使用的消息類型答:通過添加 UPDATE_COMMAND消_息UI函數(shù),在生成的函數(shù)里添加相關(guān)代碼來控制菜 單項的狀態(tài)及使用的消息類型。如選擇直線時,使shape=1,則 OnUpdateLine 里添加pCmdUI->SetCheck(shape=1),那么當 shape 的值為 1 時,即代表選擇了直線項,此時菜 單中的直線選項前就打勾了,代表選中。矩形和橢圓類似。3) 如何設(shè)置菜單和工具欄按鈕的快

15、捷鍵操作答:切換到資源視圖, 選擇 Accelerator 資源類型, 雙擊 IDR_MAINFRAM加E速鍵資源, 打開加速鍵編輯窗口。 在 ID 下拉列表框中選擇相應(yīng)菜單項的 ID,在 Key 一欄中輸入相應(yīng) 鍵值(比如 L),選擇 Ctrl 復選框和 VirtKey 單選按鈕,關(guān)閉加速鍵編輯窗口,即可完成 加速鍵設(shè)置,如圖 12 所示。圖 12 快捷鍵設(shè)置6. 附錄調(diào)試報告1) 一開始我并沒有添加刷新函數(shù) Invalidate() ,這就使程序運行之后,無論鼠標左 鍵按下時如何移動無法繪圖,這是因為當一個窗口內(nèi)鍵入內(nèi)容其實就是將窗口刷新了,相 當于更新了窗口,故必須有刷新函數(shù)。2) 在調(diào)

16、試程序時,發(fā)現(xiàn)繪制直線時鼠標左鍵彈起直線并沒有繪制結(jié)束,而再次單擊 鼠標左鍵,又以上次繪制的直線段終點作為起點繪制直線,即繪制出的直線段是一段連著 一段的。在 OnLButtonDown()函數(shù)中添加了一句 cpoint=opoint=point0 之后問題得以解決。 這是因為要給初始坐標和終止坐標賦個 0 值,不然系統(tǒng)無法判斷坐標位置。測試結(jié)果編譯、連接、運行程序后,在窗口中繪制不同線寬,不同線色,不同填充色的圖形后 窗口如圖 13 所示。圖 13 繪制各個圖形關(guān)鍵源代碼1) 在“”中,在 class CMainFrame : public CFrameWnd 里的 protected 下定

17、義: CToolBar m_drawToolBar; / 工具欄2) 在“”中,在 CMainFrame:OnCreate(LPCREATESTRUlCpTC reateStruct) 里添加以 下代碼:if (!(this) |!(IDR_DRAW) TRACE0("Failed to create status barn");return -1;3) 在“”中,在 class CLiYuJingiew : public CView里的 public 下定義相關(guān)變量:CLiYuJingDoc* GetDocument();COLORREF m_nColor;COLORRE

18、F m_fColor;CPoint cpoint;CPoint opoint;BOOL m_Down;int w;int shape;HCURSOR m_Cursor;/光/ 標資源句柄4) 在“”中,添加如下函數(shù)及代碼:CLiYuJingView:CLiYuJingView()/ TODO: add construction code herew=1; / 初始線寬默認為 1shape=0;m_fColor=RGB(255,255,255);/ 初始填充色為白色m_Cursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS); void CLiYu

19、JingView:OnW5()w=5; / 令線寬為 5 void CLiYuJingView:OnW1()w=1; / 令線寬為 1void CLiYuJingView:OnW2()w=2; / 令線寬為 2void CLiYuJingView:OnW3()w=3; / 令線寬為 3void CLiYuJingView:OnW4()w=4; / 令線寬為 4void CLiYuJingView:OnUpdateW1(CCmdUI* pCmdUI)pCmdUI->SetRadio(w=1); / 當線寬為 1 時,此選項前標有圓點void CLiYuJingView:OnUpdateW2

20、(CCmdUI* pCmdUI)pCmdUI->SetRadio(w=2); / 當線寬為 2 時,此選項前標有圓點void CLiYuJingView:OnUpdateW3(CCmdUI* pCmdUI)pCmdUI->SetRadio(w=3); / 當線寬為 3 時,此選項前標有圓點 void CLiYuJingView:OnUpdateW4(CCmdUI* pCmdUI)pCmdUI->SetRadio(w=4);void CLiYuJingView:OnUpdateW5(CCmdUI* pCmdUI)pCmdUI->SetRadio(w=5);void CLi

21、YuJingView:OnLine()shape=1; / 選擇直線,則令 shape 為 1 m_Cursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS); void CLiYuJingView:OnRect()shape=2; / 選擇矩形,則令 shape 為 2m_Cursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS); void CLiYuJingView:OnEllipse()shape=3; / 選擇橢圓,則令 shape 為 3m_Cursor=AfxGetApp()->Lo

22、adStandardCursor(IDC_CROSS);void CLiYuJingView:OnUpdateLine(CCmdUI* pCmdUI)pCmdUI->SetCheck(shape=1); /shape 為 1 時,直線選項前打上勾 void CLiYuJingView:OnUpdateRect(CCmdUI* pCmdUI)pCmdUI->SetCheck(shape=2); /shape 為 2 時,矩形選項前打上勾void CLiYuJingView:OnUpdateEllipse(CCmdUI* pCmdUI)pCmdUI->SetCheck(shape

23、=3); /shape 為 3 時,橢圓選項前打上勾 void CLiYuJingView:OnColor()CColorDialog Color; / 創(chuàng)建顏色對話框if() = IDOK) / 如果用戶點擊 OK按鈕m_nColor=(); /更改顏色 , 把顏色賦到 m_nColorvoid CLiYuJingView:OnFillcolor()CColorDialog FullColor; /創(chuàng)建顏色對話框if() = IDOK) /如果用戶點擊 OK按鈕m_fColor=(); /更改顏色 , 把顏色賦到 m_fColorvoid CLiYuJingView:OnPaint()CPa

24、intDC dc(this); / device context for paintingCPen pen; /定義畫筆CBrush brush; /定義畫刷(PS_SOLID,w, m_nColor); / 創(chuàng)建畫筆(m_fColor); /創(chuàng)建畫刷(&pen); /獲取畫筆(&brush); /獲取畫刷if(shape=1),;,; /繪制直線 , 從 opoint 到 cpoint 連線if(shape=2),; / 繪制矩形if(shape=3),; / 繪制橢圓void CLiYuJingView:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call defaultm_Down=TRUE;/ 鼠標按下SetCapture(); /獲取坐標cpoint=opoint=point;/ 把鼠標所在坐標賦給起點坐標 opointReleaseCapture(); /釋放坐標CView:OnLButtonDown(nFlags, point);void CLiYuJingView:OnMouseMove(UINT nFlags, CPoint point) if(m_Down) / 如果鼠標按下SetCursor(m_Cursor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論