c++課程設(shè)計(jì)(簡易繪圖程序)_第1頁
c++課程設(shè)計(jì)(簡易繪圖程序)_第2頁
c++課程設(shè)計(jì)(簡易繪圖程序)_第3頁
c++課程設(shè)計(jì)(簡易繪圖程序)_第4頁
c++課程設(shè)計(jì)(簡易繪圖程序)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目 錄1、需求與功能分析22、系統(tǒng)總體框架33、模塊設(shè)計(jì)與分析43.1畫圖模塊43.2貼圖模塊43.3窗口模塊53.4菜單模塊53.5工具欄與狀態(tài)欄模塊54、類的設(shè)計(jì)與分析54.1、CAboutDlg類54.2、CChildFrame類54.3、CDib類54.4、CDrawingDoc類64.5、CDrawingView類74.6、CMainFrame類84.7、CSettingDlg類85、特色算法分析95.1 CDib類中的顯示bmp位圖95.2 CDrawingView類中的畫圖部分116、功能測試147、存在的不足與對(duì)策178、程序源代碼189、使用手冊(cè)1810、參考文獻(xiàn)211、需求

2、與功能分析為了檢驗(yàn)一個(gè)學(xué)期以來自己學(xué)習(xí)c+這門課程能夠?qū)W到多少知識(shí),加上原來就對(duì)圖像處理就比較感興趣,曾經(jīng)更有想過要做一個(gè)可以合成紅藍(lán)3D圖片的一款軟件,就是那種需要帶上紅藍(lán)眼鏡才可以看到3D效果的那種圖片,自己也有用photoshop做過這樣的圖片,但是photoshop需要調(diào)很多東西才能合成這樣的圖片,而且還要用相機(jī)送兩個(gè)不同的角度拍兩張照片作為源圖片去合成紅藍(lán)3D圖片,雖然我知道原理并不難,但是當(dāng)我選擇了” 簡易繪圖程序”這個(gè)課程設(shè)計(jì)的題目之后,才發(fā)現(xiàn)每實(shí)現(xiàn)一個(gè)功能都需要花很多的精力,而且實(shí)現(xiàn)那些功能之后還會(huì)發(fā)現(xiàn)各種各校的bug,需要細(xì)心去尋找解決的辦法。如今課程設(shè)計(jì)也要上交,一樣還有很

3、多我想實(shí)現(xiàn)的功能都還沒實(shí)現(xiàn),最終也沒有實(shí)現(xiàn)我想要實(shí)現(xiàn)的功能-合成紅藍(lán)3D圖片。只做了一些簡單的繪圖功能。功能分析,目前這個(gè)軟件的主要功能有如下:1、 畫直線:通過OnLine()函數(shù)實(shí)現(xiàn)。2、 畫矩形:通過OnRectangle()函數(shù)實(shí)現(xiàn)。3、 畫橢圓:通過OnEllipse()函數(shù)實(shí)現(xiàn)。4、 鉛筆工具:可以畫任意線條。通過OnPencil()函數(shù)實(shí)現(xiàn)。5、 橡皮擦:可以擦除所畫的線條。該功能還沒實(shí)現(xiàn)。6、 右鍵彈出菜單:可以在客戶中點(diǎn)擊鼠標(biāo)右鍵,快速選擇常用菜單。通過OnContextMenu函數(shù)實(shí)現(xiàn)。7、 狀態(tài)欄顯示鼠標(biāo)移動(dòng)的坐標(biāo):在程序的右下角顯示,通過OnUpdateX(CCmdUI

4、 *pCmdUI)和OnUpdateY(CCmdUI *pCmdUI)這兩個(gè)函數(shù)實(shí)現(xiàn)。8、 畫圖顏色選擇:可以畫任何顏色的線條,通過OnEditColor()函數(shù)實(shí)現(xiàn)。9、 讀取bmp位圖:可以在電腦中選擇一個(gè)bmp位圖,在程序中顯示出來,通過新建一個(gè)Cdib類來讀取bmp文件信息再view類和Doc類調(diào)用來顯示該位圖。10、 保存為bmp位圖:可以將在程序所畫的圖形保存為一幅bmp圖片,通過view中的SaveAsBmp(CString filename)實(shí)現(xiàn)。11、 線條類型及線寬的設(shè)置:可以將畫出的線條設(shè)置成實(shí)線、虛線、點(diǎn)線,還可以設(shè)置線條的粗細(xì),通過示例這一功能可以立刻顯示所選擇線條的

