基于VC++MFC程序設(shè)計簡易畫圖板_第1頁
基于VC++MFC程序設(shè)計簡易畫圖板_第2頁
基于VC++MFC程序設(shè)計簡易畫圖板_第3頁
基于VC++MFC程序設(shè)計簡易畫圖板_第4頁
基于VC++MFC程序設(shè)計簡易畫圖板_第5頁
已閱讀5頁,還剩25頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、-. z.*師*學(xué)院本 科 學(xué) 年 論 文論文題目:基于VC+MFC程序設(shè)計簡易畫圖板院系:信息科學(xué)與技術(shù)學(xué)院專業(yè):計算機科學(xué)與技術(shù)*:*:指導(dǎo)教師:撰寫學(xué)年: 2010至2011學(xué)年二零一零年十二月摘 要本軟件是利用VC+這個強大的可視化編程工具開發(fā)的,軟件主要功能包括圖形的繪制、線型的設(shè)置、顏色的設(shè)置,圖形文件的重繪和保存等功能。本文介紹了如何完成上述功能,同時詳細闡述了畫圖系統(tǒng)的實現(xiàn)過程以及對畫圖系統(tǒng)所做的功能擴大。在畫圖軟件設(shè)計上,其主要任務(wù)是:實現(xiàn)“繪制圖形、“圖形的保存兩項功能。本軟件具有實用性、穩(wěn)定性、易用性,和可維護性的特點,應(yīng)該說它應(yīng)是一個開放性的軟件,用戶可以根據(jù)需要對其功

2、能進展擴大、完善與修改,使其符合自己的要求??傊拒浖且粋€逐步完善的軟件。關(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 paper introduced

3、how to acplish these functions, and e*plains in detail drawing system realization process and to drawing system do function e*pansion. In drawing software design, its main task is to achieve drawings, graphic save two functions. This software has practicability, stability, ease-of-use, and maintaina

4、bility characteristic, should say it should be an open software, the user can according to the needs of its functions were e*pansion, perfect and modification, make them ply with their requirements. Anyhow, this software is a perfect gradually software.Keywords:Vc + +; MFC; drawing-. z.目錄TOC o 1-3 h

5、 z uHYPERLINK l _Toc281322859引言 PAGEREF _Toc281322859 h 1HYPERLINK l _Toc281322860第1章vc+6.0和MFC簡介 PAGEREF _Toc281322860 h 2HYPERLINK l _Toc2813228611.1vc+6.0簡介 PAGEREF _Toc281322861 h 2HYPERLINK l _Toc2813228621.2MFC簡介 PAGEREF _Toc281322862 h 2HYPERLINK l _Toc281322863第2章根底知識 PAGEREF _Toc281322863 h

6、 2HYPERLINK l _Toc2813228642.1工程的新建 PAGEREF _Toc281322864 h 3HYPERLINK l _Toc2813228652.2單文檔簡介 PAGEREF _Toc281322865 h 4HYPERLINK l _Toc2813228662.3添加消息響應(yīng)函數(shù) PAGEREF _Toc281322866 h 5HYPERLINK l _Toc2813228672.4資源 PAGEREF _Toc281322867 h 5HYPERLINK l _Toc2813228682.5設(shè)備環(huán)境 PAGEREF _Toc281322868 h 6HYPE

7、RLINK l _Toc281322869第3章簡易畫圖板的制作 PAGEREF _Toc281322869 h 6HYPERLINK l _Toc2813228703.1設(shè)計目的 PAGEREF _Toc281322870 h 6HYPERLINK l _Toc2813228713.2 總體設(shè)計 PAGEREF _Toc281322871 h 7HYPERLINK l _Toc2813228723.3詳細設(shè)計 PAGEREF _Toc281322872 h 7HYPERLINK l _Toc281322873點、直線、矩形、橢圓的繪制 PAGEREF _Toc281322873 h 9HYP

8、ERLINK l _Toc281322874連續(xù)線和扇形的繪制 PAGEREF _Toc281322874 h 11HYPERLINK l _Toc281322875畫刷 PAGEREF _Toc281322875 h 13HYPERLINK l _Toc281322876設(shè)置對話框 PAGEREF _Toc281322876 h 15HYPERLINK l _Toc281322877顏色 PAGEREF _Toc281322877 h 16HYPERLINK l _Toc281322878翻開與保存 PAGEREF _Toc281322878 h 17HYPERLINK l _Toc2813

9、22879第4章結(jié)果及結(jié)論 PAGEREF _Toc281322879 h 17HYPERLINK l _Toc2813228804.1運行結(jié)果 PAGEREF _Toc281322880 h 17HYPERLINK l _Toc2813228814.2結(jié)論 PAGEREF _Toc281322881 h 18HYPERLINK l _Toc281322882參考文獻 PAGEREF _Toc281322882 h 20HYPERLINK l _Toc281322883附錄:簡易畫圖板主要程序代碼 PAGEREF _Toc281322883 h 21HYPERLINK l _Toc281322

10、884致謝 PAGEREF _Toc281322884 h 31-. z.引 言計算機技術(shù)的開展,使人類社會進入了信息化和自動化,計算機智能識別也隨著計算機的開展得到了迅速的開展。特別是圖形圖像的計算機處理技術(shù)更是有了前所未有的進步和應(yīng)用。計算機識別也逐漸的從圖形圖像處理的大環(huán)境下別離出來作為一門新的高科技研究領(lǐng)域出現(xiàn)。畫圖涉及到的學(xué)科很多,包括數(shù)字信號處理、工程數(shù)學(xué)、信息論、運籌學(xué)等,它與計算機、自動化、生物學(xué)、視覺心理和生理學(xué)、人工智能、智能信息處理等眾多領(lǐng)域穿插、綜合集成,有廣泛的應(yīng)用。該軟件功能與Windows下附件中的畫圖軟件有相似功能。本程序是在VC6.0平臺上用MFC所編。繪制方

11、面的功能主要包括繪制各種圖元,包括直線、矩形、橢圓、扇形、連續(xù)線,用筆或畫刷自由繪圖。繪圖時可以選擇各種顏色,各種線型和線寬。軟件支持保存和讀取wmf格式的圖形。該軟件設(shè)計的設(shè)計思想是面向?qū)ο蟪绦蛟O(shè)計的思想。面向?qū)ο蠹夹g(shù)是一個非常實用而強有力的軟件開發(fā)方法。它具有許多特色。一是方法的唯一性,即方法是對軟件開發(fā)過程所有階段進展綜合考慮而得到的。二是從生存期的一個階段到下一個階段的高度連續(xù)性,即在一個階段所用到的局部與在下一個階段所使用的局部是銜接的,所使用的技術(shù)經(jīng)過生存期每一階段后不改變。三是把面向?qū)ο蠓治鯫OA、面向?qū)ο笤O(shè)計OOD和面向?qū)ο蟪绦蛟O(shè)計OOP集成到生存期的相應(yīng)階段。該軟件是Wind

