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

下載本文檔

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

文檔簡介

1、本文由劉張不格貢獻doc文檔可能在WAP端瀏覽體驗不佳。建議您優(yōu)先選擇TXT,或下載源文件到本機查看。包頭師范學(xué)院本科學(xué)年論文論文題目: C+MFC 程序設(shè)計簡易畫圖板程序設(shè)計簡易畫圖板論文題目:基于 VC+ 院專學(xué)姓系:信息科學(xué)與技術(shù)學(xué)院業(yè):計算機科學(xué)與技術(shù)號:名:指導(dǎo)教師:指導(dǎo)教師:撰寫學(xué)年:撰寫學(xué)年: 2010 至 2011 學(xué)年二零一零年十二月摘要本軟件是利用 VC+這個強大的可視化編程工具開發(fā)的,軟件主要功能包括圖形的繪制、線型的設(shè)置、顏色的設(shè)置,圖形文件的重繪和保存等功能。本文介紹了如何完成上述功能,同時詳細闡述了畫圖系統(tǒng)的實現(xiàn)過程以及對畫圖系統(tǒng)所做的功能擴充。在畫圖軟件設(shè)計上,其

2、主要任務(wù)是:實現(xiàn)“繪制圖形”、“圖形的保存”兩項功能。本軟件具有實用性、穩(wěn)定性、易用性,和可維護性的特點,應(yīng)該說它應(yīng)是一個開放性的軟件,用戶可以根據(jù)需要對其功能進行擴充、完善與修改,使其符合自己的要求??傊?本軟件是一個逐步完善的軟件。關(guān)鍵詞:VC+;MFC;繪圖AbstractThis software is using vc + + this powerful visual programming tool development, software main functions including graphics rendering, linetype Settings, color

3、setting, graphics file redraw of preserving and function. The paper 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", "

4、;graphic save" two functions. This software has practicability, stability, ease-of-use, 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 requir

5、ements. Anyhow, this software is a perfect gradually software.Key words:Vc + +; MFC; drawing目錄引言. 1 第 1 章 vc+6.0 和 MFC 簡介. 2 1.1 vc+6.0 簡介. 2 1.2 MFC 簡介. 2 第 2 章基礎(chǔ)知識. 2 2.1 工程的新建. 3 2.2 單文檔簡介 (42.3 添加消息響應(yīng)函數(shù) 5 2.4 資源 5 2.5 設(shè)備環(huán)境 6 第 3 章簡易畫圖板的制作 6引言計算機技術(shù)的發(fā)展,使人類社會進入了信息化和自動化,計算機智能識別也隨著計算機的發(fā)展得到了迅速的發(fā)展。特別是圖

6、形圖像的計算機處理技術(shù)更是有了前所未有的進步和應(yīng)用。計算機識別也逐漸的從圖形圖像處理的大環(huán)境下分離出來作為一門新的高科技研究領(lǐng)域出現(xiàn)。畫圖涉及到的學(xué)科很多,包括數(shù)字信號處理、工程數(shù)學(xué)、信息論、運籌學(xué)等,它與計算機、自動化、生物學(xué)、視覺心理和生理學(xué)、人工智能、智能信息處理等眾多領(lǐng)域交叉、綜合集成,有廣泛的應(yīng)用。該軟件功能與 Windows 下附件中的畫圖軟件有相似功能。本程序是在 VC6.0 平臺上用 MFC 所編。繪制方面的功能主要包括繪制各種圖元,包括直線、矩形、橢圓、扇形、連續(xù)線,用筆或畫刷自由繪圖。繪圖時可以選擇各種顏色,各種線型和線寬。軟件支持保存和讀取 wmf 格式的圖形。該軟件設(shè)計

7、的設(shè)計思想是面向?qū)ο蟪绦蛟O(shè)計的思想。面向?qū)ο蠹夹g(shù)是一個非常實用而強有力的軟件開發(fā)方法。它具有許多特色。一是方法的唯一性,即方法是對軟件開發(fā)過程所有階段進行綜合考慮而得到的。二是從生存期的一個階段到下一個階段的高度連續(xù)性,即在一個階段所用到的部分與在下一個階段所使用的部分是銜接的,所使用的技術(shù)經(jīng)過生存期每一階段后不改變。三是把面向?qū)ο蠓治?OOA、面向?qū)ο笤O(shè)計(OOD和面向?qū)ο蟪绦蛟O(shè)計(OOP集成到生存期的相應(yīng)階段。該軟件是 Windows 下附件中的畫圖軟件的輔助工具。他可以幫我們完成繪制 wmf 格式的圖形,填充了畫圖程序不能完成 wmf 格式圖形的空缺。由于筆者所學(xué)知識有限,在繪圖功能上有

8、許多方面不能滿足用戶需求。希望讀者提出寶貴的意見和建議。1第 1 章 vc+6.0 和 MFC 簡介1.1 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 不僅給用戶提供了 Windows 圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)建應(yīng)用程序的組件,這樣,開發(fā)

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