5、粗細(xì)及線型。通過新建CSettingDlg類,再在view類中調(diào)用OnSetting()函數(shù)實(shí)現(xiàn)畫筆的對(duì)話框,CSettingDlg類中的OnPaint()函數(shù)是實(shí)現(xiàn)示例功能的。12、 窗口的重繪時(shí)不擦除原來的內(nèi)容:可以在窗口發(fā)生變化時(shí),窗口的內(nèi)容不消失,程序在窗口尺寸發(fā)生變化時(shí),將會(huì)發(fā)送WM_PAINT消息,這時(shí)首先會(huì)擦除窗口背景,然后進(jìn)行重繪操作,這樣就把窗口中先前繪制的內(nèi)容擦除了。我是使用雙緩沖來解決這個(gè)問題的,雙緩沖設(shè)計(jì)思路:如果只是為了讓窗口閃爍不那么厲害,避免背景色的填充是最直接的辦法。但是那樣的話,窗體上會(huì)變的一團(tuán)糟。因?yàn)槊看卫L制圖象的時(shí)候都沒有將原來的圖象清除,造成了圖象的殘留

6、,于是窗體重繪時(shí),畫面往往會(huì)變的亂七八糟。所以單純的禁止背景重繪是不夠的。我們還要進(jìn)行重新繪圖,但要求速度很快,于是想到了使用 BitBlt函數(shù)。它可以支持圖形塊的復(fù)制,速度很快。我們可以先在內(nèi)存中作圖,然后用此函數(shù)將做好的圖復(fù)制到前臺(tái),同時(shí)禁止背景刷新,這樣就消除了閃爍。以上就是雙緩沖繪圖的基本的思路。一部分代碼寫在了OnLButtonUp(UINT nFlags, CPoint point)函數(shù)里面,也有一部分打碼寫在了OnDraw(CDC* pDC)函數(shù)里面。2、系統(tǒng)總體框架簡單繪圖工具 保存位圖顏色及線型設(shè)置讀取位圖鉛筆工具畫橢圓畫矩形畫直線 圖1 總體框架3、模塊設(shè)計(jì)與分析3.1畫圖

7、模塊:該模塊的大部份功能都寫在了view類里面,這樣造成了后期的修改造成了一定的影響,對(duì)于排錯(cuò),修復(fù)bug增加了難度,對(duì)于初次使用mfc做一個(gè)相對(duì)大一點(diǎn)的程序,在函數(shù)分配,類的建立都有很多不足的地方。該模塊也是此次程序的重點(diǎn)模塊之一,主要負(fù)責(zé)畫一些簡單圖形,例如:直線、矩形、橢圓、任意曲線(鉛筆)等等;有線型、線寬的設(shè)置;還有畫筆顏色的選擇,可以畫各種各樣顏色的線條。該模塊的設(shè)計(jì)思路是:簡易畫圖工具線型、線寬設(shè)置顏色選擇。3.2貼圖模塊:該模塊是為了讀取bmp位圖設(shè)計(jì)的,主要代碼寫在CDib類里面,再通過view類和Doc類去調(diào)用顯示位圖,這個(gè)模塊同樣是此次程序的重點(diǎn)模塊之一,也是花費(fèi)時(shí)間最多