12、ows下附件中的畫圖軟件的輔助工具。他可以幫我們完成繪制wmf格式的圖形,填充了畫圖程序不能完成wmf格式圖形的空缺。由于筆者所學(xué)知識有限,在繪圖功能上有許多方面不能滿足用戶需求。希望讀者提出珍貴的意見和建議。第1章vc+6.0和MFC簡介vc+6.0簡介VC+6.0是Microsoft公司推出的一個基于Windows系統(tǒng)平臺、可視化的集成開發(fā)環(huán)境,它的源程序按C+語言的要求編寫,并參加了微軟提供的功能強大的MFC(Microsoft Foundation Class)類庫。MFC中封裝了大局部Windows API函數(shù)和Windows控件,它包含的功能涉及到整個Windows操作系統(tǒng)。MFC

13、不僅給用戶提供了Windows圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)立應(yīng)用程序的組件,這樣,開發(fā)人員不必從頭設(shè)計創(chuàng)立和管理一個標準Windows應(yīng)用程序所需的程序,而是從一個比擬高的起點編程,故節(jié)省了大量的時間。另外,它提供了大量的代碼,指導(dǎo)用戶編程時實現(xiàn)*些技術(shù)和功能。因此,使用VC+提供的高度可視化的應(yīng)用程序開發(fā)工具和MFC類庫,可使應(yīng)用程序開發(fā)變得簡單。MFC簡介MFC(Microsoft Foundation Classes),是一個微軟公司提供的類庫class libraries,以C+類的形式封裝了Windows的API,它包含了窗口等許多類的定義。各種類的集合構(gòu)成了一個應(yīng)運程序

14、的框架構(gòu)造,以減少應(yīng)用程序開發(fā)人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內(nèi)建控件和組件的封裝類。MFC 6.0版本封裝了大約200個類,其中的一些可以被用戶直接使用。例如CWnd類封裝了窗口的功能,包括打印文本、繪制圖形及跟蹤鼠標指針的移動等;CsplitterWnd類是從CWnd類派生出來的,繼承了基類或稱父類CWnd類的所有特性,但增加了自己的功能,實現(xiàn)拆分窗口,使窗口至少可被拆分成兩個窗口,用戶可以移動兩個窗口之間的邊框來改變窗口的大小;CtoolBar類可以定義工具欄等。MFC命名的慣例是類的名字通常是由“C打頭;成員變量使用前綴“m_,接著使用一

15、個字母來指明數(shù)據(jù)類型,然后是變量的名稱;所有的單詞用大寫字母開頭。第2章 根底知識2.1工程的新建翻開Microsoft Visual C+ 6.0 點擊File New 在Projects中選擇 MFC AppWizard (e*e) ; 在 Project name中輸入工程的名字Graphic,在 Location中選擇工程存放的路徑。填完后點擊OK按鈕。(如圖1)填完后點擊OK按鈕,彈出對話框(如圖2)。在彈出來的對話框中我們可以選擇生成三種不同類型的應(yīng)用程序:單文檔、多文檔、對話框。 單文檔程序如記事本,在一個應(yīng)用程序中只能對一個文檔進展操作,降低了編程的復(fù)雜度并減少了運行程序時所需

