簡單畫圖程序課程設(shè)計_第1頁
簡單畫圖程序課程設(shè)計_第2頁
簡單畫圖程序課程設(shè)計_第3頁
簡單畫圖程序課程設(shè)計_第4頁
簡單畫圖程序課程設(shè)計_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、目錄1. 基本功能描述12. 設(shè)計思路13. 軟件設(shè)計33.1 設(shè)計步驟33.2 界面設(shè)計63.3 關(guān)鍵功能的實現(xiàn)74. 結(jié)論與心得體會85. 參考文獻(xiàn)96. 思考題97. 附錄97.1 調(diào)試報告97.2 測試結(jié)果107.3 關(guān)鍵源代碼1簡單畫圖程序1. 基本功能描述 1) 在菜單處的有相應(yīng)的菜單項,可以選擇繪制的圖形形狀,如直線、矩形及橢圓,可以選擇線寬,有1-5可供選擇,還可以選擇線色以及填充色,通過彈出的顏色對話框選擇需要的顏色,如果不選擇線寬、線色以及填充色,則按默認(rèn)的畫筆以及畫刷來繪制選擇的圖形。 2) 選擇好圖形后,通過鼠標(biāo)可以繪制出相應(yīng)的直線,矩形或橢圓,鼠標(biāo)的按下確定圖形的起點

2、,鼠標(biāo)的拖動則確定了圖形的終點,即通過鼠標(biāo)的拖動來決定圖形的大小,鼠標(biāo)彈起,此圖形則繪制完畢。 3) 增添了工具欄,有相應(yīng)的選擇項,可以更方便地實現(xiàn)相應(yīng)的功能。2. 設(shè)計思路 1) 對需要用到的變量進(jìn)行初始化。2) 選擇相應(yīng)的圖形之后就響應(yīng)相應(yīng)的消息處理函數(shù),給shape賦對應(yīng)的值。選擇不同的線寬,線色與填充色,則改變畫筆和畫刷的屬性。3) 鼠標(biāo)的按下響應(yīng)lbuttondown(),定義起點的坐標(biāo),鼠標(biāo)的拖動響應(yīng)mousemove()改變終點的坐標(biāo),鼠標(biāo)的彈起響應(yīng)lbuttonup(),刷新,得到繪制圖形。4) 選擇圖形或其它屬性,可進(jìn)行下一次繪制。 開始初始化(即初始化相關(guān)變量,如shpae

3、、線色m_ncolor、填充色m_fcolor、畫筆pen、畫刷brush、起點opoint、終點epoint等)選擇線寬?y改變畫筆屬性 n選擇顏色?y改變畫筆屬性n選擇填充?y改變畫筆屬性n橢圓?矩形?直線?響應(yīng)矩形的消息處理函數(shù)onrect()shape=2響應(yīng)直線的消息處理函數(shù)onrect()shape=1響應(yīng)橢圓的消息處理函數(shù)onrect()shape=3鼠標(biāo)左鍵按下,響應(yīng)lbuttondown(),opoint=point鼠標(biāo)左鍵按下拖動,響應(yīng)mousemove(),epoint=point,響應(yīng)onpaint(),繪制圖形鼠標(biāo)左鍵彈起,響應(yīng)lbuttonup(),刷新,得到圖形

4、結(jié)束 圖1 程序流程圖3. 軟件設(shè)計 3.1 設(shè)計步驟1) 創(chuàng)建一個給予單文檔的應(yīng)用程序框架。命名為“yuyangyi”。圖2 創(chuàng)建工程2) 編輯菜單。添加需要的菜單項,如圖3;設(shè)定好id值,如圖4;建立類向?qū)?,在視圖類中,對菜單項添加對應(yīng)的command消息出理函數(shù),部分菜單項還添加對應(yīng)的update_command_ui消息函數(shù),如圖5。圖3 添加菜單項圖4 設(shè)定菜單項id圖5 建立類向?qū)?) 創(chuàng)建工具欄。在插入處選擇資源,新建工具欄,如圖6;在工具欄上添加相應(yīng)的按鈕,在屬性處更改其id,如圖7。 圖6 新建工具欄圖7 編輯工具欄 4)在相應(yīng)消息函數(shù)處添加代碼,實現(xiàn)其功能。建立類向?qū)?,添?/p>