8、的一個(gè)模塊,開始的時(shí)候,我使用了讀取程序里面的位圖資源,但是這樣的辦法雖然能夠成功顯示出位圖,但是卻十分麻煩,就是要先把想要顯示的位圖放到程序的位圖資源里面,然后再通過LoadBitmap函數(shù)把位圖資源加載到程序再顯示出來。這樣對(duì)使用都來說是非常不合理的,但是我卻從這里懂得了一個(gè)顯示位圖的思路,要顯示一幅位圖需要有以下幾點(diǎn):(1) 讀取bmp位圖信息,bmp位圖的信息包括:位圖文件頭BITMAPFILEHEADER和位圖信息頭BITMAPINFOHEADER,還有就是顏色表RGBOUAD。最后一部分是實(shí)際的位圖數(shù)據(jù)IMAGEDATA。(2) 創(chuàng)建兼容DC,這和相對(duì)比較容易,通過CreateCo

9、mpatibleDC函數(shù)創(chuàng)建。(3) 將位圖選入兼容DC中,也就是先把位圖存到內(nèi)存之中,通過SelectObject函數(shù)實(shí)現(xiàn)。(4) 將兼容DC中的位圖貼到當(dāng)前DC中,也就是顯示在屏幕上,通過BitBlt或者StretchBlt這兩個(gè)函數(shù)都可以實(shí)現(xiàn),區(qū)別在于,前者不可以自動(dòng)壓縮圖片在一個(gè)窗口顯示全部的圖片內(nèi)容,而后者可以。后來我在另一本書上看到了其它的方法,也了解了DDB(設(shè)備相關(guān)圖)和DIB(設(shè)備無關(guān)圖),DDB位圖的格式相當(dāng)依賴于設(shè)備,所以它不適用于圖像的交換,所以,大部分的BMP位圖都會(huì)包含DIB。為了完成位圖的顯示,需要完成:裝載位圖、獲取位圖文件頭信息、獲取位圖信息、獲取顏色表信息、

10、獲取做準(zhǔn)備數(shù)據(jù)信息、獲取位圖尺寸、獲取顏色總數(shù)、獲取顏色位數(shù)、創(chuàng)建位圖調(diào)色板、繪制位圖等等。但是windows并沒有提供DIB操作的類,需要自己動(dòng)手寫一個(gè)CDib的類,雖然這個(gè)類網(wǎng)上有可以直接復(fù)制,但是我還是按照書本那里,自己跟著課本的思路,手動(dòng)把代碼寫上去,所以花費(fèi)的時(shí)間比較多,即使是這樣,有一些還是沒有完全理解。封裝好CDib類之后,再在View類和Doc類中寫上相應(yīng)的調(diào)用函數(shù)。便可以在程序中通過“打開”從磁盤中讀取bmp位圖了。設(shè)計(jì)思路基本上和上面的步驟一樣。此時(shí)還需要面臨另外一個(gè)問題,就是窗口的重繪。此功能已在功能分析上有說明,就是利用雙緩沖解決這個(gè)問題。3.3窗口模塊:這部分大多數(shù)都

11、是編譯器自動(dòng)生成,只做了一些修改,例如:使程序一開始運(yùn)行便最大話,還是自定義程序的標(biāo)題。剛開始做的時(shí)候,創(chuàng)建成單文檔的了,后來需要用到多文檔的,然后又不想再重新做過,所以只能手動(dòng)修改,把單文檔改成了多文檔的。新建一個(gè)多文檔的程序,然后用舊的那個(gè)單文檔對(duì)照著多文檔的源代碼,一個(gè)個(gè)類的修改。3.4菜單模塊:該部分同樣大部分都是編譯器自動(dòng)生成的,自己增添了一部分菜單例如:繪圖工具、顏色設(shè)置、線條設(shè)置等等。還有右鍵彈出菜單,有新建窗口、顏色及線條設(shè)置、退出程序等等,讓使用者可以進(jìn)行快速的操作。3.5工具欄與狀態(tài)欄模塊:除了編譯器自動(dòng)生成的之外,還加入了畫直線、矩形、橢圓、鉛筆等工具的快速選擇,狀態(tài)欄可