10、indows 句柄封裝類和很多 Windows 的內(nèi)建控件和組件的封裝類。 MFC 6.0 版本封裝了大約 200 個類,其中的一些可以被用戶直接使用。例如 CWnd 類封裝了窗口的功能,包括打印文本、繪制圖形及跟蹤鼠標指針的移動等; CsplitterWnd 類是從 CWnd 類派生出來的,繼承了基類或稱父類 CWnd 類的所有特性,但增加了自己的功能,實現(xiàn)拆分窗口,使窗口至少可被拆分成兩個窗口,用戶可以移動兩個窗口之間的邊框來改變窗口的大小;CtoolBar 類可以定義工具欄等。 MFC 命名的慣例是類的名字通常是由“C”打頭;成員變量使用前綴“m_”,接著使用一個字母來指明數(shù)據(jù)類型,然后

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

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

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

14、 程序的運行并不像 C 語言是按照順序運行下來的。每當(dāng)我們完成一個事件,系統(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 Co

15、de 按鍵就可以進入消息響應(yīng)函數(shù)中。我們在消息響應(yīng)函數(shù)中添加如下代碼: AfxMessageBox(“Hello Word!”; 運行程序!當(dāng)我們在客戶區(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

16、.4 資源在 ResoureView 里,我們可以編輯對話框、菜單、工具條、快捷鍵等資源。點5開 Menu,可以看到一個 ID 為 IDR_MAINFRAME 的菜單。ID 是一個標識,實際上是一個無符號整型常量,每一個資源在程序中都有一個唯一的 ID 號。雙擊 IDR_MAINFRAME,在右邊的視圖中雙擊幫助右邊的虛線框,彈出菜單屬性, Caption 在中輸入“畫圖”,并將其關(guān)閉。雙擊畫圖菜單下面出現(xiàn)虛線框,在 caption 中輸入“畫線”后將其關(guān)閉。雙擊畫線,在彈出的菜單屬性中 ID欄的 ID_MENUITEM32775 改成ID_MENUITEM_LINE。同樣方法在建一個“畫圓”

17、菜單項。注意:每個資源對應(yīng)一個 ID 號, ID 號的命名全部用大寫字母,且要符合匈牙利命名法。我們?yōu)樾碌牟藛雾椘鹈?如果我們選擇了 Pop-up,生成的菜單就還有下級子菜單;如果沒有選擇,菜單就沒有下級菜單。我們同樣可以在 Class Wizard 中為我們生成的菜單添加響應(yīng)。在 Class Wizard 中的Object IDs 中選中菜單的 ID 號,Messages 中選擇 COMMOND,然后點擊 Add Function。這樣,我們就為新建的菜單添加了點擊的響應(yīng),我們同樣可以點擊 Edit Code 編輯消息響應(yīng)函數(shù)。2.5 設(shè)備環(huán)境CDC 是設(shè)備環(huán)境類的基類直接由 CObject

18、 派生。是 GDI 的關(guān)鍵元素,它代表了物理設(shè)備。每一個 C+設(shè)備環(huán)境對象都有相對應(yīng) Windows 設(shè)備環(huán)境,并通過一個 32 位類型的 HDC 句柄來標識。CDC 類的虛擬性使我們可以很容易的做到編寫同時適用于多種設(shè)備的代碼。使用 CDC 類可以使我們的作圖不用關(guān)心設(shè)備的問題。CClientDC 和 CWindowDC 是顯示設(shè)備環(huán)境類,都是由 CDC 派生而來,區(qū)別在于 CClientDC 是窗口的客戶區(qū)不包括邊框、標題欄和菜單欄,(0,指客戶區(qū)域的左上角。 0 CWindowDC 的(0,0指整個屏幕的左上角,這意味著我們可以在顯示器的任意地方繪圖,包括窗口邊框、標題欄和菜單欄等等。C

19、WindowDC 一般應(yīng)用在框架窗口,而不是視圖窗口。 CDC 對象被創(chuàng)建后一定要在合適的時候?qū)⑺鼊h除掉,如果忘記了刪除設(shè)備環(huán)境對象則會造成內(nèi)存丟失。在每次繪圖前,我們要獲取設(shè)備環(huán)境,我們可以使用 CDC* GetDC ( 函數(shù)來獲取設(shè)備環(huán)境。在繪圖完成后,使用void ReleaseDC(CDC* pDC 函數(shù)釋放設(shè)備環(huán)境。第 3 章簡易畫圖板的制作3.1 設(shè)計目的設(shè)計一個單文檔類型的 MFC AppWizard (exe工程,工程取名為:Graphic。此程序?qū)崿F(xiàn)簡單的繪圖功能,包括點、直線、矩形、橢圓、扇形和連續(xù)線的繪制。6并且能實現(xiàn)繪圖的控制,包括線寬、線型和顏色的設(shè)置,圖形的保存和

20、打開以及筆刷的使用。3.2 總體設(shè)計設(shè)計圖如圖 6 簡易畫圖板文件繪圖筆刷打開點直線矩形簡單筆刷保存位圖筆刷透明筆刷橢圓扇形連續(xù)線線寬設(shè)置顏色線型圖63.3 詳細設(shè)計首先,新建一個單文檔類型的 MFC AppWizard (exe工程,工程取名為:Graphic。為此程序添加一個子菜單,菜單名稱為“繪圖”,并為其添加六個菜單項,分別用來控制不同圖形的繪制。當(dāng)用戶選擇其中的一個菜單項后,程序?qū)凑债?dāng)前的選擇進行相應(yīng)圖形的繪制。添加的六個菜單項的 ID 及名稱如表 1 所示。然后分別為這六個菜單項添加命令響應(yīng),本程序讓視類(CGraphicView對這些菜單命令進行響應(yīng),7這六個響應(yīng)函數(shù)的名稱分別

21、如表 1 所示。菜單項 ID IDM_DOT IDM_LINE IDM-RECTANGLE IDM_ELLIPSE IDM_SHANXING IDM_LIANXUXIAN 表 1 添加的菜單項菜單項名稱點直線矩形橢圓扇形連續(xù)線菜單項命令響應(yīng)函數(shù) OnDot OnLine OnRectangle OnEllipse OnShanxingOnLianxuxian在程序運行以后,當(dāng)用戶單擊某個菜單項時,應(yīng)該把用戶的選擇保存起來,以便隨后的繪圖操作使用。因此在 CGraphicView 類中添加一個私有變量 m_nDrawType; 用來保存用戶的選擇,該變量的定義如下所述: private: UIN

22、T m_nDrawType; 接著,在視類的構(gòu)造函數(shù)中將此變量初始化為 0,程序代碼如下: CGraphicView:CGraphicView( / TODO: add construction code here m_nDrawType=0; 利用 switch/case 語句,來分別完成相應(yīng)圖形的繪制。當(dāng)用戶選擇【繪圖】菜單下的不同子菜單項時,將變量 m_nDrawType 設(shè)置為不同的值。程序代碼如下: void CGraphicView:OnDot( / TODO: Add your command handler code here m_nDrawType=1; void CGrap

23、hicView:OnLine( / TODO: Add your command handler code here m_nDrawType=2; void CGraphicView:OnRectangle( / TODO: Add your command handler code here m_nDrawType=3;8 void CGraphicView:OnEllipse( / TODO: Add your command handler code here m_nDrawType=4; void CGraphicView:OnShanxing( / TODO: Add your co

24、mmand handler code here m_nDrawType=5; void CGraphicView:OnLianxuxian( / TODO: Add your command handler code here m_nDrawType=6; 對于直線、矩形和橢圓,在繪制時都可有兩點來確定其圖形。當(dāng)鼠標左擊時得到一個點,當(dāng)鼠標左鍵松開時得到另外一個點。為視類 CGraphicView 分別捕獲鼠標左鍵按下和彈起這兩個消息。另外當(dāng)鼠標左鍵按下時,需要將鼠標當(dāng)前按下點保存,因此我們?yōu)?CGraphicView 再增加一個 CPoint 類型的私有成員變量: m_ptOrigin,在視

25、類的構(gòu)造函數(shù)中將此變量初始化為0。在鼠標按下消息響應(yīng)函數(shù)中,保存該點,代碼如下:void CGraphicView:OnLButtonDown(UINT nFlags, CPoint point / TODO: Add your message handler code here and/or call default m_ptOrigin=point; 在鼠標左鍵彈起消息響應(yīng)函數(shù)中實現(xiàn)繪圖,代碼如下: void CGraphicView:OnLButtonUp(UINT nFlags, CPoint point /保存鼠標按下得到點,也是繪制一個點 CView:OnLButtonDown(n

26、Flags, point;9/ 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; /*繪制點*/ break; case 2: /*繪制直線*/ dc.MoveTo(m_ptOrigin;/*調(diào)用MoveTo 函數(shù)移動到原點*/ dc.LineTo(point;/*調(diào)用 LineTo 函數(shù)繪制到終點。*/ break; case 3: break

27、; case 4: break; CView:OnLButtonUp(nFlags, point; 在上述程序中,設(shè)置一個點,用到的函數(shù)是 SetPixel,這也是 CDC 類的一個成員方法,該函數(shù)的生命形式如下: COLORREF SetPixel (POINT point, COLORREF ;該函數(shù)是在指定的點設(shè)置一個像素。其中第一個參數(shù)(point是指定的 crColor點,第二個參數(shù)(crColor是指定的顏色。在程序中設(shè)定的顏色在系統(tǒng)顏色表中可能不存在,但系統(tǒng)會選擇一種和這個顏色最接近的顏色。RGB 是一個宏,它有三個參數(shù),分別代表紅、藍三種顏色的值。綠、這三個參數(shù) BYTE 類型

28、,取值范圍為 0255。 RGB(0,0,0是黑色,RGB(255,255,255是白色,將這三個分量設(shè)置成為 0255 之間的任意值,從而得到各種不同的顏色。這里的 RGB (255,0,0是紅色。繪制直線時,首先調(diào)用 MoveTo 函數(shù)移動到原點,然后調(diào)用 LineTo 函數(shù)繪制到終點。繪制矩形時使用 Rectangle 函數(shù),該函數(shù)聲明形式為: BOOL Rectangle (LPCRECT lpRect;該函數(shù)有一個指向 Crect 對象的參數(shù),后者可以利用兩個點來構(gòu)造。需要注意的是而上述代碼中傳遞的卻是 Crect 對象,但運該函數(shù)需要的是指向 Crect 對象的指針,10/*繪制矩

29、形*/dc.Rectangle(CRect(m_ptOrigin,point; /*繪制橢圓*/dc.Ellipse(CRect(m_ptOrigin,point;行編譯時也能成功通過,運行時也不會報錯,這是為什么呢?我們知道 C 系列的語言都是強類型語言,如果類型不匹配的話,需要進行強制類型轉(zhuǎn)換。但這里為什么沒有進行這樣的強制類型轉(zhuǎn)換程序也可以通過呢?實際上,Crect 類提供了這樣一個成員函數(shù):重載LPCRECT 操作符,其作用是將 Crect 轉(zhuǎn)換為 LPCRECT 類型。因此,當(dāng)在程序中給 Rectangle 函數(shù)的參數(shù)賦值時,如果它發(fā)現(xiàn)該參數(shù)是一個 Crect 對象,它就會隱式地調(diào)用

30、 LPCRECT 操作符,將 Crect 類型的對象轉(zhuǎn)換為 LPRECT 類型。因此,在給函數(shù)傳遞參數(shù)時,如果我們看到的傳遞的數(shù)值類型和所需要的類型不匹配,但編譯和運行都正確的情況時,就要想想這其中的緣由了。當(dāng)然,有的情況下可能是這些類型之間本來就可以互相轉(zhuǎn)換,例如 short 類型和 int 類型。但是參數(shù)是對象類的話,就要考慮了,它選擇的對象的構(gòu)造方法進行的隱式轉(zhuǎn)換,還是有其他重載的操作符。當(dāng)用戶選擇橢圓菜單項時,調(diào)用 Ellipes 函數(shù)繪制一個橢圓。Windows 系統(tǒng)為我們提供了一個畫圖程序,在該程序中,利用畫筆可以繪制連續(xù)的線條,下面我們設(shè)計繪制連續(xù)線和扇形。為了繪制連續(xù)的線條,首

31、先要得到線條的起點,這在前面已經(jīng)實現(xiàn)。然后需要捕獲鼠標移動過程中的每一個點,這可以通過捕獲鼠標移動消息(WM_MOUSEMOVE來實現(xiàn)。在此消息響應(yīng)函數(shù)中,在依次捕獲的各個點之間繪制一條條非常短的線段,從而就可以繪制出一條連續(xù)的線條。遵照這一思路,我們開始增加程序的功能。首先為視類增加鼠標移動消息(WM_MOUSEMOVE的響應(yīng)函數(shù)(OnMouseMove。這樣,只要鼠標在應(yīng)用程序窗口中移動時都會進入到這個消息響應(yīng)函數(shù)中。但這并不是我們所期望的,我們希望在鼠標左鍵按下后開始繪圖。因此,我們需要有一個變量來表示鼠標左鍵是否按下這一狀態(tài),然后在鼠標移動消息響應(yīng)函數(shù)中對這一變量進行判斷。當(dāng)此變量為真

32、,即鼠標左鍵已經(jīng)按下去,我們開始繪圖。于是,為視類添加一個 BOOL 型的私有變量 m_bDraw,當(dāng)鼠標左鍵按下去時,此變量為真;當(dāng)鼠標左鍵彈起時,此變量為假,這時,我們就不再繪制線條了。該變量在視類頭文件中的定義代碼如下: Private: BOOL m_bDraw;接下來在視類的構(gòu)造函數(shù)中,將此變量初始化為 FALSE。 m_bdraw=FALSE;當(dāng)鼠標左鍵按下去時,在視類的 OnLButtonDown 函數(shù)中將此變量初始化為11TRUE。 m_bdraw=TRUE;當(dāng)鼠標左鍵彈起時,在視類的 OnLButton 函數(shù)中將此變量初始化為假。 m_bdraw=FALSE;然后在 OnMo

33、useMove 函數(shù)中首先對 m_bdraw 變量進行判斷,如果其值為真,說明鼠標左鍵已經(jīng)按下去了,這時就可開始進行畫線操作。還有一點需要注意,因為每繪制一條線段后,下次應(yīng)該從這條線段的終點開始繼續(xù)繪制。因此,繪制完當(dāng)前線段后,應(yīng)該修改線段的起點,將當(dāng)前線段的終點作為下一條線段的起點,程序代碼如下: void CGraphicView:OnMouseMove(UINT nFlags, CPoint point / TODO: Add your message handler code here and/or call default /創(chuàng)建并獲得設(shè)備描述 CClientDC dc(this;

34、/創(chuàng)建寬度為 1 的實線紅色畫筆 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; /修改線段的起點 m_ptOrigin=point; /恢復(fù)設(shè)備描述 dc.SelectObject(pOldpen; CView:OnMouseMove(nFlags, point; 如果在上面繪制連續(xù)線條的程序中,保持每段小直線的起點不變,即以鼠標左鍵按下時的起點為起點不變

35、,分別繪制到鼠標移動點的直線,這時就會出現(xiàn)扇形的效果。也就是去掉上述代碼OnMouseMove 函數(shù)中修改線段起點的代碼。程序代碼如下:12void 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(255,0,0; /把創(chuàng)建的畫筆選入設(shè)備描述 CPen *pOldpen=

36、dc.SelectObject(&pen; if(m_bDraw=true dc.MoveTo(m_ptOrigin; dc.LineTo(point; /恢復(fù)設(shè)備描述dc.SelectObject(pOldpen; CView:OnMouseMove(nFlags, point; 再為此程序添加一個子菜單,菜單名稱為“畫刷”,并為其添加三個菜單項,分別用來控制不同的畫刷。 MFC 提供了一個 CBrush 類,可以用來創(chuàng)建畫刷對象。畫刷通常用來填充一塊區(qū)域。簡單畫刷、位圖畫刷、透明畫刷,程序代碼如下:void CDrawView:OnLButtonUp(UINT nFlags, CP

37、oint point /創(chuàng)建一個紅色畫刷 CBrush brush(RGB(255,0,0; /創(chuàng)建并獲得設(shè)備描述表 CClientDC dc(this; /利用紅色畫刷填充鼠標拖曳過程中形成的矩形區(qū)域13dc.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; /利用紅色畫刷填充鼠標拖曳過程中形成的矩形區(qū)域

38、dc.FillRect(CRect(m_ptOrigin,point,&brush; /創(chuàng)建并獲得設(shè)備描述表 CClientDC dc(this; /創(chuàng)建一個空畫刷 CBrush /將空畫刷選入設(shè)備描述表CBrush *pOldBrush = dc.SelectObject(pBrush; /繪制一個矩形dc.Rectangle(CRect(m_ptOrigin,point; /恢復(fù)先前的畫刷dc.SelectObject(pOldBrush; m_bDraw = FALSE; CView:OnLButtonUp(nFlags, point; 在簡單畫刷程序中,首先創(chuàng)建一個紅色畫刷;接

39、著創(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ū)域。 CRect (POINT topLeft,POINT bottomRight;代碼中的 CDC 類的成員函數(shù) FillRect,該函數(shù)的功能是用指定的畫刷填充一個14*pBrush=CBrush:FromHandle(HBRUS

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

41、ap 類是位圖類,于是我們就會這樣想:利用這個構(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;其中第二種聲明需要一個資源

42、ID 作為參數(shù)。首先給程序增加一個位圖資源。為一個工程創(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 提

43、供的幫助信息中,可以看到該函數(shù)的參數(shù)取值之一可以是 NULL_BRUSH,以獲取一個空畫刷。那么,這個空畫刷是否就是我們所需要的透明畫刷呢?結(jié)論是正確的。但這時存在一個問題,我們獲取的是句柄,而在進行繪制操作時需要的是一個畫刷對象。如何從畫刷句柄轉(zhuǎn)換為畫刷對象呢?CBrush 類提供了一個 FromHandle 函數(shù)來實現(xiàn)這樣的功能。該函數(shù)的聲明如下: Static CDC* PASCAL FromHandle(HDC hDC;15為程序添加一個設(shè)置對話框,允許用戶指定畫筆的類型、線寬,并讓隨后的繪圖操作就使用用戶指定的新設(shè)置值來進行繪制。為了實現(xiàn)這一功能,首先需要為程序添加一個對話框資源,并

44、按下表修改屬性。屬性 ID Caption Font 設(shè)置線型、線寬對話框的代碼如下: void CGraphicView:OnSetting( /TODO: Add your command handler code here CSettingDlg 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; 值 IDD_DLG_SETTING Setti

45、ng 宋體16 void CGraphicView:OnFileOpen( / TODO: Add your command handler code here HMETAFILE hmetaFile; hmetaFile=GetMetaFile("meta.wmf" m_dcMetaFile.PlayMetaFile(hmetaFile; DeleteMetaFile(hmetaFile; Invalidate(; void CGraphicView:OnFileSave( / TODO: Add your command handler code here HMETAF

46、ILE hmetaFile; hmetaFile=m_dcMetaFile.Close(; CopyMetaFile(hmetaFile,"meta.wmf" m_dcMetaFile.Create(; DeleteMetaFile(hmetaFile; 第 4 章結(jié)果及結(jié)論4.1 運行結(jié)果運行結(jié)果如圖 7、8、9圖717圖8圖94.2 結(jié)論其實學(xué)任何一種語言都是一樣的。需要勤奮+毅力+運氣=成功,這是我認為的一個公式。這里毅力和勤奮是個人因素,而運氣這是先天的。如果以前沒有接觸過編程語言的話,在接觸 VC 前我建議你先學(xué)習(xí)一些基礎(chǔ)語言,比如 C 等都是一些比較好學(xué)的基礎(chǔ)語

47、言,我當(dāng)初就是從 C 語言過度學(xué) VC 的。學(xué)基礎(chǔ)語言的目的是學(xué)習(xí)語法結(jié)構(gòu)和如何編寫概念,只有你理解和掌握了這些編程用的工具才能學(xué)習(xí)高級語言。這些基礎(chǔ)語言中我建議大家學(xué) C 語言,其實 VC 就是 C+也就是 C 語言的"兒子","父親"學(xué)習(xí)起來比較容易上手,但遇到類似WINDOWS 的程序的時候比較固執(zhí)不容易溝通,在這種條件下才有了"兒子","兒子"比較開朗應(yīng)變能力強,但是就因為他這些優(yōu)點才使初學(xué)者難以掌握。 VC 是 C+語言,是一種面向?qū)ο蟮木幊陶Z言。他于基礎(chǔ)語言不同點在于,基礎(chǔ)語言是一條路走到底的(中斷技術(shù)

48、除外,而18面向?qū)ο笫堑却愕闹噶畈磐伦?是被動的編程語言。這點是學(xué)習(xí) VC 前必須扭轉(zhuǎn)的概念。通過這次學(xué)年設(shè)計,我了解 vc+是 Windows 平臺上的 C+編程環(huán)境,學(xué)習(xí) VC 要了解很多 Windows 平臺的特性并且還要掌握 MFC、ATL、COM 等的知識,難度比較大。Windows 下編程需要了解 Windows 的消息機制以及回調(diào)(callback函數(shù)的原理; MFC 是 Win32API 的包裝類,需要理解文檔視圖類的結(jié)構(gòu),窗口類的結(jié)構(gòu),消息流向等等;COM 是代碼共享的二進制標準,需要掌握其基本原理等等?;谖覀冞@次用 VC+編寫了一個簡單的畫圖板,功能不是很多,但是從中

49、的到不少收獲。主要有: 1.對項目和文檔的了解,我們在編寫程序時,要對不同的文件進行編寫。其中項目就是文件的集合,包括頭文件、源代碼文件、資源文件。文檔窗口也稱編輯窗口,是用戶進行輸入或編輯頭文件、源文件、資源的區(qū)域。在編輯文件時,為了增加程序的可讀性,系統(tǒng)用綠色顯示注釋語句,用藍色顯示關(guān)鍵字。 2.菜單:我們繪制畫圖板時,就要建立一個“繪圖”菜單。對于“繪圖”菜單下還有幾個子菜單項,通過建立菜單同時讓它實現(xiàn)菜單上的命令,這就要我們對每個菜單項進行設(shè)置,諸如, ID、標題、快捷鍵、熱鍵等。還有一些屬性設(shè)置,設(shè)置不好,容易出錯,所以每次建立菜單,都需謹慎設(shè)置,記住每個菜單對應(yīng)的參數(shù)。 3.文件打

50、開與保存,對于我們繪制出一幅圖片,那么我們就要把它保存下來。如果我們無法保存,我們做了也就沒沒什么意義了。對于圖形的保存于打開,我們還存在很多問題,自定義保存不同文件夾下尚未解決,所以還需要我們進一步的學(xué)習(xí)和了解,爭取實現(xiàn)我們心里多希望的。 4.在編程時遇到了圖像在變換大小時,原來的圖形會消失,后來通過老師的講解,及查看相關(guān)資料,這里涉及的一個重繪問題。經(jīng)過多次修改,添加代碼,才得以解決。所以我覺得學(xué)習(xí) VC+就要拿出那種堅持不懈的精神,做什么也是,只有你不放棄對它了解,才會實現(xiàn)我們自己想要的,這就要我們要不斷的學(xué)習(xí)VC+,從中學(xué)習(xí)更多我們沒了解到的知識。 5.對于 CView 視圖,經(jīng)過查詢

51、主要是負責(zé)內(nèi)存數(shù)據(jù)與用戶的交互。包括數(shù)據(jù)的顯示、用戶操作的響應(yīng)(如菜單的選取、鼠標的響應(yīng)。最重要的是 OnDraw(重畫窗口,通常用 CWnd:Invalidate(來啟動它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。最后通過學(xué)習(xí) VC+,從中受益匪淺,更多的知識,還有待于我們?nèi)ネ诰驅(qū)崿F(xiàn)更多有趣的東西,同樣它也是一個很強大的軟件。 19參考文獻【1】VC+深入詳解孫鑫余安萍編著電子工業(yè)出版社出版【2】VC+程序設(shè)計基礎(chǔ)教程譚浩強主編宋金珂高麗華張迎新編著清華大學(xué)出版社出版20附錄:簡易畫圖板主要程序代碼/ GraphicView.cpp : implementation o

52、f the CGraphicView class #include "stdafx.h" #include "Graphic.h" #include "GraphicDoc.h" #include "GraphicView.h" #include "SettingDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE = _FILE_; #endif / / CGraphicView IM

53、PLEMENT_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, OnLianxux

54、ian 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_COMMAND(IDM_TMHS, OnTmhs21ON_COMMAND(ID_FILE_OPEN, OnFileOpen ON_COMMAND(ID_FILE_SAVE, OnFileSave /AFX_MSG_MAP / Standar

55、d printing commands ON_COMMAND(ID_FILE_PRINT, CView:OnFilePrint ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:OnFilePrint ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview END_MESSAGE_MAP( / / CGraphicView construction/destruction CGraphicView:CGraphicView( / TODO: add construction code here m_nDr

56、awType=0; m_ptOrigin=0; m_bDraw=false; m_nLineWidth=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 / / / CGraphicView drawing void CGraphicView:OnDr

57、aw(CDC* pDC 22the CREATESTRUCT csreturn CView:PreCreateWindow(cs;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 printing BOOL CGraphicView:OnPr

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論