




免費預(yù)覽已結(jié)束,剩余31頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本 科 學(xué) 年 論 文論文題目:基于VC+MFC程序設(shè)計簡易畫圖板 院 系:信息科學(xué)與技術(shù)學(xué)院 專 業(yè):計算機(jī)科學(xué)與技術(shù) 學(xué) 號: 姓 名: 指導(dǎo)教師: 撰寫學(xué)年: 2010至2011學(xué)年 二零一零年十二月摘 要本軟件是利用VC+這個強(qiáng)大的可視化編程工具開發(fā)的,軟件主要功能包括圖形的繪制、線型的設(shè)置、顏色的設(shè)置,圖形文件的重繪和保存等功能。 本文介紹了如何完成上述功能,同時詳細(xì)闡述了畫圖系統(tǒng)的實現(xiàn)過程以及對畫圖系統(tǒng)所做的功能擴(kuò)充。在畫圖軟件設(shè)計上,其主要任務(wù)是:實現(xiàn)“繪制圖形”、“圖形的保存”兩項功能。 本軟件具有實用性、穩(wěn)定性、易用性,和可維護(hù)性的特點,應(yīng)該說它應(yīng)是一個開放性的軟件,用戶可以根據(jù)需要對其功能進(jìn)行擴(kuò)充、完善與修改,使其符合自己的要求??傊?,本軟件是一個逐步完善的軟件。關(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 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-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 requirements. Anyhow, this software is a perfect gradually software. Key words:Vc + +; MFC; drawing目錄引 言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è)計目的63.2 總體設(shè)計73.3詳細(xì)設(shè)計73.3.1點、直線、矩形、橢圓的繪制93.3.2連續(xù)線和扇形的繪制113.3.3畫刷133.3.4設(shè)置對話框153.3.5顏色163.3.6打開與保存17第4章 結(jié)果及結(jié)論174.1運行結(jié)果174.2結(jié)論18參考文獻(xiàn)20附錄:簡易畫圖板主要程序代碼21致謝31引 言計算機(jī)技術(shù)的發(fā)展,使人類社會進(jìn)入了信息化和自動化,計算機(jī)智能識別也隨著計算機(jī)的發(fā)展得到了迅速的發(fā)展。特別是圖形圖像的計算機(jī)處理技術(shù)更是有了前所未有的進(jìn)步和應(yīng)用。計算機(jī)識別也逐漸的從圖形圖像處理的大環(huán)境下分離出來作為一門新的高科技研究領(lǐng)域出現(xiàn)。畫圖涉及到的學(xué)科很多,包括數(shù)字信號處理、工程數(shù)學(xué)、信息論、運籌學(xué)等,它與計算機(jī)、自動化、生物學(xué)、視覺心理和生理學(xué)、人工智能、智能信息處理等眾多領(lǐng)域交叉、綜合集成,有廣泛的應(yīng)用。該軟件功能與Windows下附件中的畫圖軟件有相似功能。本程序是在VC6.0平臺上用MFC所編。繪制方面的功能主要包括繪制各種圖元,包括直線、矩形、橢圓、扇形、連續(xù)線,用筆或畫刷自由繪圖。繪圖時可以選擇各種顏色,各種線型和線寬。軟件支持保存和讀取wmf格式的圖形。該軟件設(shè)計的設(shè)計思想是面向?qū)ο蟪绦蛟O(shè)計的思想。面向?qū)ο蠹夹g(shù)是一個非常實用而強(qiáng)有力的軟件開發(fā)方法。它具有許多特色。一是方法的唯一性,即方法是對軟件開發(fā)過程所有階段進(jìn)行綜合考慮而得到的。二是從生存期的一個階段到下一個階段的高度連續(xù)性,即在一個階段所用到的部分與在下一個階段所使用的部分是銜接的,所使用的技術(shù)經(jīng)過生存期每一階段后不改變。三是把面向?qū)ο蠓治觯∣OA)、面向?qū)ο笤O(shè)計(OOD)和面向?qū)ο蟪绦蛟O(shè)計(OOP)集成到生存期的相應(yīng)階段。該軟件是Windows下附件中的畫圖軟件的輔助工具。他可以幫我們完成繪制wmf格式的圖形,填充了畫圖程序不能完成wmf格式圖形的空缺。由于筆者所學(xué)知識有限,在繪圖功能上有許多方面不能滿足用戶需求。希望讀者提出寶貴的意見和建議。第1章vc+6.0和MFC簡介1.1 vc+6.0簡介VC+6.0是Microsoft公司推出的一個基于Windows系統(tǒng)平臺、可視化的集成開發(fā)環(huán)境,它的源程序按C+語言的要求編寫,并加入了微軟提供的功能強(qiáng)大的MFC(Microsoft Foundation Class)類庫。MFC中封裝了大部分Windows API函數(shù)和Windows控件,它包含的功能涉及到整個Windows操作系統(tǒng)。MFC不僅給用戶提供了Windows圖形環(huán)境下應(yīng)用程序的框架,而且還提供了創(chuàng)建應(yīng)用程序的組件,這樣,開發(fā)人員不必從頭設(shè)計創(chuàng)建和管理一個標(biāo)準(zhǔn)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ā)人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內(nèi)建控件和組件的封裝類。MFC 6.0版本封裝了大約200個類,其中的一些可以被用戶直接使用。例如CWnd類封裝了窗口的功能,包括打印文本、繪制圖形及跟蹤鼠標(biāo)指針的移動等;CsplitterWnd類是從CWnd類派生出來的,繼承了基類或稱父類CWnd類的所有特性,但增加了自己的功能,實現(xiàn)拆分窗口,使窗口至少可被拆分成兩個窗口,用戶可以移動兩個窗口之間的邊框來改變窗口的大?。籆toolBar類可以定義工具欄等。MFC命名的慣例是類的名字通常是由“C”打頭;成員變量使用前綴“m_”,接著使用一個字母來指明數(shù)據(jù)類型,然后是變量的名稱;所有的單詞用大寫字母開頭。第2章 基礎(chǔ)知識2.1工程的新建打開Microsoft Visual C+ 6.0 點擊File New 在Projects中選擇 MFC AppWizard (exe) ; 在 Project name中輸入工程的名字Graphic,在 Location中選擇工程存放的路徑。填完后點擊OK按鈕。(如圖1)填完后點擊OK按鈕,彈出對話框(如圖2)。在彈出來的對話框中我們可以選擇生成三種不同類型的應(yīng)用程序:單文檔、多文檔、對話框。 單文檔程序如記事本,在一個應(yīng)用程序中只能對一個文檔進(jìn)行操作,降低了編程的復(fù)雜度并減少了運行程序時所需的資源。對某些小型應(yīng)用(比如文本編輯器或小型圖像編輯器)可以采用這種類型的窗口應(yīng)用程序。 多文檔程序如PhotoShop,在一個應(yīng)用程序中可以同時對多個文檔進(jìn)行操作; 對話框程序如QQ,應(yīng)用程序的界面是對話框形式的?,F(xiàn)對話框版本的程序更小一些。除了節(jié)省資源外,對話框版本的應(yīng)用程序的加載速度也更快些。基于對話框的應(yīng)用程序比完成相同功能的基于窗口的應(yīng)用程序更簡單有效。 這里我們選第一個:單文檔。 選擇完后點擊Next,設(shè)置默認(rèn),最后點擊Finish完成工程的創(chuàng)建。圖1圖22.2單文檔簡介 生成單文檔程序后,進(jìn)行編譯,在運行,我們可以看到以下的結(jié)果。如圖3 圖3在ClassView中,我們可以看到系統(tǒng)自動為我們生成了五個類:CApp , CDoc , CView , CAboutDlg , CMainFrame。 如圖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)為我們生成了一個程序的框架,但是這個框架完成不了什么具體的功能。為了使程序程序完成我們想要做的事,我們要向這個框架中加入一些代碼。 VC+程序的運行并不像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按鍵。這樣我們就為程序添加了鼠標(biāo)左鍵雙擊的消息響應(yīng)函數(shù),函數(shù)名為OnLButtonDblClk(UINT nFlags, CPoint point)。我們點擊Edit Code按鍵就可以進(jìn)入消息響應(yīng)函數(shù)中。 我們在消息響應(yīng)函數(shù)中添加如下代碼: AfxMessageBox(“Hello Word!”); 運行程序!當(dāng)我們在客戶區(qū)中雙擊鼠標(biāo)左鍵時,我們可以看到效果(如圖5)。 我們在完成雙擊鼠標(biāo)左鍵這個事件后,Windows便會發(fā)出WM_LBUTTONDBLCLK這條消息。我們的程序收到這個消息后,就會跳轉(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ī)制下運行的。 圖52.4資源 在ResoureView 里,我們可以編輯對話框、菜單、工具條、快捷鍵等資源。 點開Menu,可以看到一個ID為IDR_MAINFRAME的菜單。ID是一個標(biāo)識,實際上是一個無符號整型常量,每一個資源在程序中都有一個唯一的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,生成的菜單就還有下級子菜單;如果沒有選擇,菜單就沒有下級菜單。我們同樣可以在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派生。是GDI的關(guān)鍵元素,它代表了物理設(shè)備。每一個C+設(shè)備環(huán)境對象都有相對應(yīng)Windows設(shè)備環(huán)境,并通過一個32位類型的HDC句柄來標(biāo)識。CDC類的虛擬性使我們可以很容易的做到編寫同時適用于多種設(shè)備的代碼。使用CDC類可以使我們的作圖不用關(guān)心設(shè)備的問題。 CClientDC和CWindowDC是顯示設(shè)備環(huán)境類,都是由CDC派生而來,區(qū)別在于CClientDC是窗口的客戶區(qū)不包括邊框、標(biāo)題欄和菜單欄,(0,0)指客戶區(qū)域的左上角。CWindowDC的(0,0)指整個屏幕的左上角,這意味著我們可以在顯示器的任意地方繪圖,包括窗口邊框、標(biāo)題欄和菜單欄等等。CWindowDC一般應(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ù)線的繪制。并且能實現(xiàn)繪圖的控制,包括線寬、線型和顏色的設(shè)置,圖形的保存和打開以及筆刷的使用。3.2 總體設(shè)計設(shè)計圖如圖6簡易畫圖板文件繪圖筆刷打開保存點直線矩形橢圓扇形連續(xù)線設(shè)置顏色簡單筆刷位圖筆刷透明筆刷線寬線型圖63.3詳細(xì)設(shè)計首先,新建一個單文檔類型的MFC AppWizard (exe)工程,工程取名為:Graphic。為此程序添加一個子菜單,菜單名稱為“繪圖”,并為其添加六個菜單項,分別用來控制不同圖形的繪制。當(dāng)用戶選擇其中的一個菜單項后,程序?qū)凑债?dāng)前的選擇進(jìn)行相應(yīng)圖形的繪制。添加的六個菜單項的ID及名稱如表1所示。然后分別為這六個菜單項添加命令響應(yīng),本程序讓視類(CGraphicView)對這些菜單命令進(jìn)行響應(yīng),這六個響應(yīng)函數(shù)的名稱分別如表1所示。表1添加的菜單項菜單項ID菜單項名稱菜單項命令響應(yīng)函數(shù)IDM_DOT點OnDotIDM_LINE直線OnLineIDM-RECTANGLE矩形OnRectangleIDM_ELLIPSE橢圓OnEllipseIDM_SHANXING扇形OnShanxingIDM_LIANXUXIAN連續(xù)線OnLianxuxian在程序運行以后,當(dāng)用戶單擊某個菜單項時,應(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)圖形的繪制。當(dāng)用戶選擇【繪圖】菜單下的不同子菜單項時,將變量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:OnEllipse() / 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點、直線、矩形、橢圓的繪制對于直線、矩形和橢圓,在繪制時都可有兩點來確定其圖形。當(dāng)鼠標(biāo)左擊時得到一個點,當(dāng)鼠標(biāo)左鍵松開時得到另外一個點。為視類CGraphicView分別捕獲鼠標(biāo)左鍵按下和彈起這兩個消息。另外當(dāng)鼠標(biāo)左鍵按下時,需要將鼠標(biāo)當(dāng)前按下點保存,因此我們?yōu)镃GraphicView再增加一個CPoint類型的私有成員變量:m_ptOrigin,在視類的構(gòu)造函數(shù)中將此變量初始化為0。在鼠標(biāo)按下消息響應(yīng)函數(shù)中,保存該點,代碼如下:void CGraphicView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_ptOrigin=point; /保存鼠標(biāo)按下得到點,也是繪制一個點CView:OnLButtonDown(nFlags, point);在鼠標(biāo)左鍵彈起消息響應(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.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: /*繪制矩形*/ dc.Rectangle(CRect(m_ptOrigin,point);break;case 4: /*繪制橢圓*/dc.Ellipse(CRect(m_ptOrigin,point);break;CView:OnLButtonUp(nFlags, point);在上述程序中,設(shè)置一個點,用到的函數(shù)是SetPixel,這也是CDC類的一個成員方法,該函數(shù)的生命形式如下:COLORREF SetPixel (POINT point,COLORREF crColor);該函數(shù)是在指定的點設(shè)置一個像素。其中第一個參數(shù)(point)是指定的點,第二個參數(shù)(crColor)是指定的顏色。在程序中設(shè)定的顏色在系統(tǒng)顏色表中可能不存在,但系統(tǒng)會選擇一種和這個顏色最接近的顏色。RGB是一個宏,它有三個參數(shù),分別代表紅、綠、藍(lán)三種顏色的值。這三個參數(shù)BYTE類型,取值范圍為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)造。需要注意的是該函數(shù)需要的是指向Crect對象的指針,而上述代碼中傳遞的卻是Crect對象,但運行編譯時也能成功通過,運行時也不會報錯,這是為什么呢?我們知道C系列的語言都是強(qiáng)類型語言,如果類型不匹配的話,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。但這里為什么沒有進(jìn)行這樣的強(qiáng)制類型轉(zhuǎn)換程序也可以通過呢?實際上,Crect類提供了這樣一個成員函數(shù):重載LPCRECT操作符,其作用是將Crect轉(zhuǎn)換為LPCRECT類型。因此,當(dāng)在程序中給Rectangle函數(shù)的參數(shù)賦值時,如果它發(fā)現(xiàn)該參數(shù)是一個Crect對象,它就會隱式地調(diào)用LPCRECT操作符,將Crect類型的對象轉(zhuǎn)換為LPRECT類型。因此,在給函數(shù)傳遞參數(shù)時,如果我們看到的傳遞的數(shù)值類型和所需要的類型不匹配,但編譯和運行都正確的情況時,就要想想這其中的緣由了。當(dāng)然,有的情況下可能是這些類型之間本來就可以互相轉(zhuǎn)換,例如short類型和int類型。但是參數(shù)是對象類的話,就要考慮了,它選擇的對象的構(gòu)造方法進(jìn)行的隱式轉(zhuǎn)換,還是有其他重載的操作符。當(dāng)用戶選擇橢圓菜單項時,調(diào)用Ellipes函數(shù)繪制一個橢圓。3.3.2連續(xù)線和扇形的繪制Windows系統(tǒng)為我們提供了一個畫圖程序,在該程序中,利用畫筆可以繪制連續(xù)的線條,下面我們設(shè)計繪制連續(xù)線和扇形。為了繪制連續(xù)的線條,首先要得到線條的起點,這在前面已經(jīng)實現(xiàn)。然后需要捕獲鼠標(biāo)移動過程中的每一個點,這可以通過捕獲鼠標(biāo)移動消息(WM_MOUSEMOVE)來實現(xiàn)。在此消息響應(yīng)函數(shù)中,在依次捕獲的各個點之間繪制一條條非常短的線段,從而就可以繪制出一條連續(xù)的線條。遵照這一思路,我們開始增加程序的功能。首先為視類增加鼠標(biāo)移動消息(WM_MOUSEMOVE)的響應(yīng)函數(shù)(OnMouseMove)。這樣,只要鼠標(biāo)在應(yīng)用程序窗口中移動時都會進(jìn)入到這個消息響應(yīng)函數(shù)中。但這并不是我們所期望的,我們希望在鼠標(biāo)左鍵按下后開始繪圖。因此,我們需要有一個變量來表示鼠標(biāo)左鍵是否按下這一狀態(tài),然后在鼠標(biāo)移動消息響應(yīng)函數(shù)中對這一變量進(jìn)行判斷。當(dāng)此變量為真,即鼠標(biāo)左鍵已經(jīng)按下去,我們開始繪圖。于是,為視類添加一個BOOL型的私有變量m_bDraw,當(dāng)鼠標(biāo)左鍵按下去時,此變量為真;當(dāng)鼠標(biāo)左鍵彈起時,此變量為假,這時,我們就不再繪制線條了。該變量在視類頭文件中的定義代碼如下:Private: BOOL m_bDraw;接下來在視類的構(gòu)造函數(shù)中,將此變量初始化為FALSE。m_bdraw=FALSE;當(dāng)鼠標(biāo)左鍵按下去時,在視類的OnLButtonDown函數(shù)中將此變量初始化為TRUE。m_bdraw=TRUE;當(dāng)鼠標(biāo)左鍵彈起時,在視類的OnLButton函數(shù)中將此變量初始化為假。m_bdraw=FALSE;然后在OnMouseMove函數(shù)中首先對m_bdraw變量進(jìn)行判斷,如果其值為真,說明鼠標(biāo)左鍵已經(jīng)按下去了,這時就可開始進(jìn)行畫線操作。還有一點需要注意,因為每繪制一條線段后,下次應(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);/創(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ù)線條的程序中,保持每段小直線的起點不變,即以鼠標(biāo)左鍵按下時的起點為起點不變,分別繪制到鼠標(biāo)移動點的直線,這時就會出現(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(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 CDrawView:OnLButtonUp(UINT nFlags, CPoint point) /創(chuàng)建一個紅色畫刷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è)備描述表CClientDC dc(this);/利用紅色畫刷填充鼠標(biāo)拖曳過程中形成的矩形區(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(pOldBrush);m_bDraw = FALSE;CView:OnLButtonUp(nFlags, point);在簡單畫刷程序中,首先創(chuàng)建一個紅色畫刷;接著創(chuàng)建設(shè)備描述表對象;然后調(diào)用設(shè)備描述表對象的成員函數(shù)FillRect,利用指定的畫刷填充一塊指定的矩形區(qū)域,而鼠標(biāo)拖動過程中的起點和終點就決定了需要填充的矩形區(qū)域,因此,代碼中通過CRect類利用鼠標(biāo)拖動的起點和終點構(gòu)造了這快矩形區(qū)域。CRect類提供了多個構(gòu)造函數(shù),這里使用的是下面這種構(gòu)造函數(shù),即通過指定矩形區(qū)域的左上角和右下角這兩個點來構(gòu)造一塊矩形區(qū)域。CRect(POINT topLeft,POINT bottomRight);代碼中的CDC類的成員函數(shù)FillRect,該函數(shù)的功能是用指定的畫刷填充一個矩形。該函數(shù)將填充全部的矩形,包括上左邊界,但不填充右底邊界。FillRect函數(shù)的聲明如下:void FillRect (LPCRECT lpRect,CBrush* pBrush);該函數(shù)有兩個參數(shù),lpRect是指向一個RECT結(jié)構(gòu)體或CRect對象的指針,該結(jié)構(gòu)體或?qū)ο笾邪艘畛涞木匦蔚倪壿嬜鴺?biāo)。pBrush是指向用于填充矩形的畫刷對象的指針。在位圖畫刷程序中,CBrush類有下面這樣一種構(gòu)造函數(shù)。CBrush (CBitmap* pBitmap);該構(gòu)造函數(shù)要求一個CBitmap類型的指針,CBitmap類是位圖類,于是我們就會這樣想:利用這個構(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ù)。首先給程序增加一個位圖資源。為一個工程創(chuàng)建資源有多種實現(xiàn)方法,其中一種方法可以利用【Insert】菜單下的【Resource】命令,在彈出的對話框中選擇Bitmap資源類型,單擊【New】按鈕,即可創(chuàng)建一個默認(rèn)名稱為IDB_BITMAP1的位圖資源,并在VC+集成開發(fā)環(huán)境右邊的代碼編輯區(qū)中打開位圖編輯器??梢岳镁庉嬈饔疫叺恼{(diào)色板和繪圖工具來編輯位圖資源,還可以通過拉伸位圖編輯器中網(wǎng)格周圍的藍(lán)色方點來調(diào)整位圖的大小。在透明畫刷程序中,我們利用GetStockObject這個函數(shù)來獲取一個黑色或白色的畫刷句柄。這個函數(shù)是否能夠獲得一個透明畫刷句柄呢?從MSND提供的幫助信息中,可以看到該函數(shù)的參數(shù)取值之一可以是NULL_BRUSH,以獲取一個空畫刷。那么,這個空畫刷是否就是我們所需要的透明畫刷呢?結(jié)論是正確的。但這時存在一個問題,我們獲取的是句柄,而在進(jìn)行繪制操作時需要的是一個畫刷對象。如何從畫刷句柄轉(zhuǎn)換為畫刷對象呢?CBrush類提供了一個FromHandle函數(shù)來實現(xiàn)這樣的功能。該函數(shù)的聲明如下:Static CDC* PASCAL FromHandle(HDC hDC);3.3.4設(shè)置對話框為程序添加一個設(shè)置對話框,允許用戶指定畫筆的類型、線寬,并讓隨后的繪圖操作就使用用戶指定的新設(shè)置值來進(jìn)行繪制。為了實現(xiàn)這一功能,首先需要為程序添加一個對話框資源,并按下表修改屬性。屬性值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顏色顏色對話框看起來比較復(fù)雜。實際上,MFC為我們提供了一個類:CColorDialog,可以很方便的創(chuàng)建這樣的一個顏色對話框。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:OnFileOpen() / 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();CopyMetaFile(hmetaFile,meta.wmf);m_dcMetaFile.Create();DeleteMetaFile(hmetaFile);第4章 結(jié)果及結(jié)論4.1運行結(jié)果運行結(jié)果如圖7、8、9圖7圖8圖94.2結(jié)論其實學(xué)任何一種語言都是一樣的。需要勤奮+毅力+運氣=成功,這是我認(rèn)為的一個公式。這里毅力和勤奮是個人因素,而運氣這是先天的。如果以前沒有接觸過編程語言的話,在接觸VC前我建議你先學(xué)習(xí)一些基礎(chǔ)語言,比如C等都是一些比較好學(xué)的基礎(chǔ)語言,我當(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)變能力強(qiáng),但是就因為他這些優(yōu)點才使初學(xué)者難以掌握。 VC是C+語言,是一種面向?qū)ο蟮木幊陶Z言。他于基礎(chǔ)語言不同點在于,基礎(chǔ)語言是一條路走到底的(中斷技術(shù)除外),而面向?qū)ο笫堑却愕闹噶畈磐伦?,是被動的編程語言。這點是學(xué)習(xí)VC前必須扭轉(zhuǎn)的概念。通過這次學(xué)年設(shè)計,我了解vc+是Windows平臺上的C+編程環(huán)境,學(xué)習(xí)VC要了解很多Windows平臺的特性并且還要掌握MFC、ATL、COM等的知識,難度比較大。Windows下編程需要了解Windows的消息機(jī)制以及回調(diào)(callback)函數(shù)的原理;MFC是Win32API的包裝類,需要理解文檔視圖類的結(jié)構(gòu),窗口類的結(jié)構(gòu),消息流向等等;COM是代碼共享的二進(jìn)制標(biāo)準(zhǔn),需要掌握其基本原理等等?;谖覀冞@次用VC+編寫了一個簡單的畫圖板,功能不是很多,但是從中的到不少收獲。主要有:1對項目和文檔的了解,我們在編寫程序時,要對不同的文件進(jìn)行編寫。其中項目就是文件的集合,包括頭文件、源代碼文件、資源文件。文檔窗口也稱編輯窗口,是用戶進(jìn)行輸入或編輯頭文件、源文件、資源的區(qū)域。在編輯文件時,為了增加程序的可讀性,系統(tǒng)用綠色顯示注釋語句,用藍(lán)色顯示關(guān)鍵字。2菜單:我們繪制畫圖板時,就要建立一個“繪圖”菜單。對于“繪圖”菜單下還有幾個子菜單項,通過建立菜單同時讓它實現(xiàn)菜單上的命令,這就要我們對每個菜單項進(jìn)行設(shè)置,諸如,ID、標(biāo)題、快捷鍵、熱鍵等。還有一些屬性設(shè)置,設(shè)置不好,容易出錯,所以每次建立菜單,都需謹(jǐn)慎設(shè)置,記住每個菜單對應(yīng)的參數(shù)。3.文件打開與保存,對于我們繪制出一幅圖片,那么我們就要把它保存下來。如果我們無法保存,我們做了也就沒沒什么意義了。對于圖形的保存于打開,我們還存在很多問題,自定義保存不同文件夾下尚未解決,所以還需要我們進(jìn)一步的學(xué)習(xí)和了解,爭取實現(xiàn)我們心里多希望的。4.在編程時遇到了圖像在變換大小時,原來的圖形會消失,后來通過老師的講解,及查看相關(guān)資料,這里涉及的一個重繪問題。經(jīng)過多次修改,添加代碼,才得以解決。所以我覺得學(xué)習(xí)VC+就要拿出那種堅持不懈的精神,做什么也是,只有你不放棄對它了解,才會實現(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)更多有趣的東西,同樣它也是一個很強(qiáng)大的軟件。參考文獻(xiàn)【1】VC+深入詳解 孫鑫 余安萍 編著 電子工業(yè)出版社出版【2】VC+程序設(shè)計基礎(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_NEW#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_COM
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 卡通黑板插畫新學(xué)期教師工作會議模板
- 獸藥專項整治工作總結(jié)
- 2025-2030中國合成酒石酸市場銷售渠道與前景動態(tài)研究報告
- 2025-2030中國醫(yī)院和藥房機(jī)器人行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 執(zhí)法證考試試題及答案8
- 2025-2030中國內(nèi)燃機(jī)行業(yè)需求潛力分析及經(jīng)營狀況監(jiān)測報告版
- 2025-2030中國光熱產(chǎn)業(yè)規(guī)模預(yù)測及營銷發(fā)展戰(zhàn)略分析報告
- 2025-2030中國兒童人工耳蝸市場應(yīng)用規(guī)模及投資潛力可行性報告
- 2025-2030中國中央廚房行業(yè)經(jīng)營形勢分析及投資風(fēng)險預(yù)警報告
- 新疆疏附縣第二重點中學(xué)2021-2022學(xué)年高一上學(xué)期語文期初考試試卷(含答案)
- 個人向紀(jì)檢委寫檢討書
- 兒童支氣管鏡護(hù)理
- 山西省晉中市左權(quán)縣多校2023-2024學(xué)年七年級上學(xué)期期末數(shù)學(xué)試題(含答案)
- 重癥肌無力的護(hù)理課件
- 金屬與石材幕墻工程技術(shù)規(guī)范JGJ
- 世界母乳喂養(yǎng)周母乳喂養(yǎng)健康宣教課件
- 臨床靜脈導(dǎo)管維護(hù)操作專家共識
- 《建筑結(jié)構(gòu)檢測與加固》課件 第1-3章 緒論、建筑結(jié)構(gòu)的檢測與鑒定、混凝土結(jié)構(gòu)的加固
- 2024年全國小學(xué)生英語競賽初賽(低年級組)試題及參考答案
- 《病歷書寫基本規(guī)范》課件
- GB/T 2881-2023工業(yè)硅
評論
0/150
提交評論