版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、簡(jiǎn)單畫(huà)圖程序【實(shí)驗(yàn)?zāi)康摹勘緦?shí)驗(yàn)?zāi)康氖峭ㄟ^(guò)構(gòu)建基于mfc的windows畫(huà)圖程序,使學(xué)生:(1) 理解mfc應(yīng)用程序的運(yùn)行機(jī)制(2) 掌握使用mfc構(gòu)建windows應(yīng)用程序的基本結(jié)構(gòu)及編程的基本方法(3) 理解和掌握mfc應(yīng)用程序消息處理機(jī)制及應(yīng)用(4) 掌握類向?qū)В╟lasswizard)的使用【實(shí)驗(yàn)要求】(1) 必須做好實(shí)驗(yàn)原理的預(yù)習(xí)。(2) 需要對(duì)提供的程序代碼進(jìn)行分析,并明確實(shí)驗(yàn)時(shí)還應(yīng)在何處添加哪些語(yǔ)句?!緦?shí)驗(yàn)環(huán)境】microsoft windows xpmicrosoft visual c+ 6.01 基本功能描述1) 在單文檔菜單中,在菜單行中可插入一個(gè)菜單項(xiàng),命名為繪圖,在下拉菜
2、單中可分別設(shè)置繪制的圖形形狀,如直線、矩形及橢圓,線寬選項(xiàng),有1-5可供選擇,還可以設(shè)置線色以及填充色,通過(guò)彈出的顏色對(duì)話框選擇需要的顏色,如果不選擇線寬、線色以及填充色,則按默認(rèn)的畫(huà)筆,畫(huà)刷來(lái)繪制選擇的圖形。 2) 選擇好圖形后,通過(guò)鼠標(biāo)可以繪制出相應(yīng)的直線,矩形或橢圓,鼠標(biāo)的按下確定圖形的起點(diǎn),鼠標(biāo)的拖動(dòng)則確定了圖形的終點(diǎn),即通過(guò)鼠標(biāo)的拖動(dòng)來(lái)決定圖形的大小,當(dāng)鼠標(biāo)彈起,此圖形則繪制完畢。3) 增添工具欄,設(shè)置繪制的圖形形狀,線色以及填充色,可更方便地選擇相應(yīng)的功能。2 設(shè)計(jì)思路 1) 對(duì)需要用到的變量進(jìn)行初始化。2) 選擇相應(yīng)的圖形之后就響應(yīng)相應(yīng)的消息處理函數(shù),給shape賦對(duì)應(yīng)的值。選擇
3、不同的線寬,線色與填充色,即可改變畫(huà)筆或畫(huà)刷的屬性。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)行下一次繪制。開(kāi)始 定義并初始化變shape 線色m_ncolor 填充色 m_fcolor 畫(huà)筆pen畫(huà)刷brush繪圖起點(diǎn)opoint繪圖終點(diǎn)cpoint選擇線寬默認(rèn)值(w=1)改變畫(huà)筆屬性選擇線色默認(rèn)值(黑色)改變畫(huà)筆屬性選擇填充色默認(rèn)值(黑色)改變畫(huà)刷屬性橢圓矩形直線響應(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()刷新,得到圖形結(jié)束圖1 程序流程圖3 軟件設(shè)計(jì)3.1 設(shè)計(jì)步驟1)創(chuàng)建單文檔創(chuàng)建一個(gè)mfc appwizardexe工程,命名為“yinshuyan”,如圖2所示,并創(chuàng)建單文檔,如圖3所示。創(chuàng)建成功后,系統(tǒng)自動(dòng)生成相應(yīng)的類,如圖4所示。圖2 創(chuàng)建工程圖3 創(chuàng)建單文檔圖4 生成類
5、2) 編輯菜單添加需要的菜單項(xiàng),如圖5所示(可以通過(guò)拖動(dòng)調(diào)整菜單的順序);并在菜單的屬性中設(shè)定好所對(duì)應(yīng)的id,如圖6所示,各項(xiàng)菜單對(duì)應(yīng)的id如表1所示(其中線寬菜單為彈出菜單,只需在菜單項(xiàng)目屬性中的彈出選項(xiàng)前打勾即可,分隔線亦只需在菜單項(xiàng)目屬性中選中分隔符(separator)選項(xiàng)即可)。圖5 添加菜單項(xiàng)圖6 設(shè)置菜單id表1 菜單項(xiàng)對(duì)應(yīng)id菜單名id菜單名id直線id_line線寬1id_w1矩形id_rect線寬2id_w2橢圓id_ellipse線寬3id_w3顏色id_color線寬4id_w4填充色id_fillcolor線寬5id_w5建立類向?qū)?,在視圖類cyinshuyanvie
6、w(通過(guò)菜單view-classwizard,或者快捷鍵ctrl+w打開(kāi))中,對(duì)各菜單項(xiàng)添加對(duì)應(yīng)的command消息處理函數(shù),部分菜單項(xiàng)還添加對(duì)應(yīng)的update_command_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)
7、/afx_msg_map(cmainframe)on_wm_create()on_command(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)的代
8、碼,如圖10所示。圖10 添加wm_paint消息3.2 界面設(shè)計(jì)各控件名稱,類型,屬性及相關(guān)變量如表2所示。 表2 界面控件表控件名稱控件類型屬性相關(guān)變量繪圖下拉式菜單 無(wú) 無(wú) 直線菜單項(xiàng)工具欄按鈕id_lineint shape矩形菜單項(xiàng)工具欄按鈕id_rectint shape橢圓菜單項(xiàng) 工具欄按鈕id_ellipseint shape線寬彈出式菜單 無(wú)int w顏色(線色)菜單項(xiàng)工具欄按鈕id_colorcolorref m_ncolor填充色菜單項(xiàng)工具欄按鈕id_fillcolorcolorref m_fcolor 3.3 關(guān)鍵源代碼1) 在“mainfrm.h”中,在class c
9、mainframe : public cframewnd里的protected下定義: 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 cyins
10、huyanview : 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: cyinshuyanview() w=1; /初始線寬默認(rèn)為1 shape=0; void cyinshuyanview:onw1() w=1; /令線寬為1void cyinshuyanview:onw2() w=2; /令線寬
11、為2void cyinshuyan:onw3() w=3; /令線寬為3void cyinshuyanview: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 cyinshuyanvie
12、w:onupdatew3(ccmdui* pcmdui) pcmdui-setradio(w=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; /選擇矩形
13、,則令shape為2void cyinshuyanview:onellipse() shape=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* pcmd
14、ui) pcmdui-setcheck(shape=3); /shape為3時(shí),橢圓選項(xiàng)前打上勾void cyinshuyanview:oncolor() ccolordialog color; / 創(chuàng)建顏色對(duì)話框 if(color.domodal() = idok) / 如果用戶點(diǎn)擊ok按鈕 m_ncolor=color.getcolor(); / 更改顏色,把顏色賦到m_ncolorvoid cyinshuyanview:onfillcolor() ccolordialog fillcolor; / 創(chuàng)建顏色對(duì)話框 if(fillcolor.domodal() = idok) / 如果用戶
15、點(diǎn)擊ok按鈕 m_fcolor=fillcolor.getcolor(); / 更改顏色,把顏色賦到m_fcolorvoid cyinshuyanview:onpaint() cpaintdc dc(this); / device context for painting cpen pen; /定義畫(huà)筆 cbrush brush; /定義畫(huà)刷 pen.createpen(ps_solid,w, m_ncolor); /創(chuàng)建畫(huà)筆 brush.createsolidbrush(m_fcolor); /創(chuàng)建畫(huà)刷 dc.selectobject(&pen); /獲取畫(huà)筆 dc.selectobject
16、(&brush); /獲取畫(huà)刷 if(shape=1) dc.moveto(opoint.x,opoint.y); dc.lineto(cpoint.x,cpoint.y); /繪制直線,從opoint到cpoint連線 if(shape=2) dc.rectangle(opoint.x,opoint.y,cpoint.x,cpoint.y); /繪制矩形 if(shape=3) dc.ellipse(opoint.x,opoint.y,cpoint.x,cpoint.y);/繪制橢圓void cyinshuyanview:onlbuttondown(uint nflags, cpoint p
17、oint) / todo: add your message handler code here 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)
18、賦給終點(diǎn)坐標(biāo)cpoint cview:onmousemove(nflags, point);void 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語(yǔ)句的代碼來(lái)這實(shí)現(xiàn)這三個(gè)圖形的繪制:當(dāng)選擇畫(huà)直線時(shí),shape=1,則執(zhí)行繪制直線代碼,
19、當(dāng)選擇畫(huà)矩形時(shí),shape =2,則執(zhí)行繪制矩形的代碼,當(dāng)性選擇畫(huà)橢圓時(shí),shape=3,則執(zhí)行繪制橢圓的代碼。2)改變線寬 在onpaint()創(chuàng)建的畫(huà)筆中,pen.createpen(ps_solid,w, m_ncolor),線寬處用w表示,則改變w的值即改變了畫(huà)筆的粗細(xì)。選擇菜單繪圖線寬選擇劃線寬度值,此時(shí)所選的線寬值就賦給線寬變量w。若不選擇線寬值,則w=1(即默認(rèn)線寬值為1)。3)改變線色 在onpaint()創(chuàng)建的畫(huà)筆中,pen.createpen(ps_solid,w, m_ncolor),線的顏色處用m_ncolor表示,則改變m_ncolor即改變了畫(huà)筆的顏色。選擇菜單繪圖
20、顏色,會(huì)彈出通過(guò)wm_colorref從系統(tǒng)中引入的顏色選擇對(duì)話框,選擇顏色后,點(diǎn)擊確定則相應(yīng)顏色值就賦給變量m_ncolor,此時(shí)畫(huà)筆的顏色就會(huì)發(fā)上變化。若不選擇顏色,則默認(rèn)(線)顏色為黑色。4)改變填充色 在onpaint()創(chuàng)建的畫(huà)刷中,brush.createsolidbrush(m_fcolor),顏色就是用m_fcolor表示的,改變m_fcolor即改變了畫(huà)刷的顏色。選擇菜單繪圖填充色,會(huì)彈出通過(guò)wm_colorref從系統(tǒng)中引入的顏色選擇對(duì)話框,選擇顏色后,點(diǎn)擊確定則相應(yīng)顏色值就賦給變量m_fcolor,此時(shí)畫(huà)刷的顏色就會(huì)發(fā)上變化。若不選擇顏色,則默認(rèn)填充色為黑色。5)繪制圖形
21、 鼠標(biāo)左鍵按下,則捕獲鼠標(biāo)此時(shí)的位置坐標(biāo)為畫(huà)圖的起點(diǎn),此時(shí)在onlbuttondown()函數(shù)里,將捕獲的坐標(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í)繪圖結(jié)束,鼠標(biāo)彈起時(shí)所在位置就是畫(huà)圖的最終終點(diǎn)位置,畫(huà)圖結(jié)束后,刷新窗口,以便重新畫(huà)圖,此時(shí)執(zhí)行的是onlbuttonup()函數(shù)。這次實(shí)驗(yàn)中關(guān)鍵就是確定畫(huà)圖起點(diǎn)及終點(diǎn)坐標(biāo),因?yàn)槭怯檬髽?biāo)繪制圖形,所以需用函數(shù)來(lái)捕獲鼠標(biāo)當(dāng)前所
22、在位置的坐標(biāo),因此設(shè)置了onlbuttondown()函數(shù)來(lái)捕獲起點(diǎn)坐標(biāo),onmousemove()函數(shù)來(lái)捕獲鼠標(biāo)移動(dòng)是的當(dāng)前位置坐標(biāo),onlbuttonup()函數(shù)來(lái)捕獲終點(diǎn)坐標(biāo)。而繪制圖形使用的函數(shù)是onpaint(),將圖形的起點(diǎn)和終點(diǎn)坐標(biāo)和鼠標(biāo)的位置坐標(biāo)相聯(lián)系后就能用鼠標(biāo)來(lái)繪制圖形了,所以在它們之間用opoint和cpoint兩變量實(shí)現(xiàn)鏈接。另外將繪圖語(yǔ)句集中在onpaint()函數(shù)中,然后其他函數(shù)來(lái)調(diào)用onpaint()函數(shù),這樣不容易引起混亂,同時(shí)程序更簡(jiǎn)單,更有條理,便于修改。4. 思考題1)說(shuō)明直線、橢圓、矩形繪制使用的函數(shù),及其參數(shù)含義? 答:直線、橢圓、矩形繪制使用的函數(shù)是onpaint()。函數(shù)里面定義和創(chuàng)建了繪圖的畫(huà)筆pen和填充圖形的畫(huà)刷brush,3種圖形本身對(duì)應(yīng)的消息處理函數(shù)里分別賦給shape3個(gè)不同的值:1,2,3,在onpaint()里有3個(gè)if語(yǔ)句,用來(lái)這實(shí)現(xiàn)這三個(gè)圖形的繪制:當(dāng)選擇畫(huà)直線時(shí),shape=1,則執(zhí)行繪制直線代碼,當(dāng)選擇畫(huà)矩形時(shí),shape =2,則執(zhí)行繪制矩形的代碼,當(dāng)性選擇畫(huà)橢圓時(shí),shape=3,則執(zhí)行繪制橢圓的代碼。2)如何控制菜單項(xiàng)的狀態(tài),使用的消息類型?答:通過(guò)添加up
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 超市商品銷(xiāo)售及售后服務(wù)制度
- 流轉(zhuǎn)稅培訓(xùn)課件
- 執(zhí)業(yè)藥師培訓(xùn)機(jī)構(gòu)前十名
- 流乞人員救助工作培訓(xùn)
- 2024-2025學(xué)年山西省卓越聯(lián)盟高一下學(xué)期5月沖刺考試歷史試題(解析版)
- 2024-2025學(xué)年山東省青島市高一上學(xué)期期末選科考試歷史試題(解析版)
- 2026年財(cái)務(wù)管理基礎(chǔ)考試題集與解析
- 2024-2025學(xué)年江蘇省丹陽(yáng)市高一下學(xué)期5月質(zhì)量檢測(cè)歷史試題(解析版)
- 2026年生物科學(xué)生物信息學(xué)技術(shù)試題庫(kù)
- 2026年中級(jí)電力工程師理論實(shí)踐筆試題目
- 優(yōu)衣庫(kù)服裝設(shè)計(jì)風(fēng)格
- (正式版)YST 1693-2024 銅冶煉企業(yè)節(jié)能診斷技術(shù)規(guī)范
- 1999年勞動(dòng)合同范本【不同附錄版】
- 2024年重慶中考物理模擬考試試題
- 全國(guó)優(yōu)質(zhì)課一等獎(jiǎng)職業(yè)學(xué)校教師信息化大賽《語(yǔ)文》(基礎(chǔ)模塊)《我愿意是急流》說(shuō)課課件
- 初三寒假家長(zhǎng)會(huì)ppt課件全面版
- 2023年中國(guó)造紙化學(xué)品發(fā)展現(xiàn)狀與趨勢(shì)
- 《干部履歷表》1999版電子版
- 視頻旋轉(zhuǎn)滴方法在界面擴(kuò)張流變性質(zhì)研究中的應(yīng)用
- 傳統(tǒng)醫(yī)學(xué)師承關(guān)系合同書(shū)
- 血流動(dòng)力學(xué)不穩(wěn)定骨盆骨折急診處理
評(píng)論
0/150
提交評(píng)論