12、以顯示鼠標(biāo)移動(dòng)的坐標(biāo)。該部分讓我覺得有點(diǎn)難度的就是那些工具欄那些圖標(biāo),我畫了很久才畫出那個(gè)鉛筆的圖標(biāo),聽說可以從磁盤里加載這些圖標(biāo)的,但是我不知道怎么要怎么做。4、類的設(shè)計(jì)與分析4.1、CAboutDlg類 由編譯器生成,只做了兩處的修改:m_pMainWnd-SetWindowText(_T(簡單繪圖工具);/設(shè)定主框架窗口標(biāo)題pMainFrame-ShowWindow(SW_MAXIMIZE);/顯示主框架窗口默認(rèn)最大化4.2、CChildFrame類 由編譯器生成,只做了一處的修改:cs.style |= WS_VISIBLE|WS_MAXIMIZE;/使子窗口一打開就是最大化4.3、C

13、Dib類按照書本上的代碼進(jìn)行封裝,以下是各成員函數(shù)和數(shù)據(jù)成員表1 CDib類說明表名稱屬性說明lpbminfo數(shù)據(jù)成員指向BITMAPINFO結(jié)構(gòu)的指針lpbmihrd數(shù)據(jù)成員指向BITMAPINFOHEADER結(jié)構(gòu)的指針bmfHeader 數(shù)據(jù)成員BITMAPFILEHEADER結(jié)構(gòu)lpdib數(shù)據(jù)成員指向DIB的指針lpDIBBits數(shù)據(jù)成員DIB像素指針dwDIBSize數(shù)據(jù)成員DIB大小m_hDib數(shù)據(jù)成員DIB對(duì)象的句柄*lpRgbQuag數(shù)據(jù)成員指向顏色表的指針DrawDib()成員函數(shù)顯示位圖ConstructPalette()成員函數(shù)構(gòu)造邏輯調(diào)色板GetBits()成員函數(shù)取得位

14、圖數(shù)據(jù)的入口地址GetWidth()成員函數(shù)取得位圖的寬度GetHeight()成員函數(shù)取得位圖的高度GetPalSize()成員函數(shù)取得調(diào)色板的大小GetColorNum()成員函數(shù)取得位圖包含的顏色數(shù)目GetBitCount()成員函數(shù)取得位圖的顏色深度CopyHandle()成員函數(shù)用于復(fù)制位圖對(duì)象LoadFile()成員函數(shù)從文件中加載位圖GetRectWidth()成員函數(shù)取得區(qū)域的寬度GetRectHeight()成員函數(shù)取得區(qū)域的高度GetReqByteWidth()成員函數(shù)轉(zhuǎn)換后的字節(jié)數(shù)ClearMemory()成員函數(shù)清除內(nèi)存中的DCInitMembers()成員函數(shù)初始化成

15、員變量4.4、CDrawingDoc類由編譯器生成,添加不少內(nèi)容:因?yàn)轱@示bmp位圖時(shí),有一部分操作需要在這里進(jìn)行,首先在頭文件中添加了以下:public:HGLOBAL GetHObject() const return m_hDIB; /獲取DIB對(duì)象的句柄CPalette *GetDocPal() const return m_palDIB; /獲取調(diào)色板指針CSize GetDocDimension() const return m_sizeDoc; /獲取調(diào)色板大小void UpdateObject(HGLOBAL hDIB); /更新DIB對(duì)象void SetDib(); /初始化