5、wm_paint消息,以及l(fā)buttondown、lbuttonup、mousemove消息,并在其中添加相應(yīng)的代碼,如圖8。圖8 添加wm_paint消息 3.2 界面設(shè)計表1 界面控件表控件名稱控件類型id屬性相關(guān)變量繪圖下拉式菜單直線菜單項工具欄按鈕id_lineint shape 矩形菜單項 工具欄按鈕id_rectint shape橢圓菜單項工具欄按鈕id_ellipseint shape線寬彈出式菜單int w顏色(線色) 菜單項工具欄按鈕id_colorcolorref m_ncolor填充色菜單項工具欄按鈕id_fillcolorcolorref m_fcolor 3.3 關(guān)鍵

6、功能的實現(xiàn)1)繪制選擇的圖形。在直線、矩形以及橢圓的消息處理函數(shù)里為shape賦值,選擇直線,則shape=1,選擇矩形,則shape=2,選擇橢圓,則shape=3,在onpaint()里添加繪圖的代碼,其中運用3個if語句來繪制不同的圖形。當(dāng)shape=1時執(zhí)行繪制直線的代碼,同理繪制出矩形與橢圓。2)通過鼠標(biāo)繪制圖形。在視圖類里添加wm_lbuttondown、wm_lbuttonup以及wm_mousemove消息,在onlbuttondown()函數(shù)里,獲取鼠標(biāo)坐標(biāo),將其賦給之前定義作為起點的變量opoint;在onmousemove()函數(shù)里,把鼠標(biāo)坐標(biāo)賦給之前定義作為終點的變量e

7、point,onpaint()中繪圖的代碼中的坐標(biāo)都得到了,進(jìn)行繪圖;在onlbuttonup()函數(shù)里,進(jìn)行刷新,顯示繪制出的圖。3)改變線寬。定義了默認(rèn)線寬w=1,在菜單處選擇了線寬的值后,對應(yīng)的值賦給了w,在onpaint()創(chuàng)建的畫筆中,pen.createpen(ps_solid,w, m_ncolor),線寬處用w表示,則改變w的值即改變了畫筆的粗細(xì)。4)改變線色。在選擇線色時,會彈出系統(tǒng)帶的顏色對話框,把選中的顏色給m_ncolor,在onpaint()創(chuàng)建的畫筆中,pen.createpen(ps_solid,w, m_ncolor),線色處用m_ncolor表示,則當(dāng) m_n

8、color改變時,畫筆的顏色就會跟著發(fā)生變化。5)改變填充色。選擇填充色時,通過顏色對話框選擇顏色,選中的顏色賦給m_fcolor,在onpaint()創(chuàng)建的畫刷中,brush.createsolidbrush(m_fcolor),顏色就是用m_fcolor表示的,所以m_fcolor是什么顏色,畫刷就是什么顏色。4. 結(jié)論與心得體會 這次c+程序設(shè)計(簡單畫圖程序的實現(xiàn))的課程設(shè)計至此已基本完成,利用這個程序可以在用戶區(qū)繪制出直線、矩形與橢圓圖形,可以自定義線條的顏色以及選擇線的寬度,還可以改變圖形的填充色。最終設(shè)計的程序基本能夠達(dá)到課設(shè)任務(wù)書指定的基本功能。這次課程設(shè)計讓我收獲頗多,感覺很

