




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、包頭師范學(xué)院本 科 學(xué) 年 論 文論文題目:基于VC+MFC程序設(shè)計(jì)簡易畫圖板 院 系:信息科學(xué)與技術(shù)學(xué)院 專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 學(xué) 號: 姓 名: 指導(dǎo)教師: 撰寫學(xué)年: 2010至2011學(xué)年 二零一零年十二月摘 要本軟件是利用VC+這個(gè)強(qiáng)大的可視化編程工具開發(fā)的,軟件主要功能包括圖形的繪制、線型的設(shè)置、顏色的設(shè)置,圖形文件的重繪和保存等功能。 本文介紹了如何完成上述功能,同時(shí)詳細(xì)闡述了畫圖系統(tǒng)的實(shí)現(xiàn)過程以及對畫圖系統(tǒng)所做的功能擴(kuò)充。在畫圖軟件設(shè)計(jì)上,其主要任務(wù)是:實(shí)現(xiàn)“繪制圖形”、“圖形的保存”兩項(xiàng)功能。 本軟件具有實(shí)用性、穩(wěn)定性、易用性,和可維護(hù)性的特點(diǎn),應(yīng)該說它應(yīng)是一個(gè)開放性的軟
2、件,用戶可以根據(jù)需要對其功能進(jìn)行擴(kuò)充、完善與修改,使其符合自己的要求。總之,本軟件是一個(gè)逐步完善的軟件。關(guān)鍵詞:VC+;MFC;繪圖 AbstractThis software is using vc + + this powerful visual programming tool development, software main functions including graphics rendering, linetype Settings, color setting, graphics file redraw of preserving and function. The pap
3、er introduced how to accomplish these functions, and explains in detail drawing system realization process and to drawing system do function expansion. In drawing software design, its main task is to achieve drawings, graphic save two functions. This software has practicability, stability, ease-of-u
4、se, and maintainability characteristic, should say it should be an open software, the user can according to the needs of its functions were expansion, perfect and modification, make them comply with their requirements. Anyhow, this software is a perfect gradually software. Key words:Vc + +; MFC; dra
5、wing目錄引 言1第1章vc+6.0和MFC簡介21.1vc+6.0簡介21.2MFC簡介2第2章 基礎(chǔ)知識22.1工程的新建32.2單文檔簡介42.3添加消息響應(yīng)函數(shù)52.4資源52.5設(shè)備環(huán)境6第3章 簡易畫圖板的制作63.1設(shè)計(jì)目的63.2 總體設(shè)計(jì)73.3詳細(xì)設(shè)計(jì)73.3.1點(diǎn)、直線、矩形、橢圓的繪制93.3.2連續(xù)線和扇形的繪制113.3.3畫刷133.3.4設(shè)置對話框153.3.5顏色163.3.6打開與保存17第4章 結(jié)果及結(jié)論174.1運(yùn)行結(jié)果174.2結(jié)論18參考文獻(xiàn)20附錄:簡易畫圖板主要程序代碼21致謝31引 言計(jì)算機(jī)技術(shù)的發(fā)展,使人類社會進(jìn)入了信息化和自動化,計(jì)算機(jī)智
6、能識別也隨著計(jì)算機(jī)的發(fā)展得到了迅速的發(fā)展。特別是圖形圖像的計(jì)算機(jī)處理技術(shù)更是有了前所未有的進(jìn)步和應(yīng)用。計(jì)算機(jī)識別也逐漸的從圖形圖像處理的大環(huán)境下分離出來作為一門新的高科技研究領(lǐng)域出現(xiàn)。畫圖涉及到的學(xué)科很多,包括數(shù)字信號處理、工程數(shù)學(xué)、信息論、運(yùn)籌學(xué)等,它與計(jì)算機(jī)、自動化、生物學(xué)、視覺心理和生理學(xué)、人工智能、智能信息處理等眾多領(lǐng)域交叉、綜合集成,有廣泛的應(yīng)用。該軟件功能與Windows下附件中的畫圖軟件有相似功能。本程序是在VC6.0平臺上用MFC所編。繪制方面的功能主要包括繪制各種圖元,包括直線、矩形、橢圓、扇形、連續(xù)線,用筆或畫刷自由繪圖。繪圖時(shí)可以選擇各種顏色,各種線型和線寬。軟件支持保存
7、和讀取wmf格式的圖形。該軟件設(shè)計(jì)的設(shè)計(jì)思想是面向?qū)ο蟪绦蛟O(shè)計(jì)的思想。面向?qū)ο蠹夹g(shù)是一個(gè)非常實(shí)用而強(qiáng)有力的軟件開發(fā)方法。它具有許多特色。一是方法的唯一性,即方法是對軟件開發(fā)過程所有階段進(jìn)行綜合考慮而得到的。二是從生存期的一個(gè)階段到下一個(gè)階段的高度連續(xù)性,即在一個(gè)階段所用到的部分與在下一個(gè)階段所使用的部分是銜接的,所使用的技術(shù)經(jīng)過生存期每一階段后不改變。三是把面向?qū)ο蠓治觯∣OA)、面向?qū)ο笤O(shè)計(jì)(OOD)和面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)集成到生存期的相應(yīng)階段。該軟件是Windows下附件中的畫圖軟件的輔助工具。他可以幫我們完成繪制wmf格式的圖形,填充了畫圖程序不能完成wmf格式圖形的空缺。由于筆者
8、所學(xué)知識有限,在繪圖功能上有許多方面不能滿足用戶需求。希望讀者提出寶貴的意見和建議。第1章vc+6.0和MFC簡介1.1 vc+6.0簡介VC+6.0是Microsoft公司推出的一個(gè)基于Windows系統(tǒng)平臺、可視化的集成開發(fā)環(huán)境,它的源程序按C+語言的要求編寫,并加入了微軟提供的功能強(qiáng)大的MFC(Microsoft Foundation Class)類庫。MFC中封裝了大部分Windows API函數(shù)和Windows控件,它包含的功能涉及到整個(gè)Windows操作系統(tǒng)。MFC不僅給用戶提供了Windows圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)建應(yīng)用程序的組件,這樣,開發(fā)人員不必從頭設(shè)計(jì)創(chuàng)建
9、和管理一個(gè)標(biāo)準(zhǔn)Windows應(yīng)用程序所需的程序,而是從一個(gè)比較高的起點(diǎn)編程,故節(jié)省了大量的時(shí)間。另外,它提供了大量的代碼,指導(dǎo)用戶編程時(shí)實(shí)現(xiàn)某些技術(shù)和功能。因此,使用VC+提供的高度可視化的應(yīng)用程序開發(fā)工具和MFC類庫,可使應(yīng)用程序開發(fā)變得簡單。1.2 MFC簡介MFC(Microsoft Foundation Classes),是一個(gè)微軟公司提供的類庫(class libraries),以C+類的形式封裝了Windows的API,它包含了窗口等許多類的定義。各種類的集合構(gòu)成了一個(gè)應(yīng)運(yùn)程序的框架結(jié)構(gòu),以減少應(yīng)用程序開發(fā)人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Window
10、s的內(nèi)建控件和組件的封裝類。MFC 6.0版本封裝了大約200個(gè)類,其中的一些可以被用戶直接使用。例如CWnd類封裝了窗口的功能,包括打印文本、繪制圖形及跟蹤鼠標(biāo)指針的移動等;CsplitterWnd類是從CWnd類派生出來的,繼承了基類或稱父類CWnd類的所有特性,但增加了自己的功能,實(shí)現(xiàn)拆分窗口,使窗口至少可被拆分成兩個(gè)窗口,用戶可以移動兩個(gè)窗口之間的邊框來改變窗口的大小;CtoolBar類可以定義工具欄等。MFC命名的慣例是類的名字通常是由“C”打頭;成員變量使用前綴“m_”,接著使用一個(gè)字母來指明數(shù)據(jù)類型,然后是變量的名稱;所有的單詞用大寫字母開頭。第2章 基礎(chǔ)知識2.1工程的新建打開
11、Microsoft Visual C+ 6.0 點(diǎn)擊File New 在Projects中選擇 MFC AppWizard (exe) ; 在 Project name中輸入工程的名字Graphic,在 Location中選擇工程存放的路徑。填完后點(diǎn)擊OK按鈕。(如圖1)填完后點(diǎn)擊OK按鈕,彈出對話框(如圖2)。在彈出來的對話框中我們可以選擇生成三種不同類型的應(yīng)用程序:單文檔、多文檔、對話框。 單文檔程序如記事本,在一個(gè)應(yīng)用程序中只能對一個(gè)文檔進(jìn)行操作,降低了編程的復(fù)雜度并減少了運(yùn)行程序時(shí)所需的資源。對某些小型應(yīng)用(比如文本編輯器或小型圖像編輯器)可以采用這種類型的窗口應(yīng)用程序。 多文檔程序如
12、PhotoShop,在一個(gè)應(yīng)用程序中可以同時(shí)對多個(gè)文檔進(jìn)行操作; 對話框程序如QQ,應(yīng)用程序的界面是對話框形式的。現(xiàn)對話框版本的程序更小一些。除了節(jié)省資源外,對話框版本的應(yīng)用程序的加載速度也更快些。基于對話框的應(yīng)用程序比完成相同功能的基于窗口的應(yīng)用程序更簡單有效。 這里我們選第一個(gè):單文檔。 選擇完后點(diǎn)擊Next,設(shè)置默認(rèn),最后點(diǎn)擊Finish完成工程的創(chuàng)建。圖1圖22.2單文檔簡介 生成單文檔程序后,進(jìn)行編譯,在運(yùn)行,我們可以看到以下的結(jié)果。如圖3 圖3在ClassView中,我們可以看到系統(tǒng)自動為我們生成了五個(gè)類:CApp , CDoc , CView , CAboutDlg , CMai
13、nFrame。 如圖4圖4CApp相當(dāng)于C語言中的main()函數(shù)。是程序的起始。 CDoc是用于處理程序中文檔的類。 CView主要是處理客戶區(qū)的可視化的操作的類。 CAboutDlg是處理關(guān)于對話框的類。 CMainFrame是非客戶區(qū)的一些資源的類。 我們主要是對CView 類進(jìn)行操作。2.3添加消息響應(yīng)函數(shù) 系統(tǒng)為我們生成了一個(gè)程序的框架,但是這個(gè)框架完成不了什么具體的功能。為了使程序程序完成我們想要做的事,我們要向這個(gè)框架中加入一些代碼。 VC+程序的運(yùn)行并不像C語言是按照順序運(yùn)行下來的。每當(dāng)我們完成一個(gè)事件,系統(tǒng)就會發(fā)出特定的消息,程序就會跳到相應(yīng)的消息響應(yīng)函數(shù)中執(zhí)行里面的代碼。單
14、擊菜單中的View-Class Wizard(或按快捷鍵Ctrl+W),將會彈出MFC Class Wizard對話框。在Class Name中選擇CView,在Messages中選擇WM_LBUTTONDBLCLK,點(diǎn)擊右邊的Add Function按鍵。這樣我們就為程序添加了鼠標(biāo)左鍵雙擊的消息響應(yīng)函數(shù),函數(shù)名為OnLButtonDblClk(UINT nFlags, CPoint point)。我們點(diǎn)擊Edit Code按鍵就可以進(jìn)入消息響應(yīng)函數(shù)中。 我們在消息響應(yīng)函數(shù)中添加如下代碼: AfxMessageBox(“Hello Word!”); 運(yùn)行程序!當(dāng)我們在客戶區(qū)中雙擊鼠標(biāo)左鍵時(shí),我
15、們可以看到效果(如圖5)。 我們在完成雙擊鼠標(biāo)左鍵這個(gè)事件后,Windows便會發(fā)出WM_LBUTTONDBLCLK這條消息。我們的程序收到這個(gè)消息后,就會跳轉(zhuǎn)到鼠標(biāo)左鍵雙擊的消息響應(yīng)函數(shù)內(nèi),執(zhí)行里面的代碼。 同樣的,我們可以添加其他的消息響應(yīng)函數(shù),如鼠標(biāo)左鍵按下,抬起,鼠標(biāo)移動等(WM_LBUTTONUP、WM_LBUTTONDOWN、WM_MOUSEMOVE等)。我們程序就是在這樣的消息響應(yīng)機(jī)制下運(yùn)行的。 圖52.4資源 在ResoureView 里,我們可以編輯對話框、菜單、工具條、快捷鍵等資源。 點(diǎn)開Menu,可以看到一個(gè)ID為IDR_MAINFRAME的菜單。ID是一個(gè)標(biāo)識,實(shí)際上是
16、一個(gè)無符號整型常量,每一個(gè)資源在程序中都有一個(gè)唯一的ID號。雙擊IDR_MAINFRAME,在右邊的視圖中雙擊幫助右邊的虛線框,彈出菜單屬性,在Caption中輸入“畫圖”,并將其關(guān)閉。雙擊畫圖菜單下面出現(xiàn)虛線框,在caption中輸入“畫線”后將其關(guān)閉。雙擊畫線,在彈出的菜單屬性中ID欄的ID_MENUITEM32775改成ID_MENUITEM_LINE。同樣方法在建一個(gè)“畫圓”菜單項(xiàng)。注意:每個(gè)資源對應(yīng)一個(gè)ID號,ID號的命名全部用大寫字母,且要符合匈牙利命名法。我們?yōu)樾碌牟藛雾?xiàng)起名,如果我們選擇了Pop-up,生成的菜單就還有下級子菜單;如果沒有選擇,菜單就沒有下級菜單。我們同樣可以在
17、Class Wizard 中為我們生成的菜單添加響應(yīng)。 在Class Wizard 中的Object IDs中選中菜單的ID號,Messages中選擇COMMOND,然后點(diǎn)擊Add Function。這樣,我們就為新建的菜單添加了點(diǎn)擊的響應(yīng),我們同樣可以點(diǎn)擊Edit Code 編輯消息響應(yīng)函數(shù)。 2.5設(shè)備環(huán)境 CDC是設(shè)備環(huán)境類的基類直接由CObject派生。是GDI的關(guān)鍵元素,它代表了物理設(shè)備。每一個(gè)C+設(shè)備環(huán)境對象都有相對應(yīng)Windows設(shè)備環(huán)境,并通過一個(gè)32位類型的HDC句柄來標(biāo)識。CDC類的虛擬性使我們可以很容易的做到編寫同時(shí)適用于多種設(shè)備的代碼。使用CDC類可以使我們的作圖不用關(guān)
18、心設(shè)備的問題。 CClientDC和CWindowDC是顯示設(shè)備環(huán)境類,都是由CDC派生而來,區(qū)別在于CClientDC是窗口的客戶區(qū)不包括邊框、標(biāo)題欄和菜單欄,(0,0)指客戶區(qū)域的左上角。CWindowDC的(0,0)指整個(gè)屏幕的左上角,這意味著我們可以在顯示器的任意地方繪圖,包括窗口邊框、標(biāo)題欄和菜單欄等等。CWindowDC一般應(yīng)用在框架窗口,而不是視圖窗口。 CDC對象被創(chuàng)建后一定要在合適的時(shí)候?qū)⑺鼊h除掉,如果忘記了刪除設(shè)備環(huán)境對象則會造成內(nèi)存丟失。在每次繪圖前,我們要獲取設(shè)備環(huán)境,我們可以使用CDC* GetDC ( ) 函數(shù)來獲取設(shè)備環(huán)境。在繪圖完成后,使用void Releas
19、eDC(CDC* pDC ) 函數(shù)釋放設(shè)備環(huán)境。第3章 簡易畫圖板的制作3.1設(shè)計(jì)目的設(shè)計(jì)一個(gè)單文檔類型的MFC AppWizard (exe)工程,工程取名為:Graphic。此程序?qū)?shí)現(xiàn)簡單的繪圖功能,包括點(diǎn)、直線、矩形、橢圓、扇形和連續(xù)線的繪制。并且能實(shí)現(xiàn)繪圖的控制,包括線寬、線型和顏色的設(shè)置,圖形的保存和打開以及筆刷的使用。3.2 總體設(shè)計(jì)設(shè)計(jì)圖如圖6簡易畫圖板文件繪圖筆刷打開保存點(diǎn)直線矩形橢圓扇形連續(xù)線設(shè)置顏色簡單筆刷位圖筆刷透明筆刷線寬線型圖63.3詳細(xì)設(shè)計(jì)首先,新建一個(gè)單文檔類型的MFC AppWizard (exe)工程,工程取名為:Graphic。為此程序添加一個(gè)子菜單,菜單
20、名稱為“繪圖”,并為其添加六個(gè)菜單項(xiàng),分別用來控制不同圖形的繪制。當(dāng)用戶選擇其中的一個(gè)菜單項(xiàng)后,程序?qū)凑债?dāng)前的選擇進(jìn)行相應(yīng)圖形的繪制。添加的六個(gè)菜單項(xiàng)的ID及名稱如表1所示。然后分別為這六個(gè)菜單項(xiàng)添加命令響應(yīng),本程序讓視類(CGraphicView)對這些菜單命令進(jìn)行響應(yīng),這六個(gè)響應(yīng)函數(shù)的名稱分別如表1所示。表1添加的菜單項(xiàng)菜單項(xiàng)ID菜單項(xiàng)名稱菜單項(xiàng)命令響應(yīng)函數(shù)IDM_DOT點(diǎn)OnDotIDM_LINE直線OnLineIDM-RECTANGLE矩形OnRectangleIDM_ELLIPSE橢圓OnEllipseIDM_SHANXING扇形OnShanxingIDM_LIANXUXIAN連續(xù)
21、線OnLianxuxian在程序運(yùn)行以后,當(dāng)用戶單擊某個(gè)菜單項(xiàng)時(shí),應(yīng)該把用戶的選擇保存起來,以便隨后的繪圖操作使用。因此在CGraphicView類中添加一個(gè)私有變量m_nDrawType;用來保存用戶的選擇,該變量的定義如下所述:private: UINT m_nDrawType;接著,在視類的構(gòu)造函數(shù)中將此變量初始化為0,程序代碼如下:CGraphicView:CGraphicView()/ TODO: add construction code here m_nDrawType=0;利用switch/case語句,來分別完成相應(yīng)圖形的繪制。當(dāng)用戶選擇【繪圖】菜單下的不同子菜單項(xiàng)時(shí),將變量
22、m_nDrawType設(shè)置為不同的值。程序代碼如下:void CGraphicView:OnDot() / TODO: Add your command handler code herem_nDrawType=1;void CGraphicView:OnLine() / TODO: Add your command handler code herem_nDrawType=2;void CGraphicView:OnRectangle() / TODO: Add your command handler code herem_nDrawType=3;void CGraphicView:OnE
23、llipse() / TODO: Add your command handler code herem_nDrawType=4;void CGraphicView:OnShanxing() / TODO: Add your command handler code herem_nDrawType=5;void CGraphicView:OnLianxuxian() / TODO: Add your command handler code herem_nDrawType=6;3.3.1點(diǎn)、直線、矩形、橢圓的繪制對于直線、矩形和橢圓,在繪制時(shí)都可有兩點(diǎn)來確定其圖形。當(dāng)鼠標(biāo)左擊時(shí)得到一個(gè)點(diǎn),當(dāng)鼠
24、標(biāo)左鍵松開時(shí)得到另外一個(gè)點(diǎn)。為視類CGraphicView分別捕獲鼠標(biāo)左鍵按下和彈起這兩個(gè)消息。另外當(dāng)鼠標(biāo)左鍵按下時(shí),需要將鼠標(biāo)當(dāng)前按下點(diǎn)保存,因此我們?yōu)镃GraphicView再增加一個(gè)CPoint類型的私有成員變量:m_ptOrigin,在視類的構(gòu)造函數(shù)中將此變量初始化為0。在鼠標(biāo)按下消息響應(yīng)函數(shù)中,保存該點(diǎn),代碼如下:void CGraphicView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_ptOrigin=point
25、; /保存鼠標(biāo)按下得到點(diǎn),也是繪制一個(gè)點(diǎn)CView:OnLButtonDown(nFlags, point);在鼠標(biāo)左鍵彈起消息響應(yīng)函數(shù)中實(shí)現(xiàn)繪圖,代碼如下:void CGraphicView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/創(chuàng)建并獲得設(shè)備描述CClientDC dc(this); switch (m_nDrawType)case 1:dc.SetPixel(point,RGB(255,0,0)); /*繪制點(diǎn)*/break
26、;case 2: /*繪制直線*/dc.MoveTo(m_ptOrigin);/*調(diào)用MoveTo函數(shù)移動到原點(diǎn)*/dc.LineTo(point);/*調(diào)用LineTo函數(shù)繪制到終點(diǎn)。*/break;case 3: /*繪制矩形*/ dc.Rectangle(CRect(m_ptOrigin,point);break;case 4: /*繪制橢圓*/dc.Ellipse(CRect(m_ptOrigin,point);break;CView:OnLButtonUp(nFlags, point);在上述程序中,設(shè)置一個(gè)點(diǎn),用到的函數(shù)是SetPixel,這也是CDC類的一個(gè)成員方法,該函數(shù)的生命
27、形式如下:COLORREF SetPixel (POINT point,COLORREF crColor);該函數(shù)是在指定的點(diǎn)設(shè)置一個(gè)像素。其中第一個(gè)參數(shù)(point)是指定的點(diǎn),第二個(gè)參數(shù)(crColor)是指定的顏色。在程序中設(shè)定的顏色在系統(tǒng)顏色表中可能不存在,但系統(tǒng)會選擇一種和這個(gè)顏色最接近的顏色。RGB是一個(gè)宏,它有三個(gè)參數(shù),分別代表紅、綠、藍(lán)三種顏色的值。這三個(gè)參數(shù)BYTE類型,取值范圍為0255。RGB(0,0,0)是黑色,RGB(255,255,255)是白色,將這三個(gè)分量設(shè)置成為0255之間的任意值,從而得到各種不同的顏色。這里的RGB(255,0,0)是紅色。繪制直線時(shí),首先
28、調(diào)用MoveTo函數(shù)移動到原點(diǎn),然后調(diào)用LineTo函數(shù)繪制到終點(diǎn)。繪制矩形時(shí)使用Rectangle函數(shù),該函數(shù)聲明形式為:BOOL Rectangle (LPCRECT lpRect);該函數(shù)有一個(gè)指向Crect對象的參數(shù),后者可以利用兩個(gè)點(diǎn)來構(gòu)造。需要注意的是該函數(shù)需要的是指向Crect對象的指針,而上述代碼中傳遞的卻是Crect對象,但運(yùn)行編譯時(shí)也能成功通過,運(yùn)行時(shí)也不會報(bào)錯(cuò),這是為什么呢?我們知道C系列的語言都是強(qiáng)類型語言,如果類型不匹配的話,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。但這里為什么沒有進(jìn)行這樣的強(qiáng)制類型轉(zhuǎn)換程序也可以通過呢?實(shí)際上,Crect類提供了這樣一個(gè)成員函數(shù):重載LPCRECT操作
29、符,其作用是將Crect轉(zhuǎn)換為LPCRECT類型。因此,當(dāng)在程序中給Rectangle函數(shù)的參數(shù)賦值時(shí),如果它發(fā)現(xiàn)該參數(shù)是一個(gè)Crect對象,它就會隱式地調(diào)用LPCRECT操作符,將Crect類型的對象轉(zhuǎn)換為LPRECT類型。因此,在給函數(shù)傳遞參數(shù)時(shí),如果我們看到的傳遞的數(shù)值類型和所需要的類型不匹配,但編譯和運(yùn)行都正確的情況時(shí),就要想想這其中的緣由了。當(dāng)然,有的情況下可能是這些類型之間本來就可以互相轉(zhuǎn)換,例如short類型和int類型。但是參數(shù)是對象類的話,就要考慮了,它選擇的對象的構(gòu)造方法進(jìn)行的隱式轉(zhuǎn)換,還是有其他重載的操作符。當(dāng)用戶選擇橢圓菜單項(xiàng)時(shí),調(diào)用Ellipes函數(shù)繪制一個(gè)橢圓。3.
30、3.2連續(xù)線和扇形的繪制Windows系統(tǒng)為我們提供了一個(gè)畫圖程序,在該程序中,利用畫筆可以繪制連續(xù)的線條,下面我們設(shè)計(jì)繪制連續(xù)線和扇形。為了繪制連續(xù)的線條,首先要得到線條的起點(diǎn),這在前面已經(jīng)實(shí)現(xiàn)。然后需要捕獲鼠標(biāo)移動過程中的每一個(gè)點(diǎn),這可以通過捕獲鼠標(biāo)移動消息(WM_MOUSEMOVE)來實(shí)現(xiàn)。在此消息響應(yīng)函數(shù)中,在依次捕獲的各個(gè)點(diǎn)之間繪制一條條非常短的線段,從而就可以繪制出一條連續(xù)的線條。遵照這一思路,我們開始增加程序的功能。首先為視類增加鼠標(biāo)移動消息(WM_MOUSEMOVE)的響應(yīng)函數(shù)(OnMouseMove)。這樣,只要鼠標(biāo)在應(yīng)用程序窗口中移動時(shí)都會進(jìn)入到這個(gè)消息響應(yīng)函數(shù)中。但這并不
31、是我們所期望的,我們希望在鼠標(biāo)左鍵按下后開始繪圖。因此,我們需要有一個(gè)變量來表示鼠標(biāo)左鍵是否按下這一狀態(tài),然后在鼠標(biāo)移動消息響應(yīng)函數(shù)中對這一變量進(jìn)行判斷。當(dāng)此變量為真,即鼠標(biāo)左鍵已經(jīng)按下去,我們開始繪圖。于是,為視類添加一個(gè)BOOL型的私有變量m_bDraw,當(dāng)鼠標(biāo)左鍵按下去時(shí),此變量為真;當(dāng)鼠標(biāo)左鍵彈起時(shí),此變量為假,這時(shí),我們就不再繪制線條了。該變量在視類頭文件中的定義代碼如下:Private: BOOL m_bDraw;接下來在視類的構(gòu)造函數(shù)中,將此變量初始化為FALSE。m_bdraw=FALSE;當(dāng)鼠標(biāo)左鍵按下去時(shí),在視類的OnLButtonDown函數(shù)中將此變量初始化為TRUE。m
32、_bdraw=TRUE;當(dāng)鼠標(biāo)左鍵彈起時(shí),在視類的OnLButton函數(shù)中將此變量初始化為假。m_bdraw=FALSE;然后在OnMouseMove函數(shù)中首先對m_bdraw變量進(jìn)行判斷,如果其值為真,說明鼠標(biāo)左鍵已經(jīng)按下去了,這時(shí)就可開始進(jìn)行畫線操作。還有一點(diǎn)需要注意,因?yàn)槊坷L制一條線段后,下次應(yīng)該從這條線段的終點(diǎn)開始繼續(xù)繪制。因此,繪制完當(dāng)前線段后,應(yīng)該修改線段的起點(diǎn),將當(dāng)前線段的終點(diǎn)作為下一條線段的起點(diǎn),程序代碼如下:void CGraphicView:OnMouseMove(UINT nFlags, CPoint point) /TODO: Add your message hand
33、ler code here and/or call default/創(chuàng)建并獲得設(shè)備描述 CClientDC dc(this);/創(chuàng)建寬度為1的實(shí)線紅色畫筆CPen pen (PS_SOLID, 1, RGB(255,0,0));/把創(chuàng)建的畫筆選入設(shè)備描述 CPen *pOldpen=dc.SelectObject(&pen);if(m_bDraw=true)dc.MoveTo(m_ptOrigin); dc.LineTo(point);/修改線段的起點(diǎn) m_ptOrigin=point;/恢復(fù)設(shè)備描述dc.SelectObject(pOldpen); CView:OnMouseMove(nFl
34、ags, point);如果在上面繪制連續(xù)線條的程序中,保持每段小直線的起點(diǎn)不變,即以鼠標(biāo)左鍵按下時(shí)的起點(diǎn)為起點(diǎn)不變,分別繪制到鼠標(biāo)移動點(diǎn)的直線,這時(shí)就會出現(xiàn)扇形的效果。也就是去掉上述代碼OnMouseMove函數(shù)中修改線段起點(diǎn)的代碼。程序代碼如下:void CGraphicView:OnMouseMove(UINT nFlags, CPoint point) /TODO: Add your message handler code here and/or call default/創(chuàng)建并獲得設(shè)備描述 CClientDC dc(this);/創(chuàng)建寬度為1的實(shí)線紅色畫筆CPen pen (PS_
35、SOLID, 1, RGB(255,0,0));/把創(chuàng)建的畫筆選入設(shè)備描述 CPen *pOldpen=dc.SelectObject(&pen);if(m_bDraw=true)dc.MoveTo(m_ptOrigin); dc.LineTo(point);/恢復(fù)設(shè)備描述dc.SelectObject(pOldpen); CView:OnMouseMove(nFlags, point);3.3.3畫刷再為此程序添加一個(gè)子菜單,菜單名稱為“畫刷”,并為其添加三個(gè)菜單項(xiàng),分別用來控制不同的畫刷。MFC提供了一個(gè)CBrush類,可以用來創(chuàng)建畫刷對象。畫刷通常用來填充一塊區(qū)域。簡單畫刷、位圖畫刷、透
36、明畫刷,程序代碼如下:void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) /創(chuàng)建一個(gè)紅色畫刷CBrush brush(RGB(255,0,0);/創(chuàng)建并獲得設(shè)備描述表CClientDC dc(this);/利用紅色畫刷填充鼠標(biāo)拖曳過程中形成的矩形區(qū)域dc.FillRect(CRect(m_ptOrigin,point),&brush);/創(chuàng)建位圖對象CBitmap bitmap;/加載位圖資源bitmap.LoadBitmap(IDB_BITMAP1);/創(chuàng)建位圖畫刷CBrush brush(&bitmap);/創(chuàng)建并獲得設(shè)備描述表CCl
37、ientDC dc(this);/利用紅色畫刷填充鼠標(biāo)拖曳過程中形成的矩形區(qū)域dc.FillRect(CRect(m_ptOrigin,point),&brush);/創(chuàng)建并獲得設(shè)備描述表CClientDC dc(this);/創(chuàng)建一個(gè)空畫刷CBrush *pBrush = CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);/將空畫刷選入設(shè)備描述表CBrush *pOldBrush = dc.SelectObject(pBrush);/繪制一個(gè)矩形dc.Rectangle(CRect(m_ptOrigin,point);/恢復(fù)先前的畫刷dc
38、.SelectObject(pOldBrush);m_bDraw = FALSE;CView:OnLButtonUp(nFlags, point);在簡單畫刷程序中,首先創(chuàng)建一個(gè)紅色畫刷;接著創(chuàng)建設(shè)備描述表對象;然后調(diào)用設(shè)備描述表對象的成員函數(shù)FillRect,利用指定的畫刷填充一塊指定的矩形區(qū)域,而鼠標(biāo)拖動過程中的起點(diǎn)和終點(diǎn)就決定了需要填充的矩形區(qū)域,因此,代碼中通過CRect類利用鼠標(biāo)拖動的起點(diǎn)和終點(diǎn)構(gòu)造了這快矩形區(qū)域。CRect類提供了多個(gè)構(gòu)造函數(shù),這里使用的是下面這種構(gòu)造函數(shù),即通過指定矩形區(qū)域的左上角和右下角這兩個(gè)點(diǎn)來構(gòu)造一塊矩形區(qū)域。CRect(POINT topLeft,POIN
39、T bottomRight);代碼中的CDC類的成員函數(shù)FillRect,該函數(shù)的功能是用指定的畫刷填充一個(gè)矩形。該函數(shù)將填充全部的矩形,包括上左邊界,但不填充右底邊界。FillRect函數(shù)的聲明如下:void FillRect (LPCRECT lpRect,CBrush* pBrush);該函數(shù)有兩個(gè)參數(shù),lpRect是指向一個(gè)RECT結(jié)構(gòu)體或CRect對象的指針,該結(jié)構(gòu)體或?qū)ο笾邪艘畛涞木匦蔚倪壿嬜鴺?biāo)。pBrush是指向用于填充矩形的畫刷對象的指針。在位圖畫刷程序中,CBrush類有下面這樣一種構(gòu)造函數(shù)。CBrush (CBitmap* pBitmap);該構(gòu)造函數(shù)要求一個(gè)CBit
40、map類型的指針,CBitmap類是位圖類,于是我們就會這樣想:利用這個(gè)構(gòu)造函數(shù)是否就可以創(chuàng)建一個(gè)位圖畫刷呢?事實(shí)確實(shí)如此。創(chuàng)建CBitmap對象時(shí),僅調(diào)用其構(gòu)造函數(shù)并不能得到一個(gè)有用的位圖對象,還需要調(diào)用一個(gè)初始化函數(shù)來初始化這個(gè)位圖對象。CBitmap類提供了多個(gè)初始化函數(shù),例如,LoadBitmap、CreateBitmap、BitmapIndirect等。這里用LoadBitmap函數(shù)來加載一副位圖,該函數(shù)的聲明如下:BOOL LoadBitmap (LPCTSTR lpszResourceName);BOOL LoadBitmap (UINT nIDResource);其中第二種聲明
41、需要一個(gè)資源ID作為參數(shù)。首先給程序增加一個(gè)位圖資源。為一個(gè)工程創(chuàng)建資源有多種實(shí)現(xiàn)方法,其中一種方法可以利用【Insert】菜單下的【Resource】命令,在彈出的對話框中選擇Bitmap資源類型,單擊【New】按鈕,即可創(chuàng)建一個(gè)默認(rèn)名稱為IDB_BITMAP1的位圖資源,并在VC+集成開發(fā)環(huán)境右邊的代碼編輯區(qū)中打開位圖編輯器。可以利用編輯器右邊的調(diào)色板和繪圖工具來編輯位圖資源,還可以通過拉伸位圖編輯器中網(wǎng)格周圍的藍(lán)色方點(diǎn)來調(diào)整位圖的大小。在透明畫刷程序中,我們利用GetStockObject這個(gè)函數(shù)來獲取一個(gè)黑色或白色的畫刷句柄。這個(gè)函數(shù)是否能夠獲得一個(gè)透明畫刷句柄呢?從MSND提供的幫助
42、信息中,可以看到該函數(shù)的參數(shù)取值之一可以是NULL_BRUSH,以獲取一個(gè)空畫刷。那么,這個(gè)空畫刷是否就是我們所需要的透明畫刷呢?結(jié)論是正確的。但這時(shí)存在一個(gè)問題,我們獲取的是句柄,而在進(jìn)行繪制操作時(shí)需要的是一個(gè)畫刷對象。如何從畫刷句柄轉(zhuǎn)換為畫刷對象呢?CBrush類提供了一個(gè)FromHandle函數(shù)來實(shí)現(xiàn)這樣的功能。該函數(shù)的聲明如下:Static CDC* PASCAL FromHandle(HDC hDC);3.3.4設(shè)置對話框?yàn)槌绦蛱砑右粋€(gè)設(shè)置對話框,允許用戶指定畫筆的類型、線寬,并讓隨后的繪圖操作就使用用戶指定的新設(shè)置值來進(jìn)行繪制。為了實(shí)現(xiàn)這一功能,首先需要為程序添加一個(gè)對話框資源,并
43、按下表修改屬性。屬性值IDIDD_DLG_SETTINGCaptionSettingFont宋體設(shè)置線型、線寬對話框的代碼如下:void CGraphicView:OnSetting() /TODO: Add your command handler code hereCSettingDlg dlg;dlg.m_nLineWidth=m_nLineWidth; dlg.m_nLineStyle=m_nLineStyle;if(IDOK=dlg.DoModal()m_nLineWidth=dlg.m_nLineWidth; m_nLineStyle=dlg.m_nLineStyle;3.3.5顏
44、色顏色對話框看起來比較復(fù)雜。實(shí)際上,MFC為我們提供了一個(gè)類:CColorDialog,可以很方便的創(chuàng)建這樣的一個(gè)顏色對話框。void CGraphicView:OnColor() / TODO: Add your command handler code here CColorDialog dlg;dlg.m_cc.Flags |=CC_RGBINIT | CC_FULLOPEN; dlg.m_cc.rgbResult=m_clr;if(IDOK=dlg.DoModal()m_clr=dlg.m_cc.rgbResult;3.3.6打開與保存void CGraphicView:OnFileO
45、pen() / TODO: Add your command handler code hereHMETAFILE hmetaFile;hmetaFile=GetMetaFile(meta.wmf);m_dcMetaFile.PlayMetaFile(hmetaFile);DeleteMetaFile(hmetaFile);Invalidate();void CGraphicView:OnFileSave() / TODO: Add your command handler code here HMETAFILE hmetaFile;hmetaFile=m_dcMetaFile.Close()
46、;CopyMetaFile(hmetaFile,meta.wmf);m_dcMetaFile.Create();DeleteMetaFile(hmetaFile);第4章 結(jié)果及結(jié)論4.1運(yùn)行結(jié)果運(yùn)行結(jié)果如圖7、8、9圖7圖8圖94.2結(jié)論其實(shí)學(xué)任何一種語言都是一樣的。需要勤奮+毅力+運(yùn)氣=成功,這是我認(rèn)為的一個(gè)公式。這里毅力和勤奮是個(gè)人因素,而運(yùn)氣這是先天的。如果以前沒有接觸過編程語言的話,在接觸VC前我建議你先學(xué)習(xí)一些基礎(chǔ)語言,比如C等都是一些比較好學(xué)的基礎(chǔ)語言,我當(dāng)初就是從C語言過度學(xué)VC的。學(xué)基礎(chǔ)語言的目的是學(xué)習(xí)語法結(jié)構(gòu)和如何編寫概念,只有你理解和掌握了這些編程用的工具才能學(xué)習(xí)高級語言
47、。這些基礎(chǔ)語言中我建議大家學(xué)C語言,其實(shí)VC就是C+也就是C語言的兒子,父親學(xué)習(xí)起來比較容易上手,但遇到類似WINDOWS的程序的時(shí)候比較固執(zhí)不容易溝通,在這種條件下才有了兒子,兒子比較開朗應(yīng)變能力強(qiáng),但是就因?yàn)樗@些優(yōu)點(diǎn)才使初學(xué)者難以掌握。 VC是C+語言,是一種面向?qū)ο蟮木幊陶Z言。他于基礎(chǔ)語言不同點(diǎn)在于,基礎(chǔ)語言是一條路走到底的(中斷技術(shù)除外),而面向?qū)ο笫堑却愕闹噶畈磐伦撸潜粍拥木幊陶Z言。這點(diǎn)是學(xué)習(xí)VC前必須扭轉(zhuǎn)的概念。通過這次學(xué)年設(shè)計(jì),我了解vc+是Windows平臺上的C+編程環(huán)境,學(xué)習(xí)VC要了解很多Windows平臺的特性并且還要掌握MFC、ATL、COM等的知識,難度比較大
48、。Windows下編程需要了解Windows的消息機(jī)制以及回調(diào)(callback)函數(shù)的原理;MFC是Win32API的包裝類,需要理解文檔視圖類的結(jié)構(gòu),窗口類的結(jié)構(gòu),消息流向等等;COM是代碼共享的二進(jìn)制標(biāo)準(zhǔn),需要掌握其基本原理等等。基于我們這次用VC+編寫了一個(gè)簡單的畫圖板,功能不是很多,但是從中的到不少收獲。主要有:1對項(xiàng)目和文檔的了解,我們在編寫程序時(shí),要對不同的文件進(jìn)行編寫。其中項(xiàng)目就是文件的集合,包括頭文件、源代碼文件、資源文件。文檔窗口也稱編輯窗口,是用戶進(jìn)行輸入或編輯頭文件、源文件、資源的區(qū)域。在編輯文件時(shí),為了增加程序的可讀性,系統(tǒng)用綠色顯示注釋語句,用藍(lán)色顯示關(guān)鍵字。2菜單
49、:我們繪制畫圖板時(shí),就要建立一個(gè)“繪圖”菜單。對于“繪圖”菜單下還有幾個(gè)子菜單項(xiàng),通過建立菜單同時(shí)讓它實(shí)現(xiàn)菜單上的命令,這就要我們對每個(gè)菜單項(xiàng)進(jìn)行設(shè)置,諸如,ID、標(biāo)題、快捷鍵、熱鍵等。還有一些屬性設(shè)置,設(shè)置不好,容易出錯(cuò),所以每次建立菜單,都需謹(jǐn)慎設(shè)置,記住每個(gè)菜單對應(yīng)的參數(shù)。3.文件打開與保存,對于我們繪制出一幅圖片,那么我們就要把它保存下來。如果我們無法保存,我們做了也就沒沒什么意義了。對于圖形的保存于打開,我們還存在很多問題,自定義保存不同文件夾下尚未解決,所以還需要我們進(jìn)一步的學(xué)習(xí)和了解,爭取實(shí)現(xiàn)我們心里多希望的。4.在編程時(shí)遇到了圖像在變換大小時(shí),原來的圖形會消失,后來通過老師的講
50、解,及查看相關(guān)資料,這里涉及的一個(gè)重繪問題。經(jīng)過多次修改,添加代碼,才得以解決。所以我覺得學(xué)習(xí)VC+就要拿出那種堅(jiān)持不懈的精神,做什么也是,只有你不放棄對它了解,才會實(shí)現(xiàn)我們自己想要的,這就要我們要不斷的學(xué)習(xí)VC+,從中學(xué)習(xí)更多我們沒了解到的知識。5對于CView視圖,經(jīng)過查詢主要是負(fù)責(zé)內(nèi)存數(shù)據(jù)與用戶的交互。包括數(shù)據(jù)的顯示、用戶操作的響應(yīng)(如菜單的選取、鼠標(biāo)的響應(yīng))。最重要的是OnDraw(重畫窗口),通常用CWnd:Invalidate()來啟動它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。最后通過學(xué)習(xí)VC+,從中受益匪淺,更多的知識,還有待于我們?nèi)ネ诰驅(qū)崿F(xiàn)更多有趣的東西
51、,同樣它也是一個(gè)很強(qiáng)大的軟件。參考文獻(xiàn)【1】VC+深入詳解 孫鑫 余安萍 編著 電子工業(yè)出版社出版【2】VC+程序設(shè)計(jì)基礎(chǔ)教程 譚浩強(qiáng) 主編 宋金珂 高麗華 張迎新 編著 清華大學(xué)出版社出版附錄:簡易畫圖板主要程序代碼/ GraphicView.cpp : implementation of the CGraphicView class#include stdafx.h#include Graphic.h#include GraphicDoc.h#include GraphicView.h#include SettingDlg.h#ifdef _DEBUG#define new DEBUG_N
52、EW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CGraphicViewIMPLEMENT_DYNCREATE(CGraphicView, CView)BEGIN_MESSAGE_MAP(CGraphicView, CView)/AFX_MSG_MAP(CGraphicView)ON_COMMAND(IDM_DOT, OnDot)ON_COMMAND(IDM_LINE, OnLine)ON_COMMAND(IDM_RECTANGLE, OnRectangle)ON_COMMAND(IDM_ELLIPSE, OnEllipse)ON_COMMAND(IDM_SHANXING, OnShanxing)ON_COMMAND(IDM_LIANXUXIAN, OnLianxuxian)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_COMMAND(IDM_SETTING, OnSetting)ON_COMMAND(IDM_COLOR, OnColor)ON_COMMAND(IDM_JDHS, OnJdhs)ON_COMMAND(IDM_WTHS, OnWths)ON_CO
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國油壓鉆床行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年中國橡膠邊紙盆行業(yè)市場調(diào)查、投資前景及策略咨詢報(bào)告
- 2025年中國整燙設(shè)備配件行業(yè)市場調(diào)查、投資前景及策略咨詢報(bào)告
- 2025年中國扣式電池專用NI(OH)2行業(yè)市場調(diào)查、投資前景及策略咨詢報(bào)告
- 完善中小學(xué)教育管理制度
- 三公司職工食堂管理制度
- 公司消防隊(duì)庫室管理制度
- 幼兒園教學(xué)常規(guī)管理制度
- 施工項(xiàng)目設(shè)備管理制度
- 安全員大型設(shè)備管理制度
- 青島海明城市發(fā)展有限公司及全資子公司招聘筆試真題2022
- 浙江省杭州市2024屆數(shù)學(xué)四下期末考試試題含解析
- 北京市首都師范大學(xué)附屬回龍觀育新學(xué)校2025屆數(shù)學(xué)高一下期末統(tǒng)考試題含解析
- 2024年高考物理熱點(diǎn)磁場中的旋轉(zhuǎn)圓、放縮圓、平移圓、磁聚焦模型(學(xué)生版)
- 三年級下冊語文單元字詞專項(xiàng)練習(xí)-第1單元
- 鳥巢建筑分析
- 聯(lián)合體施工組織設(shè)計(jì)審批流程
- 中華民族共同體概論課件專家版10第十講 中外會通與中華民族鞏固壯大(明朝時(shí)期)
- 2021年10月自考02326操作系統(tǒng)試題及答案含解析
- 中華民族共同體概論課件專家版5第五講 大一統(tǒng)與中華民族共同體初步形成(秦漢時(shí)期)
- MOOC 大數(shù)據(jù)與法律檢索-湖南師范大學(xué) 中國大學(xué)慕課答案
評論
0/150
提交評論