16、DIB對(duì)象protected:HGLOBAL m_hDIB;/定義指向DIB的句柄變量CPalette *m_palDIB;/定義指向邏輯調(diào)色板的指針CSize m_sizeDoc;/文檔大小的變量4.5、CDrawingView類編譯器自動(dòng)生成的類,全部的畫圖操作都在此類中完成,包括bmp位圖的顯示也是在該類中通過調(diào)CDib類中的函數(shù)來完成的。表1 CDrawingView類說明表名稱屬性說明m_Shape數(shù)據(jù)成員用于選擇圖形的類型(直線,矩形,橢圓,鉛筆)m_MouseDown數(shù)據(jù)成員用于判斷鼠標(biāo)按下的消息響應(yīng)m_LineEnd數(shù)據(jù)成員畫圖的終點(diǎn)m_LineOrg數(shù)據(jù)成員畫圖的起點(diǎn)m_Mo

17、usex數(shù)據(jù)成員狀態(tài)欄x坐標(biāo)m_Mousey數(shù)據(jù)成員狀態(tài)欄y坐標(biāo)m_clr數(shù)據(jù)成員畫筆顏色選擇m_nLineWidth數(shù)據(jù)成員指向顏色表的指針onece數(shù)據(jù)成員判斷窗口變化時(shí),避免m_dcCompatible的多次創(chuàng)建m_dcCompatible數(shù)據(jù)成員建立與屏幕顯示兼容的內(nèi)存顯示設(shè)備OnContextMenu()成員函數(shù)右鍵彈出菜單OnDraw()成員函數(shù)屏幕顯示bmp位圖內(nèi)容 和窗口重繪OnEditColor()成員函數(shù)顏色選擇OnLine()成員函數(shù)畫直線OnRectangle()成員函數(shù)畫矩形OnEllipse()成員函數(shù)畫橢圓OnPencil()成員函數(shù)鉛筆工具OnLButtonDo

18、wn()成員函數(shù)鼠標(biāo)按下響應(yīng)函數(shù)OnLButtonUp()成員函數(shù)鼠標(biāo)彈起響應(yīng)函數(shù)OnMouseMove()成員函數(shù)鼠標(biāo)移動(dòng)響應(yīng)函數(shù)OnUpdateX()成員函數(shù)狀態(tài)欄x坐標(biāo)顯示與更新OnUpdateY()成員函數(shù)狀態(tài)欄y坐標(biāo)顯示與更新OnEraseBkgnd()成員函數(shù)窗口重畫OnInitialUpdate()成員函數(shù)初始化pView指針值OnSetting()成員函數(shù)畫筆設(shè)置對(duì)話框響應(yīng)函數(shù)SaveAsBmp()成員函數(shù)把所畫的圖保存為bmp文件OnFileSaveAs()成員函數(shù)另存為.消息響應(yīng)函數(shù)4.6、CMainFrame類主要同編譯器生成,修改小部分:static UINT indi

19、cators =ID_SEPARATOR, / status line indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,ID_X,ID_Y; ID_X,ID_Y是狀態(tài)欄中的x和y坐標(biāo). cs.style&=FWS_ADDTOTITLE; /使主窗口的標(biāo)題不發(fā)生變化4.7、CSettingDlg類由自己創(chuàng)建,主要是響應(yīng)菜單中的各個(gè)設(shè)置選項(xiàng),該類實(shí)現(xiàn)的功能比較少。表1 CSettingDlg類說明表名稱屬性說明m_nLineWidth數(shù)據(jù)成員記錄線的粗細(xì)m_nLineStyle數(shù)據(jù)成員記錄線條的類型OnChangeLine