9、是充實,看到最后程序正常運行時候心里還略有一點小小成就感。在選課題的時候,看到有畫圖程序這個題目時候,覺得應(yīng)該有趣一點,不是很枯燥那種,加上平時c+理論課上這種類似的畫圖程序接觸過,老師也講過類似例子,于是就選擇了它。原本以為這個程序制作起來很簡單,但是到了開始著手程序設(shè)計時候,發(fā)現(xiàn)第一步,也就是畫出程序流程圖,我就不知什么樣子的流程圖才是任務(wù)要求的,在查閱課本以及相關(guān)書籍上類似程序流程圖實例后,借鑒了例子中的基本框架,然后才畫出符合要求的流程圖。當(dāng)開始用vc進(jìn)行程序編制時候,創(chuàng)建完工程、編輯好相應(yīng)菜單選項以及對菜單項添加對應(yīng)的command消息出理函數(shù)和對應(yīng)的update_command_u

10、i消息函數(shù)后,突然思維卡住了,不知道下一步該從何處下手。請教了一下同學(xué)才發(fā)現(xiàn)自己的問題很低級,在添加完函數(shù)后得做的就是在相應(yīng)消息函數(shù)處添加代碼來實現(xiàn)其功能。真正的困難從這時候開始出現(xiàn)了,代碼是程序核心部分,自然也是也困難的地方了,在參閱了課本和平時上課的課件之后,自己嘗試著編寫相應(yīng)功能的代碼,可是編寫完某個功能后用vc編譯時候,程序便報出許多的錯誤,其中較大的一些問題在和同學(xué)討論及請教之后得到解決,多數(shù)的錯誤還是屬于那種低級的小錯誤,開始體會到平時一些看起來簡單自己編懶得親自敲打代碼實踐的小程序在真正做起來也是需要認(rèn)真細(xì)心對待的。在建立完類向?qū)?,添加完wm_paint消息,以及l(fā)buttond

11、own、lbuttonup、mousemove消息,對其進(jìn)行代碼添加時候,最難得部分出現(xiàn)了,自己參照資料所寫的代碼總是不能運行正確,而且代碼不是很精簡,冗余度很大,最終參照著從網(wǎng)上找到的一段代碼改寫自己代碼,最后才得到正常精簡的程序代碼。在編程中,遇到過很多問題,有時候好不容易解決掉一個問題,還沒來得及高興就發(fā)現(xiàn)這個問題的額解決卻衍生出了另外的問題,甚至是一連引發(fā)好幾個小問題,例如在實現(xiàn)動態(tài)畫圖時,發(fā)現(xiàn)每次接著畫下一個圖形時候,上次以及之前畫的圖案就全部清空了,修改了相應(yīng)刷新函數(shù)之后,圖案是能夠保存了,可是動態(tài)畫圖的每一個中間過程也都被一起保留下來了,這一點到最后也沒有被解決,這是這次課程設(shè)計

12、中最遺憾的一個地方,雖然程序能基本滿足要求,但是沒能完全滿足相應(yīng)要求。通過這次課程設(shè)計,我學(xué)習(xí)到了很多,讓我感受到之前在理論課程安排的上機(jī)試驗中,所掌握的實際程序操作都是在表層的,沒有深入的程序設(shè)計的核心以及整體把握,上機(jī)時候我們大部分都是參照著課本以及課件來操作的,所以遇到的問題不多也不大。但這次課程設(shè)計是的靠自己來獨立操作,需要自己去查閱以及篩選相應(yīng)的資料來幫助自己完成設(shè)計,鍛煉我們的獨立工作及動手實踐能力。讓我對vc 中的mfc有了更多的了解及認(rèn)知。5. 參考文獻(xiàn) 1揣錦華.面向?qū)ο蟪绦蛟O(shè)計與vc+實踐.西安電子科技大學(xué)出版社.2005. 2walter savitch. 完美c+教程.