16、的資源。對*些小型應(yīng)用比方文本編輯器或小型圖像編輯器可以采用這種類型的窗口應(yīng)用程序。 多文檔程序如PhotoShop,在一個應(yīng)用程序中可以同時對多個文檔進展操作; 對話框程序如QQ,應(yīng)用程序的界面是對話框形式的?,F(xiàn)對話框版本的程序更小一些。除了節(jié)省資源外,對話框版本的應(yīng)用程序的加載速度也更快些?;趯υ捒虻膽?yīng)用程序比完成一樣功能的基于窗口的應(yīng)用程序更簡單有效。 這里我們選第一個:單文檔。 選擇完后點擊Ne*t,設(shè)置默認,最后點擊Finish完成工程的創(chuàng)立。圖1圖22.2單文檔簡介生成單文檔程序后,進展編譯,在運行,我們可以看到以下的結(jié)果。如圖3 圖3在ClassView中,我們可以看到系統(tǒng)自動

17、為我們生成了五個類:CApp , CDoc , CView , CAboutDlg , CMainFrame。 如圖4圖4CApp相當于C語言中的main()函數(shù)。是程序的起始。 CDoc是用于處理程序中文檔的類。 CView主要是處理客戶區(qū)的可視化的操作的類。 CAboutDlg是處理關(guān)于對話框的類。 CMainFrame是非客戶區(qū)的一些資源的類。 我們主要是對CView 類進展操作。2.3添加消息響應(yīng)函數(shù) 系統(tǒng)為我們生成了一個程序的框架,但是這個框架完成不了什么具體的功能。為了使程序程序完成我們想要做的事,我們要向這個框架中參加一些代碼。 VC+程序的運行并不像C語言是按照順序運行下來的。

18、每當我們完成一個事件,系統(tǒng)就會發(fā)出特定的消息,程序就會跳到相應(yīng)的消息響應(yīng)函數(shù)中執(zhí)行里面的代碼。單擊菜單中的View-Class Wizard或按快捷鍵Ctrl+W,將會彈出MFC Class Wizard對話框。在Class Name中選擇CView,在Messages中選擇WM_LBUTTONDBLCLK,點擊右邊的Add Function按鍵。這樣我們就為程序添加了鼠標左鍵雙擊的消息響應(yīng)函數(shù),函數(shù)名為OnLButtonDblClk(UINT nFlags, CPoint point)。我們點擊Edit Code按鍵就可以進入消息響應(yīng)函數(shù)中。 我們在消息響應(yīng)函數(shù)中添加如下代碼: Af*Mes

19、sageBo*(“Hello Word!); 運行程序!當我們在客戶區(qū)中雙擊鼠標左鍵時,我們可以看到效果如圖5。 我們在完成雙擊鼠標左鍵這個事件后,Windows便會發(fā)出WM_LBUTTONDBLCLK這條消息。我們的程序收到這個消息后,就會跳轉(zhuǎn)到鼠標左鍵雙擊的消息響應(yīng)函數(shù)內(nèi),執(zhí)行里面的代碼。 同樣的,我們可以添加其他的消息響應(yīng)函數(shù),如鼠標左鍵按下,抬起,鼠標移動等(WM_LBUTTONUP、WM_LBUTTONDOWN、WM_MOUSEMOVE等)。我們程序就是在這樣的消息響應(yīng)機制下運行的。 圖52.4資源在ResoureView 里,我們可以編輯對話框、菜單、工具條、快捷鍵等資源。 點開M

20、enu,可以看到一個ID為IDR_MAINFRAME的菜單。ID是一個標識,實際上是一個無符號整型常量,每一個資源在程序中都有一個唯一的ID號。雙擊IDR_MAINFRAME,在右邊的視圖中雙擊幫助右邊的虛線框,彈出菜單屬性,在Caption中輸入“畫圖,并將其關(guān)閉。雙擊畫圖菜單下面出現(xiàn)虛線框,在caption中輸入“畫線后將其關(guān)閉。雙擊畫線,在彈出的菜單屬性中ID欄的ID_MENUITEM32775改成ID_MENUITEM_LINE。同樣方法在建一個“畫圓菜單項。注意:每個資源對應(yīng)一個ID號,ID號的命名全部用大寫字母,且要符合匈牙利命名法。我們?yōu)樾碌牟藛雾椘鹈?,如果我們選擇了Pop-up

21、,生成的菜單就還有下級子菜單;如果沒有選擇,菜單就沒有下級菜單。我們同樣可以在Class Wizard 中為我們生成的菜單添加響應(yīng)。 在Class Wizard 中的Object IDs中選中菜單的ID號,Messages中選擇MOND,然后點擊Add Function。這樣,我們就為新建的菜單添加了點擊的響應(yīng),我們同樣可以點擊Edit Code 編輯消息響應(yīng)函數(shù)。 2.5設(shè)備環(huán)境 CDC是設(shè)備環(huán)境類的基類直接由CObject派生。是GDI的關(guān)鍵元素,它代表了物理設(shè)備。每一個C+設(shè)備環(huán)境對象都有相對應(yīng)Windows設(shè)備環(huán)境,并通過一個32位類型的HDC句柄來標識。CDC類的虛擬性使我們可以很容