20、Width()成員函數(shù)編輯框控件(IDC_LINE_WIDTH)的響應(yīng)函數(shù)OnRadio1()成員函數(shù)選擇畫實(shí)線OnRadio2()成員函數(shù)選擇畫虛線OnRadio3()成員函數(shù)選擇畫點(diǎn)線OnPaint()成員函數(shù)在示例中顯示所需要的線型5、特色算法分析在函數(shù)或成員方法里找出你認(rèn)為比較有特色的12個(gè)算法。5.1 CDib類中的顯示bmp位圖 流程圖:流程圖1:設(shè)備無關(guān)位圖的讀取 流程圖2:設(shè)備無關(guān)圖的顯示流程程序運(yùn)行獲取文件絕對(duì)路徑名打開文件分析文件頭結(jié)構(gòu)文件是否為bmp文件?獲取位圖大小、分配內(nèi)存讀取信息頭結(jié)構(gòu)根據(jù)得到的信息判斷像素起始地址程序結(jié)束恢復(fù)舊的調(diào)色板程序運(yùn)行從文檔獲取位圖數(shù)據(jù)指針

21、從數(shù)據(jù)指針獲取位圖高寬等必要信息判斷是否帶有顏色表?從顏色表創(chuàng)建邏輯調(diào)色板選中新建的邏輯調(diào)色板,同時(shí)保留舊的調(diào)色板根據(jù)相應(yīng)參數(shù)調(diào)用WinAPI,顯示位圖程序結(jié)束根據(jù)相應(yīng)參數(shù)調(diào)用WinAPI,顯示儲(chǔ)備NNY Y 代碼: 功能:在磁盤中讀取一幅bmp位圖,然后顯示到屏幕上。 算法思路:首先理解bmp位圖里面所包含的信息然后再以下步驟實(shí)現(xiàn):讀取bmp位圖信息,bmp位圖的信息包括:位圖文件頭BITMAPFILEHEADER和位圖信息頭BITMAPINFOHEADER,還有就是顏色表RGBOUAD。最后一部分是實(shí)際的位圖數(shù)據(jù)IMAGEDATA。創(chuàng)建兼容DC,這和相對(duì)比較容易,通過CreateCompa

22、tibleDC函數(shù)創(chuàng)建。將位圖選入兼容DC中,也就是先把位圖存到內(nèi)存之中,通過SelectObject函數(shù)實(shí)現(xiàn)。將兼容DC中的位圖貼到當(dāng)前DC中,也就是顯示在屏幕上,通過BitBlt或者StretchBlt這兩個(gè)函數(shù)都可以實(shí)現(xiàn),區(qū)別在于,前者不可以自動(dòng)壓縮圖片在一個(gè)窗口顯示全部的圖片內(nèi)容,而后者可以自動(dòng)壓縮和拉伸圖片讓它布滿整個(gè)客戶區(qū)。加載位圖信息代碼:HGLOBAL CDib:LoadFile(CFile &file)/將指定的文件中的DIB對(duì)象讀到指定的內(nèi)存區(qū)域中DWORD dwFileSize;dwFileSize=file.GetLength();/獲取文件大小if (file.Rea

23、d(LPSTR)&bmfHeader,sizeof(bmfHeader)!=sizeof(bmfHeader)/讀取文件頭return NULL; /大小不一致,返回NULLif (bmfHeader.bfType!=DIB_MARKER)/判斷是否是DIB對(duì)象return NULL;m_hDib=(HGLOBAL):GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,dwFileSize-sizeof(BITMAPFILEHEADER);/分配DIB內(nèi)存if (m_hDib=0)return NULL; /給CDib類的成員變量賦值lpdib=(LPSTR):

24、GlobalLock(HGLOBAL)m_hDib);/鎖定lpbminfo=(BITMAPINFO*)lpdib;lpbmihrd=(BITMAPINFOHEADER*)lpdib;lpRgbQuag=(RGBQUAD*)(lpdib+lpbmihrd-biSize);int m_numberOfColors=GetColorNum(LPSTR)lpbmihrd);if (lpbmihrd-biClrUsed=0)lpbmihrd-biClrUsed=m_numberOfColors;DWORD colorTableSize=m_numberOfColors*sizeof(RGBQUAD);

