版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、目 錄1 基本功能描述-12 設計思路-13 軟件設計-33.1 設計步驟-3 3.2 界面設計-7 3.3 關(guān)鍵功能實-84. 附錄-94.1 調(diào)試報告-94.2 測試結(jié)果-10 4.3關(guān)鍵源代碼-105 結(jié)論與心得體會-116. 參考文獻-117. 思考題-11簡單畫圖程序1 基本功能描述1) 在單文檔菜單中,在菜單行中可插入一個菜單項,命名為繪圖,在下拉菜單中可分別設置繪制的圖形形狀,如直線、矩形及橢圓,線寬選項,有1-5可供選擇,還可以設置線色以及填充色,通過彈出的顏色對話框選擇需要的顏色,如果不選擇線寬、線色以及填充色,則按默認的畫筆,畫刷來繪制選擇的圖形。 2) 選擇好圖形后,通過
2、鼠標可以繪制出相應的直線,矩形或橢圓,鼠標的按下確定圖形的起點,鼠標的拖動則確定了圖形的終點,即通過鼠標的拖動來決定圖形的大小,當鼠標彈起,此圖形則繪制完畢。3) 增添工具欄,設置繪制的圖形形狀,線色以及填充色,可更方便地選擇相應的功能。2 設計思路 1) 對需要用到的變量進行初始化。2) 選擇相應的圖形之后就響應相應的消息處理函數(shù),給shape賦對應的值。選擇不同的線寬,線色與填充色,即可改變畫筆或畫刷的屬性。3) 鼠標的按下響應函數(shù)OnLButtonDown(),捕捉鼠標當前位置得到起點的坐標,鼠標的拖動響函數(shù)OnMouseMove()改變終點的坐標,鼠標的彈起響應OnLButtonUp(
3、),確定終點坐標,刷新,得到繪制圖形。4) 選擇圖形或其它屬性,可進行下一次繪制。開始 定義并初始化變shape 線色m_ncolor 填充色 m_fcolor 畫筆pen畫刷brush繪圖起點opoint繪圖終點cpoint選擇線寬默認值(w=1)改變畫筆屬性選擇線色默認值(黑色)改變畫筆屬性選擇填充色默認值(黑色)改變畫刷屬性橢圓矩形直線響應函數(shù)OnEllipse()shape=3響應函數(shù)OnLine()shape=1響應函數(shù)OnRect()shape=2鼠標左鍵按下 響應函數(shù)OnLButtonDown()opoint=point鼠標移動 響應函數(shù)OnMouseMove()epoint=p
4、oint響應OnPaint(),繪制圖形鼠標左鍵彈起響應函數(shù)OnLButtonUp()刷新,得到圖形結(jié)束圖1 程序流程圖3 軟件設計3.1 設計步驟1)創(chuàng)建單文檔創(chuàng)建一個MFC AppWizardexe工程,命名為“yinshuyan”,如圖1所示,并創(chuàng)建單文檔,如圖2所示。創(chuàng)建成功后,系統(tǒng)自動生成相應的類,如圖3所示。圖2 創(chuàng)建工程圖3 創(chuàng)建單文檔圖4 生成類2) 編輯菜單添加需要的菜單項,如圖4所示;并在菜單的屬性中設定好所對應的ID,如圖5所示,各項菜單對應的ID如表1所示(其中線寬菜單為彈出菜單,只需在菜單項目屬性中的彈出選項前打勾即可,分隔線亦只需在菜單項目屬性中選中分隔符選項即可)
5、。圖5 添加菜單項圖6 設置菜單ID表1 菜單項對應ID菜單名ID菜單名ID直線ID_LINE線寬1ID_W1矩形ID_RECT線寬2ID_W2橢圓ID_ELLIPSE線寬3ID_W3顏色ID_COLOR線寬4ID_W4填充色ID_FILLCOLOR線寬5ID_W5建立類向?qū)?,在視圖類CyinshuyanView中,對各菜單項添加對應的COMMAND消息處理函數(shù),部分菜單項還添加對應的UPDATE_COMMAND_UI消息函數(shù),如圖6所示。圖7 建立類向?qū)?)創(chuàng)建工具欄在插入處選擇資源,新建工具欄,如圖7所示;圖8 新建工具欄在工具欄上添加相應的按鈕,在屬性處更改其ID,如圖8所示。圖9 編輯
6、工具欄4)在相應消息函數(shù)處添加代碼,實現(xiàn)其功能建立類向?qū)?,在視圖類CyinshuyanView中,添加WM_PAINT消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息,并在其中添加相應的代碼,如圖9所示。圖10 添加WM_PAINT消息3.2 界面設計各控件名稱,類型,屬性及相關(guān)變量如表2所示。 表2 界面控件表控件名稱控件類型屬性相關(guān)變量繪圖下拉式菜單 無 無 直線菜單項工具欄按鈕ID_LINEint shape矩形菜單項工具欄按鈕ID_RECTint shape 續(xù)表2 界面控件表控件名稱控件類型屬性相關(guān)變量橢圓菜單項 工具欄按鈕ID_ELLI
7、PSEint shape線寬彈出式菜單 無int w顏色(線色)菜單項工具欄按鈕ID_COLORCOLORREF m_nColor填充色菜單項工具欄按鈕ID_FILLCOLORCOLORREF m_fColor3.3 關(guān)鍵功能實現(xiàn)1)選擇要繪制的圖形在直線、矩形以及橢圓的消息處理函數(shù)里為shape分別賦值為1,2,3,在OnPaint()函數(shù)里添加3個if語句的代碼來這實現(xiàn)這三個圖形的繪制:當選擇畫直線時,shape=1,則執(zhí)行繪制直線代碼,當選擇畫矩形時,shape =2,則執(zhí)行繪制矩形的代碼,當性選擇畫橢圓時,shape=3,則執(zhí)行繪制橢圓的代碼。2)改變線寬 在OnPaint()創(chuàng)建的畫
8、筆中,pen.CreatePen(PS_SOLID,w, m_nColor),線寬處用w表示,則改變w的值即改變了畫筆的粗細。選擇菜單繪圖線寬選擇劃線寬度值,此時所選的線寬值就賦給線寬變量w。若不選擇線寬值,則w=1(即默認線寬值為1)。3)改變線色 在OnPaint()創(chuàng)建的畫筆中,pen.CreatePen(PS_SOLID,w, m_nColor),線的顏色處用m_nColor表示,則改變m_nColor即改變了畫筆的顏色。選擇菜單繪圖顏色,會彈出通過WM_COLORREF從系統(tǒng)中引入的顏色選擇對話框,選擇顏色后,點擊確定則相應顏色值就賦給變量m_nColor,此時畫筆的顏色就會發(fā)上變化
9、。若不選擇顏色,則默認(線)顏色為黑色。4)改變填充色 在OnPaint()創(chuàng)建的畫刷中,brush.CreateSolidBrush(m_fColor),顏色就是用m_fColor表示的,改變m_fColor即改變了畫刷的顏色。選擇菜單繪圖填充色,會彈出通過WM_COLORREF從系統(tǒng)中引入的顏色選擇對話框,選擇顏色后,點擊確定則相應顏色值就賦給變量m_fColor,此時畫刷的顏色就會發(fā)上變化。若不選擇顏色,則默認填充色為黑色。5)繪制圖形 鼠標左鍵按下,則捕獲鼠標此時的位置坐標為畫圖的起點,此時在OnLButtonDown()函數(shù)里,將捕獲的坐標值賦給定義作為起點的變量opoint;按下鼠
10、標左鍵拖動鼠標時,捕捉鼠標當前位置坐標值為終點坐標值,此時在OnMouseMove()函數(shù)里,把捕獲的坐標值賦給定義作為終點的變量cpoint,OnPaint()中繪圖的代碼中的坐標都得到了,進行繪圖;鼠標左鍵彈起時,此時繪圖結(jié)束,鼠標彈起時所在位置就是畫圖的最終終點位置,畫圖結(jié)束后,刷新窗口,以便重新畫圖,此時執(zhí)行的是OnLButtonUp()函數(shù)。圖11 快捷鍵的創(chuàng)建4. 附錄4.1 調(diào)試報告1)一開始我并沒有添加刷新函數(shù)Invalidate(),這就使程序運行之后,無論鼠標左鍵按下時如何移動無法繪圖,這是因為當一個窗口內(nèi)鍵入內(nèi)容其實就是將窗口刷新了,相當于更新了窗口,故必須有刷新函數(shù),這
11、和生活中的白紙寫字不一樣。2)當添加Invalidate()后,我把Invalidate()放在OnMouseMove()里,但是這樣只能在窗口內(nèi)畫一個圖形,即每畫完一個圖形就刷新一次。之后我通過與同學討論,并查找資料將Invalidate()改為了Invalidate(0),這時是可繪制多個圖形,但鼠標每移動一個位置都進行一次刷新,繪圖結(jié)束后,繪圖過程中的所有痕跡都在,產(chǎn)生了很多拖動的影子。,經(jīng)過幾次試驗,我將Invalidate(0) 放在了OnLButtonUp()中,那么每次重繪,上次的圖形會作為背景被保留下來,而不會被刷新掉。4.2 測試結(jié)果1)點擊鏈接,編譯,運行后的窗口如圖11所
12、示。圖11 運行結(jié)果2)改變繪制圖形形狀,顏色,線寬,填充色之后繪制的圖形如圖12所示。圖12 改便各項屬性厚后的圖形 4.3 關(guān)鍵源代碼1) 在“MainFrm.h”中,在class CMainFrame : public CFrameWnd里的protected下定義: CToolBar m_drawToolBar; /工具欄2)在“MainFrm.cpp”中,在CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)里添加以下代碼:if (!m_drawToolBar.Create(this) |!m_drawToolBar.LoadToolB
13、ar(IDR_DRAW)TRACE0("Failed to create status barn");return -1; 3)在“YinshuyanView.h”中,在class CYinshuyanView : public CView里的public下定義相關(guān)變量: COLORREF m_nColor; COLORREF m_fColor; CPoint cpoint; CPoint opoint; BOOL m_Down; int w; int shape; 4)在“YinshuyanView.cpp”中,添加如下函數(shù)及代碼: CYinshuyanView: CYi
14、nshuyanView() w=1; /初始線寬默認為1 shape=0; void CYinshuyanView:OnW1() w=1; /令線寬為1void CYinshuyanView:OnW2() w=2; /令線寬為2void CYinshuyan:OnW3() w=3; /令線寬為3void CYinshuyanView:OnW4() w=4; /令線寬為4void CYinshuyanView:OnW5() w=5; /令線寬為5void CYinshuyanView:OnUpdateW1(CCmdUI* pCmdUI) pCmdUI->SetRadio(w=1); /當線
15、寬為1時,此選項前標有圓點void CYinshuyanView:OnUpdateW2(CCmdUI* pCmdUI) pCmdUI->SetRadio(w=2); /當線寬為2時,此選項前標有圓點void CYinshuyanView:OnUpdateW3(CCmdUI* pCmdUI) pCmdUI->SetRadio(w=3); /當線寬為3時,此選項前標有圓點void CYinshuyanView:OnUpdateW4(CCmdUI* pCmdUI) pCmdUI->SetRadio(w=4); void CYinshuyanView:OnUpdateW5(CCmdU
16、I* pCmdUI) pCmdUI->SetRadio(w=5);void CYinshuyanView:OnLine() shape=1; /選擇直線,則令shape為1void CYinshuyanView:OnRect() shape=2; /選擇矩形,則令shape為2void CYinshuyanView:OnEllipse() shape=3; /選擇橢圓,則令shape為3void CYinshuyanView:OnUpdateLine(CCmdUI* pCmdUI) pCmdUI->SetCheck(shape=1); /shape為1時,直線選項前打上勾void
17、CYinshuyanView:OnUpdateRect(CCmdUI* pCmdUI) pCmdUI->SetCheck(shape=2); /shape為2時,矩形選項前打上勾void CYinshuyanView:OnUpdateEllipse(CCmdUI* pCmdUI) pCmdUI->SetCheck(shape=3); /shape為3時,橢圓選項前打上勾void CYinshuyanView:OnColor() CColorDialog Color; / 創(chuàng)建顏色對話框 if(Color.DoModal() = IDOK) / 如果用戶點擊OK按鈕 m_nColor
18、=Color.GetColor(); / 更改顏色,把顏色賦到m_nColorvoid CYinshuyanView:OnFullColor() CColorDialog FullColor; / 創(chuàng)建顏色對話框 if(FullColor.DoModal() = IDOK) / 如果用戶點擊OK按鈕 m_fColor=FullColor.GetColor(); / 更改顏色,把顏色賦到m_fColorvoid CYinshuyanView:OnPaint() CPaintDC dc(this); / device context for painting CPen pen; /定義畫筆 CBr
19、ush brush; /定義畫刷 pen.CreatePen(PS_SOLID,w, m_nColor); /創(chuàng)建畫筆 brush.CreateSolidBrush(m_fColor); /創(chuàng)建畫刷 dc.SelectObject(&pen); /獲取畫筆 dc.SelectObject(&brush); /獲取畫刷 if(shape=1) dc.MoveTo(opoint.x,opoint.y); dc.LineTo(cpoint.x,cpoint.y); /繪制直線,從opoint到cpoint連線 if(shape=2) dc.Rectangle(opoint.x,opo
20、int.y,cpoint.x,cpoint.y); /繪制矩形 if(shape=3) dc.Ellipse(opoint.x,opoint.y,cpoint.x,cpoint.y);/繪制橢圓void CYinshuyanView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default m_Down=TRUE; /鼠標按下 SetCapture(); /獲取坐標opoint=point; /把鼠標所在坐標賦給起點坐標opoint Releas
21、eCapture(); /釋放坐標CView:OnLButtonDown(nFlags, point);void CYinshuyanView:OnMouseMove(UINT nFlags, CPoint point) if(m_Down) /如果鼠標按下cpoint=point; /把鼠標所在點坐標賦給終點坐標cpoint CView:OnMouseMove(nFlags, point);void CYinshuyanView:OnLButtonUp(UINT nFlags, CPoint point) m_Down=FALSE; /鼠標不按下,即彈起 Invalidate(0); /刷新 CView:OnLButtonUp(nFlags, point);5 結(jié)論與心得體會 這次課程設計我成功的完成了。通過本次課程設計,我完成了用移動鼠標對直線,矩形,橢圓的簡單繪制工具的的制作,其中完成了繪圖形狀的選擇,畫圖線寬、線色以及圖形填充色的設置。 基于平時課外上機實驗的練習,對菜單的創(chuàng)
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位管理制度范例匯編【職工管理】十篇
- 《市場進入和效率》課件
- DBJ51-T 040-2021 四川省工程建設項目招標代理操作規(guī)程
- 超高層商住樓轉(zhuǎn)換層施工方案#模板工程#鋼筋工程#混凝土工程
- 《小數(shù)點移動》課件2
- 《寶馬銷售流程》課件
- 《電動力學chapter》課件
- 印刷包裝行業(yè)市場營銷經(jīng)驗分享
- 電腦設備銷售員工作總結(jié)
- 玩具模型銷售工作總結(jié)
- 運動神經(jīng)元病小講課
- 工會的財務管理制度〔13篇〕
- 新版醫(yī)務人員法律法規(guī)知識培訓課件
- 2024年土地市場研究分析服務協(xié)議
- 物業(yè)管理公文寫作培訓
- 2023醫(yī)療質(zhì)量安全核心制度要點釋義(第二版)對比版
- 家庭教育大講堂實施方案
- 部編版《道德與法治》四年級下冊教材解讀與分析文檔
- 2024-2030年中國機場跑道異物碎片(FOD)檢測系統(tǒng)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 學校體育學智慧樹知到答案2024年湖南科技大學
- 英語完形填空練習題20篇
評論
0/150
提交評論