22、易的做到編寫同時適用于多種設(shè)備的代碼。使用CDC類可以使我們的作圖不用關(guān)心設(shè)備的問題。 CClientDC和CWindowDC是顯示設(shè)備環(huán)境類,都是由CDC派生而來,區(qū)別在于CClientDC是窗口的客戶區(qū)不包括邊框、標題欄和菜單欄,0,0指客戶區(qū)域的左上角。CWindowDC的0,0指整個屏幕的左上角,這意味著我們可以在顯示器的任意地方繪圖,包括窗口邊框、標題欄和菜單欄等等。CWindowDC一般應(yīng)用在框架窗口,而不是視圖窗口。 CDC對象被創(chuàng)立后一定要在適宜的時候?qū)⑺鼊h除掉,如果忘記了刪除設(shè)備環(huán)境對象則會造成內(nèi)存喪失。在每次繪圖前,我們要獲取設(shè)備環(huán)境,我們可以使用CDC* GetDC (

23、) 函數(shù)來獲取設(shè)備環(huán)境。在繪圖完成后,使用void ReleaseDC(CDC* pDC ) 函數(shù)釋放設(shè)備環(huán)境。第3章 簡易畫圖板的制作3.1設(shè)計目的設(shè)計一個單文檔類型的MFC AppWizard (e*e)工程,工程取名為:Graphic。此程序?qū)崿F(xiàn)簡單的繪圖功能,包括點、直線、矩形、橢圓、扇形和連續(xù)線的繪制。并且能實現(xiàn)繪圖的控制,包括線寬、線型和顏色的設(shè)置,圖形的保存和翻開以及筆刷的使用。3.2 總體設(shè)計設(shè)計圖如圖6簡易畫圖板文件繪圖筆刷翻開保存點直線矩形橢圓扇形連續(xù)線設(shè)置顏色簡單筆刷位圖筆刷透明筆刷線寬線型圖63.3詳細設(shè)計首先,新建一個單文檔類型的MFC AppWizard (e*e

24、)工程,工程取名為:Graphic。為此程序添加一個子菜單,菜單名稱為“繪圖,并為其添加六個菜單項,分別用來控制不同圖形的繪制。當用戶選擇其中的一個菜單項后,程序?qū)凑债斍暗倪x擇進展相應(yīng)圖形的繪制。添加的六個菜單項的ID及名稱如表1所示。然后分別為這六個菜單項添加命令響應(yīng),本程序讓視類(CGraphicView)對這些菜單命令進展響應(yīng),這六個響應(yīng)函數(shù)的名稱分別如表1所示。表1添加的菜單項菜單項ID菜單項名稱菜單項命令響應(yīng)函數(shù)IDM_DOT點OnDotIDM_LINE直線OnLineIDM-RECTANGLE矩形OnRectangleIDM_ELLIPSE橢圓OnEllipseIDM_SHAN*

25、ING扇形OnShan*ingIDM_LIAN*U*IAN連續(xù)線OnLian*u*ian在程序運行以后,當用戶單擊*個菜單項時,應(yīng)該把用戶的選擇保存起來,以便隨后的繪圖操作使用。因此在CGraphicView類中添加一個私有變量m_nDrawType;用來保存用戶的選擇,該變量的定義如下所述:private:UINT m_nDrawType;接著,在視類的構(gòu)造函數(shù)中將此變量初始化為0,程序代碼如下:CGraphicView:CGraphicView()/ TODO: add construction code here m_nDrawType=0;利用switch/case語句,來分別完成相應(yīng)

26、圖形的繪制。當用戶選擇【繪圖】菜單下的不同子菜單項時,將變量m_nDrawType設(shè)置為不同的值。程序代碼如下:void CGraphicView:OnDot() / TODO: Add your mand handler code herem_nDrawType=1;void CGraphicView:OnLine() / TODO: Add your mand handler code herem_nDrawType=2;void CGraphicView:OnRectangle() / TODO: Add your mand handler code herem_nDrawType=3;

27、void CGraphicView:OnEllipse() / TODO: Add your mand handler code herem_nDrawType=4;void CGraphicView:OnShan*ing() / TODO: Add your mand handler code herem_nDrawType=5;void CGraphicView:OnLian*u*ian() / TODO: Add your mand handler code herem_nDrawType=6;3.3.1點、直線、矩形、橢圓的繪制對于直線、矩形和橢圓,在繪制時都可有兩點來確定其圖形。當鼠

28、標左擊時得到一個點,當鼠標左鍵松開時得到另外一個點。為視類CGraphicView分別捕獲鼠標左鍵按下和彈起這兩個消息。另外當鼠標左鍵按下時,需要將鼠標當前按下點保存,因此我們?yōu)镃GraphicView再增加一個CPoint類型的私有成員變量:m_ptOrigin,在視類的構(gòu)造函數(shù)中將此變量初始化為0。在鼠標按下消息響應(yīng)函數(shù)中,保存該點,代碼如下:void CGraphicView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_pt