25、lpDIBBits=lpdib+lpbmihrd-biSize+colorTableSize;if(file.ReadHuge(lpdib,dwFileSize-sizeof(BITMAPFILEHEADER)!=dwFileSize-sizeof(BITMAPFILEHEADER)/讀像素,大小不一致時(shí):GlobalUnlock(HGLOBAL)m_hDib);/解除鎖定:GlobalFree(HGLOBAL)m_hDib);/釋放內(nèi)存return NULL;:GlobalUnlock(HGLOBAL)m_hDib);/解除鎖定return m_hDib;/返回DIB句柄顯示位圖部分函數(shù)代碼

26、:BOOL CDib:DrawDib(HDC hDC,LPRECT lpDCRect,HGLOBAL hDIB,LPRECT lpDIBRect,CPalette *pPal) /繪制DIB對(duì)象BOOL bSuccess=FALSE;/重畫成功標(biāo)志HPALETTE hOldPal=NULL;/以前的調(diào)色板if(hDIB=NULL)/判斷是否是有效的DIB對(duì)象return FALSE;/不是,則返回lpdib=(LPSTR):GlobalLock(hDIB);/鎖定DIBlpDIBBits=GetBits(lpdib);/找到DIB圖像像素起始位置if(pPal!=NULL)/獲取調(diào)色板,并選取

27、到設(shè)備環(huán)境中HPALETTE hPal=(HPALETTE)pPal-m_hObject;hOldPal=:SelectPalette(hDC,hPal,TRUE);:SetStretchBltMode(hDC,COLORONCOLOR); /設(shè)置顯示模式bSuccess=:StretchDIBits(hDC,lpDCRect-left,lpDCRect-top,GetRectWidth(lpDCRect),GetRectHeight(lpDCRect), /目標(biāo)文件信息lpDIBRect-left,lpDIBRect-top,GetRectWidth(lpDIBRect),GetRectHe

28、ight(lpDIBRect), /源文件信息lpDIBBits,(LPBITMAPINFO)lpdib,DIB_RGB_COLORS,SRCCOPY); /指向DIB像素指針,指向位圖信息結(jié)構(gòu)指針,使用顏色數(shù)目,光柵操作類型:GlobalUnlock(hDIB);if(hOldPal=NULL):SelectPalette(hDC,hOldPal,TRUE);return bSuccess;5.2 CDrawingView類中的畫圖部分 功能:在客戶區(qū)中實(shí)現(xiàn)畫直線、矩形、橢圓、任意曲線。畫完之后可以保存為bmp格式的文件。 算法思路:在View類中創(chuàng)建畫筆,然后通過調(diào)用各個(gè)函數(shù)去畫不同的形狀

