




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、-PAGE . z.簡單畫圖程序【實(shí)驗(yàn)?zāi)康摹勘緦?shí)驗(yàn)?zāi)康氖峭ㄟ^構(gòu)建基于MFC的windows畫圖程序,使學(xué)生:(1) 理解MFC應(yīng)用程序的運(yùn)行機(jī)制(2) 掌握使用MFC構(gòu)建Windows應(yīng)用程序的根本構(gòu)造及編程的根本方法(3) 理解和掌握MFC應(yīng)用程序消息處理機(jī)制及應(yīng)用(4) 掌握類向?qū)lassWizard的使用【實(shí)驗(yàn)要求】(1) 必須做好實(shí)驗(yàn)原理的預(yù)習(xí)。(2) 需要對提供的程序代碼進(jìn)展分析,并明確實(shí)驗(yàn)時(shí)還應(yīng)在何處添加哪些語句?!緦?shí)驗(yàn)環(huán)境】Microsoft Windows *PMicrosoft Visual C+ 6.01 根本功能描述1) 在單文檔菜單中,在菜單行中可插入一個(gè)菜單項(xiàng),命名
2、為繪圖,在下拉菜單中可分別設(shè)置繪制的圖形形狀,如直線、矩形及橢圓,線寬選項(xiàng),有1-5可供選擇,還可以設(shè)置線色以及填充色,通過彈出的顏色對話框選擇需要的顏色,如果不選擇線寬、線色以及填充色,則按默認(rèn)的畫筆,畫刷來繪制選擇的圖形。 2) 選擇好圖形后,通過鼠標(biāo)可以繪制出相應(yīng)的直線,矩形或橢圓,鼠標(biāo)的按下確定圖形的起點(diǎn),鼠標(biāo)的拖動(dòng)則確定了圖形的終點(diǎn),即通過鼠標(biāo)的拖動(dòng)來決定圖形的大小,當(dāng)鼠標(biāo)彈起,此圖形則繪制完畢。3) 增添工具欄,設(shè)置繪制的圖形形狀,線色以及填充色,可更方便地選擇相應(yīng)的功能。2設(shè)計(jì)思路 1) 對需要用到的變量進(jìn)展初始化。2) 選擇相應(yīng)的圖形之后就響應(yīng)相應(yīng)的消息處理函數(shù),給shape賦
3、對應(yīng)的值。選擇不同的線寬,線色與填充色,即可改變畫筆或畫刷的屬性。3) 鼠標(biāo)的按下響應(yīng)函數(shù)OnLButtonDown(),捕捉鼠標(biāo)當(dāng)前位置得到起點(diǎn)的坐標(biāo),鼠標(biāo)的拖動(dòng)響函數(shù)OnMouseMove()改變終點(diǎn)的坐標(biāo),鼠標(biāo)的彈起響應(yīng)OnLButtonUp(),確定終點(diǎn)坐標(biāo),刷新,得到繪制圖形。4) 選擇圖形或其它屬性,可進(jìn)展下一次繪制。開場定義并初始化變shape 線色m_ncolor 填充色 m_fcolor 畫筆pen畫刷brush繪圖起點(diǎn)opoint繪圖終點(diǎn)cpoint選擇線寬默認(rèn)值w=1改變畫筆屬性選擇線色默認(rèn)值黑色改變畫筆屬性選擇填充色默認(rèn)值黑色改變畫刷屬性橢圓矩形直線響應(yīng)函數(shù)OnElli
4、pse()shape=3響應(yīng)函數(shù)OnLine()shape=1響應(yīng)函數(shù)OnRect()shape=2鼠標(biāo)左鍵按下 響應(yīng)函數(shù)OnLButtonDown()opoint=point鼠標(biāo)移動(dòng) 響應(yīng)函數(shù)OnMouseMove()epoint=point響應(yīng)OnPaint(),繪制圖形鼠標(biāo)左鍵彈起響應(yīng)函數(shù)OnLButtonUp()刷新,得到圖形完畢圖1 程序流程圖3軟件設(shè)計(jì)3.1 設(shè)計(jì)步驟1創(chuàng)立單文檔創(chuàng)立一個(gè)MFC AppWizarde*e工程,命名為yinshuyan,如圖2所示,并創(chuàng)立單文檔,如圖3所示。創(chuàng)立成功后,系統(tǒng)自動(dòng)生成相應(yīng)的類,如圖4所示。圖2 創(chuàng)立工程圖3 創(chuàng)立單文檔圖4 生成類編輯菜單
5、添加需要的菜單項(xiàng),如圖5所示可以通過拖動(dòng)調(diào)整菜單的順序;并在菜單的屬性中設(shè)定好所對應(yīng)的ID,如圖6所示,各項(xiàng)菜單對應(yīng)的ID如表1所示其中線寬菜單為彈出菜單,只需在菜單工程屬性中的彈出選項(xiàng)前打勾即可,分隔線亦只需在菜單工程屬性中選中分隔符Separator選項(xiàng)即可。圖5 添加菜單項(xiàng)圖6 設(shè)置菜單ID表1 菜單項(xiàng)對應(yīng)ID菜單名ID菜單名ID直線ID_LINE線寬1ID_W1矩形ID_RECT線寬2ID_W2橢圓ID_ELLIPSE線寬3ID_W3顏色I(xiàn)D_COLOR線寬4ID_W4填充色I(xiàn)D_FILLCOLOR線寬5ID_W5建立類向?qū)?,在視圖類CyinshuyanView通過菜單View-Cla
6、ssWizard,或者快捷鍵Ctrl+w翻開中,對各菜單項(xiàng)添加對應(yīng)的MAND消息處理函數(shù),局部菜單項(xiàng)還添加對應(yīng)的UPDATE_MAND_UI消息函數(shù),如圖7所示。圖7 建立類向?qū)А咀⒁猓捍藞D有誤,Class name的下拉框中,應(yīng)選擇CyinshuyanView而非此圖顯示的CMainFrame】上述操作完成后,可以發(fā)現(xiàn)在Class CMainFrame中自動(dòng)增加了類似OnLine()之類的許多函數(shù),并且在源文件MainFrm.cpp中,自動(dòng)添加了相應(yīng)的消息映射。BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)/AF*_MSG_MAP(CMainFrame)ON
7、_WM_CREATE()ON_MAND(ID_LINE, OnLine)END_MESSAGE_MAP()3創(chuàng)立工具欄在插入處選擇資源菜單Insert-Resource,或者快捷鍵Ctrl+R,新建工具欄,如圖8所示;圖8 新建工具欄在工具欄上添加相應(yīng)的按鈕,在屬性處更改其ID,如圖9所示。圖9 編輯工具欄4在相應(yīng)消息函數(shù)處添加代碼,實(shí)現(xiàn)其功能建立類向?qū)?,在視圖類CyinshuyanView中,添加WM_PAINT消息,以及WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息,并在其中添加相應(yīng)的代碼,如圖10所示。圖10 添加WM_PAINT消息3.2 界面設(shè)計(jì)
8、各控件名稱,類型,屬性及相關(guān)變量如表2所示。 表2 界面控件表控件名稱控件類型屬性相關(guān)變量繪圖下拉式菜單 無 無 直線菜單項(xiàng)工具欄按鈕ID_LINEint shape矩形菜單項(xiàng)工具欄按鈕ID_RECTint shape橢圓菜單項(xiàng) 工具欄按鈕ID_ELLIPSEint shape線寬彈出式菜單 無int w顏色(線色)菜單項(xiàng)工具欄按鈕ID_COLORCOLORREF m_nColor填充色菜單項(xiàng)工具欄按鈕ID_FILLCOLORCOLORREFm_fColor3.3 關(guān)鍵源代碼在MainFrm.h中,在class CMainFrame : public CFrameWnd里的protected下
9、定義: CToolBar m_drawToolBar; /工具欄2)在MainFrm.cpp中,在CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)里添加以下代碼:if (!m_drawToolBar.Create(this) |!m_drawToolBar.LoadToolBar(IDR_DRAW)TRACE0(Failed to create status barn);return -1; 3)在YinshuyanView.h中,在class CYinshuyanView : public CView里的public下定義相關(guān)變量:COLO
10、RREF m_nColor;COLORREF m_fColor;CPoint cpoint; CPoint opoint;BOOL m_Down;int w;int shape; 4)在YinshuyanView.cpp中,添加如下函數(shù)及代碼:CYinshuyanView: CYinshuyanView() w=1; /初始線寬默認(rèn)為1 shape=0; void CYinshuyanView:OnW1() w=1; /令線寬為1void CYinshuyanView:OnW2() w=2; /令線寬為2void CYinshuyan:OnW3() w=3; /令線寬為3void CYinsh
11、uyanView:OnW4() w=4; /令線寬為4void CYinshuyanView:OnW5() w=5; /令線寬為5void CYinshuyanView:OnUpdateW1(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=1); /當(dāng)線寬為1時(shí),此選項(xiàng)前標(biāo)有圓點(diǎn)void CYinshuyanView:OnUpdateW2(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=2); /當(dāng)線寬為2時(shí),此選項(xiàng)前標(biāo)有圓點(diǎn)void CYinshuyanView:OnUpdateW3(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=
12、3); /當(dāng)線寬為3時(shí),此選項(xiàng)前標(biāo)有圓點(diǎn)void CYinshuyanView:OnUpdateW4(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=4); void CYinshuyanView:OnUpdateW5(CCmdUI* pCmdUI) pCmdUI-SetRadio(w=5);void CYinshuyanView:OnLine() shape=1; /選擇直線,則令shape為1void CYinshuyanView:OnRect() shape=2; /選擇矩形,則令shape為2void CYinshuyanView:OnEllipse() shape
13、=3; /選擇橢圓,則令shape為3void CYinshuyanView:OnUpdateLine(CCmdUI* pCmdUI) pCmdUI-SetCheck(shape=1); /shape為1時(shí),直線選項(xiàng)前打上勾void CYinshuyanView:OnUpdateRect(CCmdUI* pCmdUI) pCmdUI-SetCheck(shape=2); /shape為2時(shí),矩形選項(xiàng)前打上勾void CYinshuyanView:OnUpdateEllipse(CCmdUI* pCmdUI) pCmdUI-SetCheck(shape=3); /shape為3時(shí),橢圓選項(xiàng)前打上
14、勾void CYinshuyanView:OnColor() CColorDialog Color; / 創(chuàng)立顏色對話框 if(Color.DoModal() = IDOK) / 如果用戶點(diǎn)擊OK按鈕 m_nColor=Color.GetColor(); / 更改顏色,把顏色賦到m_nColorvoid CYinshuyanView:OnFillColor() CColorDialog FillColor; / 創(chuàng)立顏色對話框 if(FillColor.DoModal() = IDOK) / 如果用戶點(diǎn)擊OK按鈕 m_fColor=FillColor.GetColor(); / 更改顏色,把顏
15、色賦到m_fColorvoid CYinshuyanView:OnPaint() CPaintDC dc(this); / device conte*t for painting CPen pen; /定義畫筆 CBrush 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.*,
16、opoint.y); dc.LineTo(cpoint.*,cpoint.y); /繪制直線,從opoint到cpoint連線 if(shape=2) dc.Rectangle(opoint.*,opoint.y,cpoint.*,cpoint.y); /繪制矩形 if(shape=3) dc.Ellipse(opoint.*,opoint.y,cpoint.*,cpoint.y);/繪制橢圓void CYinshuyanView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code her
17、e and/or call default m_Down=TRUE; /鼠標(biāo)按下 SetCapture(); /獲取坐標(biāo)opoint=point; /把鼠標(biāo)所在坐標(biāo)賦給起點(diǎn)坐標(biāo)opoint ReleaseCapture(); /釋放坐標(biāo)CView:OnLButtonDown(nFlags, point);void CYinshuyanView:OnMouseMove(UINT nFlags, CPoint point) if(m_Down) /如果鼠標(biāo)按下cpoint=point; /把鼠標(biāo)所在點(diǎn)坐標(biāo)賦給終點(diǎn)坐標(biāo)cpoint CView:OnMouseMove(nFlags, point);v
18、oid CYinshuyanView:OnLButtonUp(UINT nFlags, CPoint point) m_Down=FALSE; /鼠標(biāo)不按下,即彈起 Invalidate(0); /刷新 CView:OnLButtonUp(nFlags, point);3.4關(guān)鍵功能實(shí)現(xiàn)1選擇要繪制的圖形在直線、矩形以及橢圓的消息處理函數(shù)里為shape分別賦值為1,2,3,在OnPaint()函數(shù)里添加3個(gè)if語句的代碼來這實(shí)現(xiàn)這三個(gè)圖形的繪制:中選擇畫直線時(shí),shape=1,則執(zhí)行繪制直線代碼,中選擇畫矩形時(shí),shape =2,則執(zhí)行繪制矩形的代碼,當(dāng)性選擇畫橢圓時(shí),shape=3,則執(zhí)行繪
19、制橢圓的代碼。2改變線寬在OnPaint()創(chuàng)立的畫筆中,pen.CreatePen(PS_SOLID,w, m_nColor),線寬處用w表示,則改變w的值即改變了畫筆的粗細(xì)。選擇菜單繪圖線寬選擇劃線寬度值,此時(shí)所選的線寬值就賦給線寬變量w。假設(shè)不選擇線寬值,則w=1(即默認(rèn)線寬值為1)。3改變線色 在OnPaint()創(chuàng)立的畫筆中,pen.CreatePen(PS_SOLID,w, m_nColor),線的顏色處用m_nColor表示,則改變m_nColor即改變了畫筆的顏色。選擇菜單繪圖顏色,會彈出通過WM_COLORREF從系統(tǒng)中引入的顏色選擇對話框,選擇顏色后,點(diǎn)擊確定則相應(yīng)顏色值就
20、賦給變量m_nColor,此時(shí)畫筆的顏色就會發(fā)上變化。假設(shè)不選擇顏色,則默認(rèn)線顏色為黑色。4改變填充色 在OnPaint()創(chuàng)立的畫刷中,brush.CreateSolidBrush(m_fColor),顏色就是用m_fColor表示的,改變m_fColor即改變了畫刷的顏色。選擇菜單繪圖填充色,會彈出通過WM_COLORREF從系統(tǒng)中引入的顏色選擇對話框,選擇顏色后,點(diǎn)擊確定則相應(yīng)顏色值就賦給變量m_fColor,此時(shí)畫刷的顏色就會發(fā)上變化。假設(shè)不選擇顏色,則默認(rèn)填充色為黑色。5繪制圖形 鼠標(biāo)左鍵按下,則捕獲鼠標(biāo)此時(shí)的位置坐標(biāo)為畫圖的起點(diǎn),此時(shí)在OnLButtonDown()函數(shù)里,將捕獲的
21、坐標(biāo)值賦給定義作為起點(diǎn)的變量opoint;按下鼠標(biāo)左鍵拖動(dòng)鼠標(biāo)時(shí),捕捉鼠標(biāo)當(dāng)前位置坐標(biāo)值為終點(diǎn)坐標(biāo)值,此時(shí)在OnMouseMove()函數(shù)里,把捕獲的坐標(biāo)值賦給定義作為終點(diǎn)的變量cpoint,OnPaint()中繪圖的代碼中的坐標(biāo)都得到了,進(jìn)展繪圖;鼠標(biāo)左鍵彈起時(shí),此時(shí)繪圖完畢,鼠標(biāo)彈起時(shí)所在位置就是畫圖的最終終點(diǎn)位置,畫圖完畢后,刷新窗口,以便重新畫圖,此時(shí)執(zhí)行的是OnLButtonUp()函數(shù)。這次實(shí)驗(yàn)中關(guān)鍵就是確定畫圖起點(diǎn)及終點(diǎn)坐標(biāo),因?yàn)槭怯檬髽?biāo)繪制圖形,所以需用函數(shù)來捕獲鼠標(biāo)當(dāng)前所在位置的坐標(biāo),因此設(shè)置了OnLButtonDown()函數(shù)來捕獲起點(diǎn)坐標(biāo),OnMouseMove()函數(shù)來
22、捕獲鼠標(biāo)移動(dòng)是的當(dāng)前位置坐標(biāo),OnLButtonUp()函數(shù)來捕獲終點(diǎn)坐標(biāo)。而繪制圖形使用的函數(shù)是OnPaint(),將圖形的起點(diǎn)和終點(diǎn)坐標(biāo)和鼠標(biāo)的位置坐標(biāo)相聯(lián)系后就能用鼠標(biāo)來繪制圖形了,所以在它們之間用opoint和cpoint兩變量實(shí)現(xiàn)。另外將繪圖語句集中在OnPaint()函數(shù)中,然后其他函數(shù)來調(diào)用OnPaint()函數(shù),這樣不容易引起混亂,同時(shí)程序更簡單,更有條理,便于修改。4. 思考題1說明直線、橢圓、矩形繪制使用的函數(shù),及其參數(shù)含義?答:直線、橢圓、矩形繪制使用的函數(shù)是OnPaint()。函數(shù)里面定義和創(chuàng)立了繪圖的畫筆pen和填充圖形的畫刷brush,3種圖形本身對應(yīng)的消息處理函數(shù)里分別賦給shape3個(gè)不同的值:1,2,3,在OnPaint()里有3個(gè)if語句,用來這實(shí)現(xiàn)這三個(gè)圖形的繪制:中選擇畫直線時(shí),shape=1,則執(zhí)行繪制直線代碼,中選擇畫矩形時(shí),shape =2,則執(zhí)行繪制矩形的代碼,當(dāng)性選擇畫橢圓時(shí),shape=3,則執(zhí)行繪制橢圓的代碼。2如何控制菜單項(xiàng)的狀態(tài),使用的消息類型?答:
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 墩、臺身和蓋梁工程現(xiàn)場質(zhì)量檢驗(yàn)報(bào)告單(五)
- 智能交通管理平臺開發(fā)協(xié)議
- 辦公用品采購預(yù)算與實(shí)際使用對比表格
- 專業(yè)資料出版合作協(xié)議
- 水利水電工程施工承包協(xié)議
- 企業(yè)品牌授權(quán)使用協(xié)議書
- 小學(xué)生體育運(yùn)動(dòng)啟蒙故事讀后感
- 太陽能光伏系統(tǒng)安裝維護(hù)合同
- 2024-2025學(xué)年高二數(shù)學(xué)湘教版選擇性必修第二冊教學(xué)課件 第2章-2.4空間向量在立體幾何中的應(yīng)用-2.4.3 向量與夾角
- 水系統(tǒng)基礎(chǔ)知識培訓(xùn)課件
- 【基于近些年數(shù)據(jù)的千禾味業(yè)公司盈利能力分析案例(9000字論文)】
- 護(hù)理組長競聘演講稿5分鐘ppt-
- 施工機(jī)具及配件維修保養(yǎng)記錄
- 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)基礎(chǔ)高職PPT完整全套教學(xué)課件
- 安徽各市(精確到縣區(qū))地圖PPT課件(可編輯版)
- 大動(dòng)脈粥樣硬化型腦梗死總(內(nèi)科學(xué)課件)
- 學(xué)士學(xué)位個(gè)人思想政治表現(xiàn)【六篇】
- 初中數(shù)學(xué)-生活中的“一次模型”教學(xué)課件設(shè)計(jì)
- 張養(yǎng)浩《翠陰亭記》原文,注釋,譯文,賞析
- 公共租賃住房直管公房租金收繳管理制度
- 離心泵畢業(yè)設(shè)計(jì)
評論
0/150
提交評論