29、Origin=point; /保存鼠標按下得到點,也是繪制一個點CView:OnLButtonDown(nFlags, point);在鼠標左鍵彈起消息響應(yīng)函數(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.SetPi*el(point,RGB255,0,0); /*繪

30、制點*/break;case 2: /*繪制直線*/dc.MoveTo(m_ptOrigin);/*調(diào)用MoveTo函數(shù)移動到原點*/dc.LineTo(point);/*調(diào)用LineTo函數(shù)繪制到終點。*/break;case 3: /*繪制矩形*/ dc.Rectangle(CRect(m_ptOrigin,point);break;case 4: /*繪制橢圓*/dc.Ellipse(CRect(m_ptOrigin,point);break;CView:OnLButtonUp(nFlags, point);在上述程序中,設(shè)置一個點,用到的函數(shù)是SetPi*el,這也是CDC類的一個成員

31、方法,該函數(shù)的生命形式如下:COLORREF SetPi*el POINT point,COLORREF crColor;該函數(shù)是在指定的點設(shè)置一個像素。其中第一個參數(shù)point是指定的點,第二個參數(shù)crColor是指定的顏色。在程序中設(shè)定的顏色在系統(tǒng)顏色表中可能不存在,但系統(tǒng)會選擇一種和這個顏色最接近的顏色。RGB是一個宏,它有三個參數(shù),分別代表紅、綠、藍三種顏色的值。這三個參數(shù)BYTE類型,取值*圍為0255。RGB0,0,0是黑色,RGB255,255,255是白色,將這三個分量設(shè)置成為0255之間的任意值,從而得到各種不同的顏色。這里的RGB255,0,0是紅色。繪制直線時,首先調(diào)用M

32、oveTo函數(shù)移動到原點,然后調(diào)用LineTo函數(shù)繪制到終點。繪制矩形時使用Rectangle函數(shù),該函數(shù)聲明形式為:BOOL Rectangle LPCRECT lpRect;該函數(shù)有一個指向Crect對象的參數(shù),后者可以利用兩個點來構(gòu)造。需要注意的是該函數(shù)需要的是指向Crect對象的指針,而上述代碼中傳遞的卻是Crect對象,但運行編譯時也能成功通過,運行時也不會報錯,這是為什么呢?我們知道C系列的語言都是強類型語言,如果類型不匹配的話,需要進展強制類型轉(zhuǎn)換。但這里為什么沒有進展這樣的強制類型轉(zhuǎn)換程序也可以通過呢?實際上,Crect類提供了這樣一個成員函數(shù):重載LPCRECT操作符,其作用

33、是將Crect轉(zhuǎn)換為LPCRECT類型。因此,當在程序中給Rectangle函數(shù)的參數(shù)賦值時,如果它發(fā)現(xiàn)該參數(shù)是一個Crect對象,它就會隱式地調(diào)用LPCRECT操作符,將Crect類型的對象轉(zhuǎn)換為LPRECT類型。因此,在給函數(shù)傳遞參數(shù)時,如果我們看到的傳遞的數(shù)值類型和所需要的類型不匹配,但編譯和運行都正確的情況時,就要想想這其中的緣由了。當然,有的情況下可能是這些類型之間本來就可以互相轉(zhuǎn)換,例如short類型和int類型。但是參數(shù)是對象類的話,就要考慮了,它選擇的對象的構(gòu)造方法進展的隱式轉(zhuǎn)換,還是有其他重載的操作符。當用戶選擇橢圓菜單項時,調(diào)用Ellipes函數(shù)繪制一個橢圓。3.3.2連續(xù)

34、線和扇形的繪制Windows系統(tǒng)為我們提供了一個畫圖程序,在該程序中,利用畫筆可以繪制連續(xù)的線條,下面我們設(shè)計繪制連續(xù)線和扇形。為了繪制連續(xù)的線條,首先要得到線條的起點,這在前面已經(jīng)實現(xiàn)。然后需要捕獲鼠標移動過程中的每一個點,這可以通過捕獲鼠標移動消息WM_MOUSEMOVE來實現(xiàn)。在此消息響應(yīng)函數(shù)中,在依次捕獲的各個點之間繪制一條條非常短的線段,從而就可以繪制出一條連續(xù)的線條。遵照這一思路,我們開場增加程序的功能。首先為視類增加鼠標移動消息WM_MOUSEMOVE的響應(yīng)函數(shù)OnMouseMove。這樣,只要鼠標在應(yīng)用程序窗口中移動時都會進入到這個消息響應(yīng)函數(shù)中。但這并不是我們所期望的,我們希

35、望在鼠標左鍵按下后開場繪圖。因此,我們需要有一個變量來表示鼠標左鍵是否按下這一狀態(tài),然后在鼠標移動消息響應(yīng)函數(shù)中對這一變量進展判斷。當此變量為真,即鼠標左鍵已經(jīng)按下去,我們開場繪圖。于是,為視類添加一個BOOL型的私有變量m_bDraw,當鼠標左鍵按下去時,此變量為真;當鼠標左鍵彈起時,此變量為假,這時,我們就不再繪制線條了。該變量在視類頭文件中的定義代碼如下:Private: BOOL m_bDraw;接下來在視類的構(gòu)造函數(shù)中,將此變量初始化為FALSE。m_bdraw=FALSE;當鼠標左鍵按下去時,在視類的OnLButtonDown函數(shù)中將此變量初始化為TRUE。m_bdraw=TRUE

36、;當鼠標左鍵彈起時,在視類的OnLButton函數(shù)中將此變量初始化為假。m_bdraw=FALSE;然后在OnMouseMove函數(shù)中首先對m_bdraw變量進展判斷,如果其值為真,說明鼠標左鍵已經(jīng)按下去了,這時就可開場進展畫線操作。還有一點需要注意,因為每繪制一條線段后,下次應(yīng)該從這條線段的終點開場繼續(xù)繪制。因此,繪制完當前線段后,應(yīng)該修改線段的起點,將當前線段的終點作為下一條線段的起點,程序代碼如下:void CGraphicView:OnMouseMove(UINT nFlags, CPoint point) /TODO: Add your message handler code he

37、re and/or call default/創(chuàng)立并獲得設(shè)備描述 CClientDC dc(this);/創(chuàng)立寬度為1的實線紅色畫筆CPen pen (PS_SOLID, 1, RGB255,0,0);/把創(chuàng)立的畫筆選入設(shè)備描述 CPen *pOldpen=dc.SelectObject(&pen);if(m_bDraw=true)dc.MoveTo(m_ptOrigin); dc.LineTo(point);/修改線段的起點 m_ptOrigin=point;/恢復(fù)設(shè)備描述dc.SelectObject(pOldpen); CView:OnMouseMove(nFlags, point);如

38、果在上面繪制連續(xù)線條的程序中,保持每段小直線的起點不變,即以鼠標左鍵按下時的起點為起點不變,分別繪制到鼠標移動點的直線,這時就會出現(xiàn)扇形的效果。也就是去掉上述代碼OnMouseMove函數(shù)中修改線段起點的代碼。程序代碼如下: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的實線紅色畫筆CPen pen (PS_SOLID, 1, RGB

39、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畫刷再為此程序添加一個子菜單,菜單名稱為“畫刷,并為其添加三個菜單項,分別用來控制不同的畫刷。MFC提供了一個CBrush類,可以用來創(chuàng)立畫刷對象。畫刷通常用來填充一塊區(qū)域。簡單畫刷、位圖畫刷、透明畫刷,程序代碼如下:void

40、CDrawView:OnLButtonUp(UINT nFlags, CPoint point) /創(chuàng)立一個紅色畫刷CBrush brush(RGB(255,0,0);/創(chuàng)立并獲得設(shè)備描述表CClientDC dc(this);/利用紅色畫刷填充鼠標拖曳過程中形成的矩形區(qū)域dc.FillRect(CRect(m_ptOrigin,point),&brush);/創(chuàng)立位圖對象CBitmap bitmap;/加載位圖資源bitmap.LoadBitmap(IDB_BITMAP1);/創(chuàng)立位圖畫刷CBrush brush(&bitmap);/創(chuàng)立并獲得設(shè)備描述表CClientDC dc(this);

41、/利用紅色畫刷填充鼠標拖曳過程中形成的矩形區(qū)域dc.FillRect(CRect(m_ptOrigin,point),&brush);/創(chuàng)立并獲得設(shè)備描述表CClientDC dc(this);/創(chuàng)立一個空畫刷CBrush *pBrush = CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);/將空畫刷選入設(shè)備描述表CBrush *pOldBrush = dc.SelectObject(pBrush);/繪制一個矩形dc.Rectangle(CRect(m_ptOrigin,point);/恢復(fù)先前的畫刷dc.SelectObject(pO

42、ldBrush);m_bDraw = FALSE;CView:OnLButtonUp(nFlags, point);在簡單畫刷程序中,首先創(chuàng)立一個紅色畫刷;接著創(chuàng)立設(shè)備描述表對象;然后調(diào)用設(shè)備描述表對象的成員函數(shù)FillRect,利用指定的畫刷填充一塊指定的矩形區(qū)域,而鼠標拖動過程中的起點和終點就決定了需要填充的矩形區(qū)域,因此,代碼中通過CRect類利用鼠標拖動的起點和終點構(gòu)造了這快矩形區(qū)域。CRect類提供了多個構(gòu)造函數(shù),這里使用的是下面這種構(gòu)造函數(shù),即通過指定矩形區(qū)域的左上角和右下角這兩個點來構(gòu)造一塊矩形區(qū)域。CRectPOINT topLeft,POINT bottomRight;代碼中

43、的CDC類的成員函數(shù)FillRect,該函數(shù)的功能是用指定的畫刷填充一個矩形。該函數(shù)將填充全部的矩形,包括上左邊界,但不填充右底邊界。FillRect函數(shù)的聲明如下:void FillRect LPCRECT lpRect,CBrush* pBrush;該函數(shù)有兩個參數(shù),lpRect是指向一個RECT構(gòu)造體或CRect對象的指針,該構(gòu)造體或?qū)ο笾邪艘畛涞木匦蔚倪壿嬜鴺?。pBrush是指向用于填充矩形的畫刷對象的指針。在位圖畫刷程序中,CBrush類有下面這樣一種構(gòu)造函數(shù)。CBrush CBitmap* pBitmap;該構(gòu)造函數(shù)要求一個CBitmap類型的指針,CBitmap類是位圖類,

44、于是我們就會這樣想:利用這個構(gòu)造函數(shù)是否就可以創(chuàng)立一個位圖畫刷呢?事實確實如此。創(chuàng)立CBitmap對象時,僅調(diào)用其構(gòu)造函數(shù)并不能得到一個有用的位圖對象,還需要調(diào)用一個初始化函數(shù)來初始化這個位圖對象。CBitmap類提供了多個初始化函數(shù),例如,LoadBitmap、CreateBitmap、BitmapIndirect等。這里用LoadBitmap函數(shù)來加載一副位圖,該函數(shù)的聲明如下:BOOL LoadBitmap LPCTSTR lpszResourceName;BOOL LoadBitmap UINT nIDResource;其中第二種聲明需要一個資源ID作為參數(shù)。首先給程序增加一個位圖資源

45、。為一個工程創(chuàng)立資源有多種實現(xiàn)方法,其中一種方法可以利用【Insert】菜單下的【Resource】命令,在彈出的對話框中選擇Bitmap資源類型,單擊【New】按鈕,即可創(chuàng)立一個默認名稱為IDB_BITMAP1的位圖資源,并在VC+集成開發(fā)環(huán)境右邊的代碼編輯區(qū)中翻開位圖編輯器??梢岳镁庉嬈饔疫叺恼{(diào)色板和繪圖工具來編輯位圖資源,還可以通過拉伸位圖編輯器中網(wǎng)格周圍的藍色方點來調(diào)整位圖的大小。在透明畫刷程序中,我們利用GetStockObject這個函數(shù)來獲取一個黑色或白色的畫刷句柄。這個函數(shù)是否能夠獲得一個透明畫刷句柄呢?從MSND提供的幫助信息中,可以看到該函數(shù)的參數(shù)取值之一可以是NULL_

46、BRUSH,以獲取一個空畫刷。則,這個空畫刷是否就是我們所需要的透明畫刷呢?結(jié)論是正確的。但這時存在一個問題,我們獲取的是句柄,而在進展繪制操作時需要的是一個畫刷對象。如何從畫刷句柄轉(zhuǎn)換為畫刷對象呢?CBrush類提供了一個FromHandle函數(shù)來實現(xiàn)這樣的功能。該函數(shù)的聲明如下:Static CDC* PASCAL FromHandleHDC hDC;3.3.4設(shè)置對話框為程序添加一個設(shè)置對話框,允許用戶指定畫筆的類型、線寬,并讓隨后的繪圖操作就使用用戶指定的新設(shè)置值來進展繪制。為了實現(xiàn)這一功能,首先需要為程序添加一個對話框資源,并按下表修改屬性。屬性值IDIDD_DLG_SETTINGC

47、aptionSettingFont宋體設(shè)置線型、線寬對話框的代碼如下:void CGraphicView:OnSetting() /TODO: Add your mand 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顏色顏色對話框看起來比擬復(fù)雜。實際上,MFC為我們提供了一個類:C

48、ColorDialog,可以很方便的創(chuàng)立這樣的一個顏色對話框。void CGraphicView:OnColor() / TODO: Add your mand 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:OnFileOpen() / TODO: Add your mand handler

49、 code hereHMETAFILE hmetaFile;hmetaFile=GetMetaFile(meta.wmf);m_dcMetaFile.PlayMetaFile(hmetaFile);DeleteMetaFile(hmetaFile);Invalidate();void CGraphicView:OnFileSave() / TODO: Add your mand handler code here HMETAFILE hmetaFile;hmetaFile=m_dcMetaFile.Close();CopyMetaFile(hmetaFile,meta.wmf);m_dcMet

50、aFile.Create();DeleteMetaFile(hmetaFile);第4章 結(jié)果及結(jié)論4.1運行結(jié)果運行結(jié)果如圖7、8、9圖7圖8圖94.2結(jié)論其實學(xué)任何一種語言都是一樣的。需要勤奮+毅力+運氣=成功,這是我認為的一個公式。這里毅力和勤奮是個人因素,而運氣這是先天的。如果以前沒有接觸過編程語言的話,在接觸VC前我建議你先學(xué)習(xí)一些根底語言,比方C等都是一些比擬好學(xué)的根底語言,我當初就是從C語言過度學(xué)VC的。學(xué)根底語言的目的是學(xué)習(xí)語法構(gòu)造和如何編寫概念,只有你理解和掌握了這些編程用的工具才能學(xué)習(xí)高級語言。這些根底語言中我建議大家學(xué)C語言,其實VC就是C+也就是C語言的兒子,父親學(xué)習(xí)起

51、來比擬容易上手,但遇到類似WINDOWS的程序的時候比擬固執(zhí)不容易溝通,在這種條件下才有了兒子,兒子比擬開朗應(yīng)變能力強,但是就因為他這些優(yōu)點才使初學(xué)者難以掌握。 VC是C+語言,是一種面向?qū)ο蟮木幊陶Z言。他于根底語言不同點在于,根底語言是一條路走到底的中斷技術(shù)除外,而面向?qū)ο笫堑却愕闹噶畈磐伦?,是被動的編程語言。這點是學(xué)習(xí)VC前必須扭轉(zhuǎn)的概念。通過這次學(xué)年設(shè)計,我了解vc+是Windows平臺上的C+編程環(huán)境,學(xué)習(xí)VC要了解很多Windows平臺的特性并且還要掌握MFC、ATL、等的知識,難度比擬大。Windows下編程需要了解Windows的消息機制以及回調(diào)callback函數(shù)的原理;M

52、FC是Win32API的包裝類,需要理解文檔視圖類的構(gòu)造,窗口類的構(gòu)造,消息流向等等;是代碼共享的二進制標準,需要掌握其根本原理等等?;谖覀冞@次用VC+編寫了一個簡單的畫圖板,功能不是很多,但是從中的到不少收獲。主要有:1對工程和文檔的了解,我們在編寫程序時,要對不同的文件進展編寫。其中工程就是文件的集合,包括頭文件、源代碼文件、資源文件。文檔窗口也稱編輯窗口,是用戶進展輸入或編輯頭文件、源文件、資源的區(qū)域。在編輯文件時,為了增加程序的可讀性,系統(tǒng)用綠色顯示注釋語句,用藍色顯示關(guān)鍵字。2菜單:我們繪制畫圖板時,就要建立一個“繪圖菜單。對于“繪圖菜單下還有幾個子菜單項,通過建立菜單同時讓它實現(xiàn)

53、菜單上的命令,這就要我們對每個菜單項進展設(shè)置,諸如,ID、標題、快捷鍵、熱鍵等。還有一些屬性設(shè)置,設(shè)置不好,容易出錯,所以每次建立菜單,都需慎重設(shè)置,記住每個菜單對應(yīng)的參數(shù)。3.文件翻開與保存,對于我們繪制出一幅圖片,則我們就要把它保存下來。如果我們無法保存,我們做了也就沒沒什么意義了。對于圖形的保存于翻開,我們還存在很多問題,自定義保存不同文件夾下尚未解決,所以還需要我們進一步的學(xué)習(xí)和了解,爭取實現(xiàn)我們心里多希望的。4.在編程時遇到了圖像在變換大小時,原來的圖形會消失,后來通過教師的講解,及查看相關(guān)資料,這里涉及的一個重繪問題。經(jīng)過屢次修改,添加代碼,才得以解決。所以我覺得學(xué)習(xí)VC+就要拿出

54、那種堅持不懈的精神,做什么也是,只有你不放棄對它了解,才會實現(xiàn)我們自己想要的,這就要我們要不斷的學(xué)習(xí)VC+,從中學(xué)習(xí)更多我們沒了解到的知識。5對于CView視圖,經(jīng)過查詢主要是負責(zé)內(nèi)存數(shù)據(jù)與用戶的交互。包括數(shù)據(jù)的顯示、用戶操作的響應(yīng)如菜單的選取、鼠標的響應(yīng)。最重要的是OnDraw(重畫窗口),通常用CWnd:Invalidate()來啟動它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。最后通過學(xué)習(xí)VC+,從中受益匪淺,更多的知識,還有待于我們?nèi)ネ诰驅(qū)崿F(xiàn)更多有趣的東西,同樣它也是一個很強大的軟件。參考文獻【1】VC+深入詳解 孫鑫 余安萍 編著 電子工業(yè)出版【2】VC+程序設(shè)計

55、根底教程 譚浩強 主編 宋金珂 高麗華 *迎新 編著 清華大學(xué)出版附錄:簡易畫圖板主要程序代碼/ GraphicView.cpp : implementation of the CGraphicView class#include stdaf*.h#include Graphic.h#include GraphicDoc.h#include GraphicView.h#include SettingDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CGrap

56、hicViewIMPLEMENT_DYNCREATE(CGraphicView, CView)BEGIN_MESSAGE_MAP(CGraphicView, CView)/AF*_MSG_MAP(CGraphicView)ON_MAND(IDM_DOT, OnDot)ON_MAND(IDM_LINE, OnLine)ON_MAND(IDM_RECTANGLE, OnRectangle)ON_MAND(IDM_ELLIPSE, OnEllipse)ON_MAND(IDM_SHAN*ING, OnShan*ing)ON_MAND(IDM_LIAN*U*IAN, OnLian*u*ian)ON_WM

57、_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_MAND(IDM_SETTING, OnSetting)ON_MAND(IDM_COLOR, OnColor)ON_MAND(IDM_JDHS, OnJdhs)ON_MAND(IDM_WTHS, OnWths)ON_MAND(IDM_TMHS, OnTmhs)ON_MAND(ID_FILE_OPEN, OnFileOpen)ON_MAND(ID_FILE_SAVE, OnFileSave)/AF*_MSG_MAP/ Standard printing mandsON_MAND(ID_FILE_

58、PRINT, CView:OnFilePrint)ON_MAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint)ON_MAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()/ CGraphicView construction/destructionCGraphicView:CGraphicView()/ TODO: add construction code here m_nDrawType=0;m_ptOrigin=0;m_bDraw=false; m_nLineWidt

59、h=0;m_nLineStyle=0;m_clr=(255,0,0); m_dcMetaFile.Create();CGraphicView:CGraphicView()BOOL CGraphicView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: Modify the Window class or styles here by modifying/ the CREATESTRUCT csreturn CView:PreCreateWindow(cs);/ CGraphicView drawingvoid CGraphicView:OnDraw(CDC*

60、 pDC)CGraphicDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here HMETAFILE hmetaFile;hmetaFile=m_dcMetaFile.Close();pDC-PlayMetaFile(hmetaFile);m_dcMetaFile.Create();m_dcMetaFile.PlayMetaFile(hmetaFile);DeleteMetaFile(hmetaFile);/ CGraphicView printingBOOL CGraphi

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論