13、清華大學(xué)出版社.2005. 3(美) judy scholl. c+編程:從問題分析到程序設(shè)計實驗指導(dǎo)書.電子工業(yè)出版社.2003.4 夏崇鐠, 任海軍, 余健. visual c+課程設(shè)計案例精編.清華大學(xué)出版社.20086. 思考題 1) 說明直線、橢圓、矩形繪制使用的函數(shù),及其參數(shù)含義? 答:直線、橢圓、矩形繪制使用的函數(shù)是onpaint()。函數(shù)里面定義和創(chuàng)建了畫筆和畫刷,3種圖形本身對應(yīng)的消息處理函數(shù)里分別賦給shape不同的值,在onpaint()里有3個if語句,如果shape=1時,繪制直線,如果shape=2時,繪制矩形,如果shape=3時,繪制橢圓。 2) 如何控制菜單項

14、的狀態(tài),使用的消息類型?答:添加update_command_ui消息函數(shù),在生成的函數(shù)里添加相關(guān)代碼,如選擇直線時,使shape=1,則onupdateline里添加pcmdui-setcheck(shape=1),那么當(dāng)shape的值為1時,即代表選擇了直線項,此時菜單中的直線選項前就打勾了,代表選中。 3) 如何設(shè)置菜單和工具欄按鈕的快捷鍵操作? 答:在資源視圖下選擇accelerator,雙擊idr_mainframe,打開編輯窗口,雙擊空白處,在id下拉列表框中選擇需要快捷鍵的菜單項或工具欄按鈕的id,在鍵一欄中輸入快捷鍵,選擇ctrl復(fù)選框和虛擬鍵單選按鈕即可。7. 附錄 7.1

15、調(diào)試報告1)在程序第一次運行時候,工具欄線型選定直線,然后發(fā)現(xiàn)鼠標(biāo)在用戶區(qū)怎么也畫不出直線,換作矩形和橢圓也一樣,但在菜單繪圖里選定線寬之后方能畫出圖形,后來發(fā)現(xiàn),原理我沒有設(shè)置默認(rèn)線寬,于是在“yuyangyiview.cpp”中,添加如下函數(shù)及代碼: cyuyangyiview:cyuyangyiview() w=1; shape=0; 于是在程序運行時候即便開始不選擇線寬,也能畫出圖形來。2)要讓鼠標(biāo)來決定圖形的起始點,所以定義了起始點opoint和終止點cpoint,把onpaint中繪制圖形代碼的坐標(biāo)都改成了這2個變量。然后在添加的onlbuttondown()、onmousemov

16、e()和onlbuttonup()中,給這兩個變量賦值。接著我編譯運行,確出現(xiàn)了這樣的錯誤,我只要把鼠標(biāo)左鍵一按,即使已經(jīng)馬上松開,鼠標(biāo)拖動還是會進(jìn)行繪制,與需要實現(xiàn)的功能不符。于是我添加了一布爾類型的變量m_down,代表鼠標(biāo)的按下與否,當(dāng)按下時讓它為true,在onmousemove()里添加當(dāng)按下時才執(zhí)行之前代碼的語句。這樣畫圖時,只有鼠標(biāo)左鍵按著拖動時,才會進(jìn)行繪制。3)在實現(xiàn)動態(tài)畫圖時候,發(fā)現(xiàn)鼠標(biāo)每次移動時候,所在點都會與原起始點間產(chǎn)生圖形顯示出來,效果如圖9,后來發(fā)現(xiàn)我在在“yuyangyiview.cpp”中的代碼段:void cyuyangyiview:onmousemove(

17、uint nflags, cpoint point) f(m_down) cpoint=point; invalidate(0); cview:onmousemove(nflags, point);中多了“invalidate(0)”一條刷新句,去掉后程序便正常運行。圖9 錯誤圖樣7.2 測試結(jié)果 1) 點擊編譯、連接、運行后,彈出畫圖的界面。有添加的菜單和工具欄。如圖10。圖10 畫圖界面2) 菜單處點擊“繪圖”,彈出相關(guān)選項,點擊選擇的圖形后,被選項前打了個勾,相應(yīng)的工具欄按鈕也顯示被按下,在線寬處選擇需要線寬,被選項前有圓點,不選默認(rèn)為1。如圖11。圖11 選擇圖形及相關(guān)屬性 3) 選擇