29、在畫圖方面,我寫了4個(gè)函數(shù), OnLine()、OnRectangle()、OnEllipse()、OnPencil()。OnLine()函數(shù):SetClassLong(this-GetSafeHwnd(),GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_CROSS);DC.LineTo(m_LineEnd);DC.MoveTo(m_LineOrg);m_LineEnd=point;DC.LineTo(m_LineEnd);OnRectangle()函數(shù):DC.SelectStockObject(HOLLOW_BRUSH);DC.Rectangle(m_LineOr

30、g.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y);DC.MoveTo(m_LineOrg);m_LineEnd=point;DC.Rectangle(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y);OnEllipse()函數(shù):DC.SelectStockObject(HOLLOW_BRUSH);DC.Ellipse(m_LineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y);DC.MoveTo(m_LineOrg);m_LineEnd=point;DC.Ellipse(m_L

31、ineOrg.x,m_LineOrg.y,m_LineEnd.x,m_LineEnd.y);OnPencil()函數(shù):DC.SetROP2(R2_COPYPEN); /保證重疊的線不會(huì)變化,使畫出來的線條始終為黑色DC.MoveTo(m_LineOrg);DC.LineTo(point);m_LineOrg=point;(注:這些代碼不是寫在OnLine()、OnRectangle()、OnEllipse()、OnPencil()這4個(gè)函數(shù)中,而是寫在OnLButtonUp()和OnMouseMove()中)分別把以上的四個(gè)功能的代碼同時(shí)寫在OnLButtonUp()和OnMouseMove(

32、)中,因?yàn)槿绻粚懺贠nLButtonUp()里面的話,畫線條時(shí)在鼠標(biāo)移動(dòng)中線條不會(huì)立刻顯示,要等鼠標(biāo)左鍵彈起之后才顯示畫出來,同時(shí)在OnMouseMove()便可以解決這個(gè)問題,但是如果只在OnMouseMove()寫這些函數(shù)的話,當(dāng)兩次把線條畫在同一個(gè)地方時(shí),原來的線條會(huì)消失,所以必須把這四個(gè)功能同時(shí)寫在這兩個(gè)函數(shù)之中,才可以順利實(shí)現(xiàn)我想要的效果。 流程圖:程序運(yùn)行選擇哪個(gè)畫圖工具調(diào)用OnMouseMove()鼠標(biāo)左鍵按下在屏幕顯示所畫線條調(diào)用OnLButtonUp()再畫一次鼠標(biāo)左鍵彈起畫圖結(jié)束畫畫 畫鉛直矩 橢 筆線形 圓6、功能測試圖6-1 多窗口測試圖圖6-2 畫直線測試圖圖6-3

33、 畫矩形測試圖圖6-4 畫橢圓測試圖圖6-5 鉛筆工具測試圖圖6-6 顏色設(shè)置測試圖圖6-7 讀取位圖測試圖7、存在的不足與對(duì)策本次課程設(shè)計(jì),是第一次使用面向?qū)ο笳Z言做的程序,以前一直都是在win32下的編程,在這種界面化的編程環(huán)境中,感覺到了面向?qū)ο笳Z言的實(shí)用性,和win32下的那種感覺是完全不同的。由于是第一次使用mfc做相對(duì)大一點(diǎn)的程序,之前課本只有介紹過幾個(gè)很簡單的mfc程序,所以當(dāng)時(shí)學(xué)得并不多,不過通過這次的課程設(shè)計(jì),對(duì)mfc的使用熟悉了很多,同時(shí)也發(fā)現(xiàn)了自己c+語言基礎(chǔ)很不牢固,在類與類之間的函數(shù)調(diào)用非常不熟悉,還有指針的使用也不熟悉,而且在做程序之前并沒有好好的規(guī)劃,造成很多的函

34、數(shù)和成員變量都寫在了View類之中,對(duì)于排錯(cuò)和修得bug造成了極大的不便,有時(shí)候一個(gè)小錯(cuò)誤都需要找很久才能找到,直到現(xiàn)在也依然有一些bug還沒有修復(fù)的。不過程序整體上已經(jīng)沒有太大的問題了。這次課程設(shè)計(jì)里面花時(shí)間最多的還是對(duì)CDib類的封裝,雖然可以有書本對(duì)照著,但是依然有很多地方?jīng)]理解的,為了讓程序可以從磁盤中讀取bmp文件和顯示到屏幕上,我先后看了兩篇CDib類的源代碼,才開始動(dòng)手封裝的,在此之前還要去理解bmp文件所包含的信息,bmp位圖的信息包括:位圖文件頭BITMAPFILEHEADER和位圖信息頭BITMAPINFOHEADER,還有就是顏色表RGBOUAD。最后一部分是實(shí)際的位圖數(shù)據(jù)IMAGEDATA。中有理解了這些之后才有可能會(huì)理解CDib類的封裝。封裝完之后,還要將它導(dǎo)入到我的工程文件夾之中然后還要在View類和Doc類之中添加相應(yīng)的代碼,才能實(shí)現(xiàn)從有磁盤中讀取bmp位圖。到后來我

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論