18、好圖形及相關(guān)屬性后,用鼠標(biāo)進(jìn)行繪制。如圖12。圖12 繪制圖形 4) 繼續(xù)畫多個圖形,或改變屬性,或改變形狀,繪制圖形。如圖13。圖13 繪制多個圖形 7.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_drawt

19、oolbar.loadtoolbar(idr_draw)trace0(failed to create status barn);return -1; 3)在“yuyangyiview.h”中,在class cyuyangyiview : public cview里的public下定義相關(guān)變量: colorref m_ncolor; colorref m_fcolor; cpoint cpoint; cpoint opoint; bool m_down; int w; int shape; 4)在“yuyangyiview.cpp”中,添加如下函數(shù)及代碼: cyuyangyiview:cyuy

20、angyiview() w=1; /初始線寬默認(rèn)為1 shape=0; void cyuyangyi:onw1() w=1; /令線寬為1void cyuyangyiview:onw2() w=2; /令線寬為2void cyuyangyiview:onw3() w=3; /令線寬為3void cyuyangyiview:onw4() w=4; /令線寬為4void cyuyangyiview:onw5() w=5; /令線寬為5void cyuyangyiview:onupdatew1(ccmdui* pcmdui) pcmdui-setradio(w=1); /當(dāng)線寬為1時,此選項前標(biāo)有圓

21、點void cyuyangyiview:onupdatew2(ccmdui* pcmdui) pcmdui-setradio(w=2); /當(dāng)線寬為2時,此選項前標(biāo)有圓點void cyuyangyiview:onupdatew3(ccmdui* pcmdui) pcmdui-setradio(w=3); /當(dāng)線寬為3時,此選項前標(biāo)有圓點void cyuyangyiview:onupdatew4(ccmdui* pcmdui) pcmdui-setradio(w=4); /當(dāng)線寬為4時,此選項前標(biāo)有圓點void cyuyangyiview:onupdatew5(ccmdui* pcmdui) p

22、cmdui-setradio(w=5); /當(dāng)線寬為5時,此選項前標(biāo)有圓點void cyuyangyiview:online() shape=1; /選擇直線,則令shape為1void cyuyangyiview:onrect() shape=2; /選擇矩形,則令shape為2void cyuyangyiview:onellipse() shape=3; /選擇橢圓,則令shape為3void cyuyangyiview:onupdateline(ccmdui* pcmdui) pcmdui-setcheck(shape=1); /shape為1時,直線選項前打上勾void cyuyang

23、yiview:onupdaterect(ccmdui* pcmdui) pcmdui-setcheck(shape=2); /shape為2時,矩形選項前打上勾void cyuyangyiview:onupdateellipse(ccmdui* pcmdui) pcmdui-setcheck(shape=3); /shape為3時,橢圓選項前打上勾void cyuyangyiview:oncolor() ccolordialog color; / 創(chuàng)建顏色對話框 if(color.domodal() = idok) / 如果用戶點擊ok按鈕 m_ncolor=color.getcolor();

24、 / 更改顏色,把顏色賦到m_ncolorvoid cyuyangyiview:onfillcolor() ccolordialog fillcolor; / 創(chuàng)建顏色對話框 if(fillcolor.domodal() = idok) / 如果用戶點擊ok按鈕 m_fcolor=fillcolor.getcolor(); / 更改顏色,把顏色賦到m_fcolorvoid cyuyangyiview:onpaint() cpaintdc dc(this); / device context for painting cpen pen; /定義畫筆 cbrush brush; /定義畫刷 pen.createpen(ps_solid,w, m_ncolor); /創(chuàng)建畫筆 brush.createsolidbrush(m_fcolor); /創(chuàng)建畫刷 dc.selectobje

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論