![繪圖系統(tǒng)設計及實現(xiàn)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/28/a0489145-0b29-473e-b821-f83dedd7fb1b/a0489145-0b29-473e-b821-f83dedd7fb1b1.gif)
![繪圖系統(tǒng)設計及實現(xiàn)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/28/a0489145-0b29-473e-b821-f83dedd7fb1b/a0489145-0b29-473e-b821-f83dedd7fb1b2.gif)
![繪圖系統(tǒng)設計及實現(xiàn)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/28/a0489145-0b29-473e-b821-f83dedd7fb1b/a0489145-0b29-473e-b821-f83dedd7fb1b3.gif)
![繪圖系統(tǒng)設計及實現(xiàn)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/28/a0489145-0b29-473e-b821-f83dedd7fb1b/a0489145-0b29-473e-b821-f83dedd7fb1b4.gif)
![繪圖系統(tǒng)設計及實現(xiàn)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/28/a0489145-0b29-473e-b821-f83dedd7fb1b/a0489145-0b29-473e-b821-f83dedd7fb1b5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、繪圖系統(tǒng)設計及實現(xiàn)目 錄一、繪圖系統(tǒng)概述1二、硬件系統(tǒng)組成2(一)主機2(二)外存儲器2(三)圖形輸入設備2(四)圖形輸出設備3三、軟件系統(tǒng)概述4(一)系統(tǒng)軟件4(二)支撐軟件4(三)計算機繪圖應用軟件4四、圖形操作的基本知識介紹5(一)CD和CDC類的介紹5(二)CDI和CGdiobject類5(三)圖形操作中顏色的變化7五、圖形繪畫程序的具體實現(xiàn)11(一)畫筆操作實現(xiàn)11(二)填充的實現(xiàn)11(三)直線繪制的實現(xiàn)12(四)圓形繪制的實現(xiàn)12(五)矩形繪制的實現(xiàn)13(六)圓角矩形的繪制實現(xiàn)13(七)多邊形繪制實現(xiàn)13(八)噴槍的實現(xiàn)14(九)運行程序界面15六、系統(tǒng)測試16七、結束語17參考文
2、獻18繪圖系統(tǒng)設計及實現(xiàn)摘 要自從上世紀計算機系統(tǒng)向繪畫界的延伸以來,繪圖技術已成為計算機系統(tǒng)不可分割的一部分。而圖形編輯器又是圖形編輯軟件的基礎,幾乎所有的圖形編輯軟件,都是在擁有基本圖形編輯功能的基礎上實現(xiàn)更復雜功能的。故在圖形應用非常廣泛的今天,研究開發(fā)繪圖系統(tǒng)是非常有意義的。本文主要經(jīng)過對繪圖系統(tǒng)軟硬件配置的分析,就繪圖系統(tǒng)的設計及實現(xiàn)進行了合理的闡述。在基于MFC的操作環(huán)境中,通過對CD、CDC類以及CDI、CGdiobject類的應用,在繪圖方面實現(xiàn)繪制直線、矩形、圓形等基本功能,在界面設計方面實現(xiàn)了對圖形的操作,從而從底層對繪圖系統(tǒng)進行簡單的實現(xiàn)。關鍵詞:硬件系統(tǒng)組成 軟件系統(tǒng)構
3、架 圖形操作及繪畫技術 基本繪圖功能 圖形界面Design and implementation of drawing systemAbstractSince the last century, the computer system has been extended to the painting industry, computer graphics technology has become an integral part of the system. The graphics editor graphics editing software is the foundation of
4、 almost all of the graphics editing software, are in possession of basic graphics editing capabilities based on the more complex functions. It is widely used in graphics today, research and development of graphics systems is very meaningful. This article focuses on the mapping system through the ana
5、lysis of hardware and software configurations, the mapping system design and implementation of a reasonable set. MFC-based operating environment, through the CD, CDC class, and CDI, CGdiobject class applications, to achieve in the drawing to draw lines, rectangles, circles and other basic functions,
6、 implemented in the interface design of graphics operations, and thus from the underlying graphics system for simple implementation.Key words:Hardware system The software system structure Graphic operation and drawing technology draw tools GUI一、繪圖系統(tǒng)概述計算機繪圖系統(tǒng)是基于計算機的系統(tǒng),由軟件系統(tǒng)和硬件系統(tǒng)組成。其中,軟件是計算機繪圖系統(tǒng)的核心,而相
7、應的系統(tǒng)硬件設備則為軟件的正常運行提供了基礎保障和運行環(huán)境。另外,任何功能強大的計算機繪圖系統(tǒng)都只是一個輔助工具,系統(tǒng)的運行離不開系統(tǒng)使用人員的創(chuàng)造性思維活動。因此,使用計算機繪圖系統(tǒng)的技術人員也屬于系統(tǒng)組成的一部分,將軟件、硬件及人這三者有效地融合在一起,是發(fā)揮計算機系統(tǒng)強大功能的前提。從上世紀計算機系統(tǒng)向繪畫界得引入到現(xiàn)在,計算機繪圖已然成為計算機圖形學的一個重要分支,其主要特點是向計算機輸入非圖形信息,由計算機處理后生成圖形輸出。二、硬件系統(tǒng)組成通常,將用戶進行計算機繪圖作業(yè)的獨立硬件環(huán)境稱作計算機繪圖的硬件系統(tǒng)。計算機繪圖的硬件主要由主機、輸入設備(鍵盤、鼠標、掃描儀等)、輸出設備(顯
8、示器、繪圖儀、打印機等)、信息存儲設備(主要指外存,如硬盤、軟盤、光盤等)、以及網(wǎng)絡設備、多媒體設備等組成1。如圖1-1所示圖2.1 計算機繪圖系統(tǒng)的基本硬件組成(一)主機主機由中央處理器(CPU)和內(nèi)存儲器(簡稱內(nèi)存)組成,是整個計算機繪圖系統(tǒng)的核心。衡量一個主機性能的指標中相互要有兩項:CPU性能和內(nèi)存容量。1CPU性能CPU的性能決定著計算機的數(shù)據(jù)處理能力、運算精度和速度。CPU的性能通常用每秒可執(zhí)行的指令數(shù)目或進行浮點運算的速度指標來衡量,其單位符號為MI/S(每秒處理1百萬條指令)和GI/S(每秒處理10億條指令)。目前,CPU的速度已達到160GI/S以上。一般情況下,用芯片的時鐘
9、頻率來表示運算速度更為普遍,時鐘頻率越高,運算速度越快。2.內(nèi)存容量內(nèi)存是存放運算程序、原始數(shù)據(jù)、計算結果等內(nèi)容的記憶裝置。如果內(nèi)存容量過小,將直接影響計算機繪圖軟件系統(tǒng)的運行效果。因為,內(nèi)存容量越大,主機能容納和處理的信息量也就越大。(二)外存儲器外存儲器簡稱為外存,雖然內(nèi)存儲器可以直接和運算器、控制器交換信息,存取速度很快,但內(nèi)存儲器成本較高,且其容量受到CPU直接尋址能力的限制。外存作為內(nèi)存的后援,是計算機繪圖系統(tǒng)將大量程序、數(shù)據(jù)庫、圖形庫存放在外存器中,待需要時再調(diào)入內(nèi)存進行處理。外存儲器通常包括硬盤、軟盤、光盤等。(三)圖形輸入設備在計算機繪圖作業(yè)過程中,不僅要求用戶能夠快速輸入圖形
10、,而且還要求能夠?qū)⑤斎氲膱D形以人機交互方式進行修改,以及對輸入的圖形進行圖形變換(如縮放、平移、旋轉(zhuǎn))等操作。因此,圖形輸入設備在計算機繪圖硬件系統(tǒng)中占有重要的地位。目前,計算機繪圖系統(tǒng)常用的輸入設備有鍵盤、鼠標、掃描儀等。(四)圖形輸出設備圖形輸出設備包括圖形顯示器、繪圖儀、打印機等。圖形顯示器是計算機繪圖系統(tǒng)中最為重要的硬件設備之一,主要用于圖形圖像的顯示和人機交互操作,是一種交互式的圖形顯示設備,其主要部件是陰極射線管(CRT)。它有3種類型:直接存儲管式顯示器、射線刷新式顯示器、光柵掃描式顯示器。目前,交互式圖形系統(tǒng)采用的主流顯示器是基于CRT的光柵掃描式顯示器。其工作原理與電視機相似
11、,不同之處在于電視機利用攝像機產(chǎn)生的模擬信號構成屏幕上的圖像,而光柵掃描式顯示器則利用計算機產(chǎn)生的數(shù)字信號構成屏幕上的圖像。衡量顯示器性能的主要指標是分辨率和顯示速度。對于光柵掃描式顯示器而言,沿水平和垂直方向單位長度上所能識別的最大光點數(shù)稱為分辨率(光點也稱為像素)。對于相同尺寸的屏幕,點數(shù)越多,距離越小,分辨率就越高,顯示的圖形也越精細。顯示速度同顯示器在輸出圖形時采用的分辨率以及計算機本身處理圖形的速度有關。從人機工程學的角度來看,通常應滿足人眼觀察圖形時不出現(xiàn)閃爍這一基本要求,圖形屏幕的刷新速度應不低于30幀/秒。隨著人們對顯示器輕型化、薄型化以及大尺寸的要求,目前,液晶顯示器和等離子
12、顯示器的應用越來越多。由于這些顯示器的制造成本逐漸降低,已呈現(xiàn)出取代基于CRT的光柵掃描式顯示器的趨勢。繪圖儀、打印機等也是目前常用的圖形輸出設備。目前,常用的繪圖儀為滾筒式繪圖儀,這種繪圖儀具有結構簡單緊湊、圖紙長度不受限制、價格便宜、占用工作面積小等優(yōu)點。常用的打印機主要有針式、噴墨、激光打印機等。三、軟件系統(tǒng)概述計算機軟件是指控制計算機運行,并使計算機發(fā)揮最大功效的各種程序、數(shù)據(jù)及文檔的集合。在計算機繪圖系統(tǒng)中,軟件配置水平?jīng)Q定著整個計算機繪圖系統(tǒng)的性能優(yōu)劣。因此可以說硬件是計算機繪圖系統(tǒng)的物質(zhì)基礎,而軟件則是計算機繪圖系統(tǒng)的核心。從計算機繪圖系統(tǒng)的發(fā)展趨勢來看,軟件占據(jù)著愈來愈重要的地
13、位,目前,系統(tǒng)配置中的軟件成本已經(jīng)超過了硬件。目前而言,計算機繪圖系統(tǒng)的軟件可以分為3個層次,即系統(tǒng)軟件、支撐軟件和應用軟件。系統(tǒng)軟件是與計算機硬件直接關聯(lián)的軟件,一般由專業(yè)的軟件開發(fā)人員研制,它起著擴充計算機的功能以及合理調(diào)度與使用計算機的作用。系統(tǒng)軟件有2個特點:一是公用性,無論哪個應用領域都要用到它;二是基礎性,各種支撐軟件及應用軟件都需要在系統(tǒng)軟件的支撐下運行。支撐軟件是在系統(tǒng)軟件的基礎上研制的,它包括進行計算機繪圖作業(yè)時所需的各種通用軟件。應用軟件則是在系統(tǒng)軟件及支撐軟件支持下,為實現(xiàn)某個應用領域內(nèi)的特定任務而開發(fā)的軟件。下面分別對這3類軟件進行具體介紹。 (一)系統(tǒng)軟件系統(tǒng)軟件主要
14、用于計算機的管理、維護、控制、運行,以及計算機程序的編譯、裝載和運行。系統(tǒng)軟件包括操作系統(tǒng)和編譯系統(tǒng)。操作系統(tǒng)主要承擔對計算機的管理工作,其主要功能包括文件管理(建立、存儲、刪除、檢索文件)、外部設備管理(管理計算機的輸入、輸出等外部硬件設備)、內(nèi)存分配管理、作業(yè)管理和中斷管理。操作系統(tǒng)的種類很多,在工作站上主要采用UNIX、Windows 2000/NT/XP等;在微機上主要采用UNIX的變種XENIX、ONIX、VENIX,以及Windows系列操作系統(tǒng)。編譯系統(tǒng)的作用是將用高級語言編寫的程序翻譯成計算機能夠直接執(zhí)行的機器指令。有了編譯系統(tǒng),用戶就可以用接近于人類自然語言和數(shù)學語言的方式編
15、寫程序,而翻譯成機器指令的工作則由編譯系統(tǒng)完成。這樣就可以使非計算機專業(yè)的各類工程技術人員很容易地用計算機來實現(xiàn)其繪圖目的。目前,國內(nèi)外廣泛應用的高級語言FORTRAN、PASCAL、C/C+、Visual Basic、LISP等均有相應的編譯系統(tǒng)2。(二)支撐軟件支撐軟件是計算機繪圖軟件系統(tǒng)中的核心,是為滿足計算機繪圖工作中一些用戶的共同需要而開發(fā)的通用軟件。近30多年來,由于計算機應用領域迅速擴大,支撐軟件的開發(fā)研制有了很大的進展,推出了種類繁多的商品化支撐軟件。(三)計算機繪圖應用軟件應用軟件是在系統(tǒng)軟件、支撐軟件的基礎上,針對某一專門應用領域而開發(fā)的軟件。這類軟件通常由用戶結合當前繪圖
16、工作的需要自行研究開發(fā)或委托開發(fā)商進行開發(fā),此項工作又稱為“二次開發(fā)”。能否充分發(fā)揮已有計算機繪圖系統(tǒng)的功能,應用軟件的技術開發(fā)工作是很重要的,也是計算機繪圖從業(yè)人員的主要任務之一四、圖形操作的基本知識介紹(一)CD和CDC類的介紹CDC是設備環(huán)境類的基類直接由CObject派生。是GDI的關鍵元素,它代表了物理設備。每一個C+設備環(huán)境對象都有相對應Windows設備環(huán)境,并通過一個32位類型的HDC句柄來標識。CDC類的虛擬性使我們可以很容易的做到編寫同時適用于多種設備的代碼。例如OnDraw函數(shù)的pDC->TextOut(0,0,"Hello");既可以適用于顯示
17、器、還可以適用于打印預覽和打印,只需要在CView:OnDraw函數(shù)的pDC參數(shù)指向不同的對象類3。CClientDC和CWindowDC是顯示設備環(huán)境類,都是由CDC派生而來,區(qū)別在于CClientDC是窗口的客戶區(qū)不包括邊框、標題欄和菜單欄,(0,0)指客戶區(qū)域的左上角。CWindowDC的(0,0)指整個屏幕的左上角,這意味著我們可以在顯示器的任意地方繪圖,包括窗口邊框、標題欄和菜單欄等等。CWindowDC一般應用在框架窗口,而不是視圖窗口。CDC對象被創(chuàng)建后一定要在合適的時候?qū)⑺鼊h除掉,如果忘記了刪除設備環(huán)境對象則會造成內(nèi)存丟失。如何做才能避免出現(xiàn)這個問題呢,我們應該在堆棧中構造對象
18、??蠢? 例子void CMyView:OnLButtonDown(UINT nFlags,CPoint point) CRect rect; CClientDC dc(this); /在堆棧中構造設備環(huán)境對象,用一個窗口指針this作參數(shù)。 dc.GetClipBox(rect); /GetClipBox函數(shù)是一個虛函數(shù),作用是可以獲得選定區(qū)域的尺寸 /析構函數(shù)在函數(shù)返回時自動調(diào)用,也就完成對設備環(huán)境對象的刪除。書上還給出了另一種寫法:void CMyView:OnLButtonDown(UINT nFlags,CPoint point)CRect rect; CDC * pDC=GetD
19、C(); /通過調(diào)用CWnd的GetDC()函數(shù)獲得設備環(huán)境指針pDC->GetClipBox(rect); /可以獲得選定區(qū)域的尺寸 ReleaseDC(pDC); /一定不能忘記,釋放設備環(huán)境。(書上寫錯了) 創(chuàng)建的設備環(huán)境對象具有一些默認的特性,通過CDC類的成員函數(shù)可以設定這些特性。例如前一篇筆記用到的刷子、映射模式等等。我們還可以通過重載SelectObject函數(shù)將GDI對象選進設備環(huán)境中。(二)CDI和CGdiobject類 GDI對象是通過CGdiObject派生類的C+對象來表示的4。CBrush是一個GDI的派生類,它在MFC中的層次結構是這樣的:CObject派生C
20、GdiObject派生CBrush,明白了吧。CGdiObject是所有GDI對象的抽象基類。下面列出的是GDI派生類的列表:CBitmap:位圖是一種位矩陣,每一個顯示象素都對應于其中的一個或多個位,可以用來表示圖象,也可以用來創(chuàng)建刷子 CBrush:刷子定義了一種位圖形式的象素,可以用來對區(qū)域內(nèi)部填充顏色。 CFont:字體是一種具有某種風格和尺寸的所有字符的完整集合,常常被作為資源,其中一些依賴某種設備。CPalette:調(diào)色板是一種顏色映射接口,它允許應用程序在不影響其他應用程序的前提下,可以充分利用輸出設備的顏色描繪能力。CPen:筆是一種用來畫線及繪制有形邊框的工具,可以指定它的顏
21、色及寬度,并可以指定畫虛線、點線還是實線。CRgn:區(qū)域是由多邊形、橢圓二者組合形成的一種范圍,可以用來進行填充、裁剪、鼠標點中測試等等。 以上很容易理解,可以用WINDOWS的畫圖幫助我們理解。CGdiObject類很眼生,看過很多代碼就沒有看到過它,原因是由于CGdiObject類是所有GDI對象類的虛擬基類,所以我們不必創(chuàng)建CGdiObject類的對象,可以直接構造它的派生類的對象,例如這樣 CPen newPen(PS_DASHDOTDOT,2,(COLORREF) 0); /黑色的筆寬度為2 但需要注意的是CFont和CRgn的對象建立需要先調(diào)用默認的構造函數(shù)來構造C+對象,然后再調(diào)
22、用相應的創(chuàng)建函數(shù)如:CreateFont或CreatePolygonRgn等。CGdiObject類有一個虛擬的析構函數(shù),它派生類的析構函數(shù)需要將與C+對象相關聯(lián)的GDI對象刪除掉,一定要在退出程序之前把構造的CGdiObject派生類對象干掉。因為一個沒有釋放的GDI對象會占用很多的內(nèi)存。讓我們用一個例子跟蹤一下GDI對象 void CMy10View:OnDraw(CDC* pDC) pDC->MoveTo (10,10);pDC->LineTo (110,10); CPen newPen(PS_DASHDOTDOT,10,(COLORREF) 192); /紅色的筆寬度為10
23、 CPen * pOldPen=pDC->SelectObject (&newPen); /在將新對象選進設備環(huán)境的同時返回指向前一次被選對象的指針。作用保存原來的對象,以便完成任務時恢復它。pDC->MoveTo (10,20);pDC->LineTo (110,20); pDC->SelectObject (pOldPen);/把原來的對象恢復 pDC->MoveTo (10,30); pDC->LineTo (110,30); 屏幕上應該顯示三條線,第一條和第三條一樣顏色和粗細因為他們都是用的設備環(huán)境默認的CPen對象,第二條是一條用我們自己設
24、定的CPen對象。我們可以看出在將新對象選進設備環(huán)境的同時返回指向前一次被選對象的指針。作用保存原來的對象,以便完成任務時恢復它。 Windows還包含有一些可以利用的庫存對象,它們不會被刪除,因為Windows對企圖刪除它們的動作不予理睬。我們可以用SelectStockObject函數(shù)將它們選進設備環(huán)境。下面列出的是所有的有關刷子、筆、字體和調(diào)色板的庫存對象。 由于SelectObject函數(shù)返回的GDI C+對象指針具有臨時性,當程序的空閑處理階段或者控制函數(shù)返回時應用程序框架會將臨時的C+對象刪除,我們不能簡單的把這一指針保存在類的數(shù)據(jù)成員中,而應該借助GetSafeHdc函數(shù)將它轉(zhuǎn)化
25、為Windows的句柄,以便持久的保存GDI的標識。void CMy10View:OnDraw(CDC* pDC) HPEN m_hPen; /一個指向CPen對象的指針pDC->MoveTo (10,10); pDC->LineTo (110,10); COLORREF) 192); /紅色的筆寬度為10 CPen * pOldPen=pDC->SelectObject (&newPen); /在將新對象選進設備環(huán)境的同時返回指向前一次被選對象的指針。作用保存原來的對象,以便完成任務時恢復它。m_hPen=(HPEN)pOldPen->GetSafeHandl
26、e ();/獲得并保存原來對象的句柄 pDC->MoveTo (10,20); pDC->LineTo (110,20); pDC->SelectObject (CPen:FromHandle (m_hPen);/把原來的對象恢復,和例子7-2不同的是通過句柄pDC->MoveTo (10,30); pDC->LineTo (110,30); 補充一下IGDI派生類的Windows handle type列表 CPen HPENCBrush HBRUSH CFont HFONT CBitmap HBITMACRgn HRGN (三)圖形操作中顏色的變化標準的VGA
27、顯示卡使用的是8位顏色寄存器,所以它可以表示出262144種顏色,然而由于視頻內(nèi)存的限制、標準的VGA只能采用4位顏色代碼,一次只能同時顯示16種標準純色。太少了不是嗎?如何獲得更加豐富的色彩呢,面向顏色的GDI函數(shù)可以使我們獲得更多的顏色。每一種WINDOWS的顏色都是通過8位RGB值的組合來表示,面向顏色的GDI函數(shù)可以接收32位的COLORREF參數(shù),這種類型的參數(shù)包含了8位的紅、綠、藍顏色值。WINDOWS的RGB宏可以將8位的紅綠藍值轉(zhuǎn)化成COLORREF參數(shù),經(jīng)過模糊處理可以得到更多的顏色。我們可以這樣創(chuàng)建刷子5:CBrush brush(RGB(128,128,192);例子 v
28、oid CMy81View:OnDraw(CDC* pDC) pDC->SetBkColor (RGB(255,0,0); pDC->SetTextColor (RGB(198,198,198); pDC->TextOut (10,10,); 在OnDraw(CDC* pDC)函數(shù)中設定文本的背景色和前景色,我們試著改變RGB宏的數(shù)值,會發(fā)現(xiàn)SetBkColor和SetTextColor函數(shù)并不總是顯示模糊色,如果模糊色過于復雜,它們會選擇與之相近的純色來顯示。書上是這樣說的。以目前的硬件設備來說我們可以在1024X768的方式下獲得24位真彩色,這意味著我們可以通過RGB宏
29、獲得任何我們想要的顏色,其實我們的肉眼已經(jīng)不能分辨它們的區(qū)別了。其實256色已經(jīng)足夠作出很精美的畫面了。 下面我們來看看字體。字體是GDI對象,和其他GDI對象一樣它可以按比例縮放,被裁剪,可以被選進設備環(huán)境,并可以被釋放和刪除。書上對于字體部分描述實在令我不愿意讀,我想大家可能也是這樣的心情。那好我們便不去讀它,直接用一個例子來理解字體。例子1)建立一個新MFC AppWizard(exe)項目“82”,除選擇單文檔外其余全用默認項。 2)重載My82View類的OnPrepareDC函數(shù) void CMy82View:OnPrepareDC(CDC* pDC, CPrintInfo* pI
30、nfo) pDC->SetMapMode (MM_ANISOTROPIC);/應該還記得此種映射模式是X,Y的比例因子可以獨立變化pDC->SetWindowExt (1440,1440);/將映射模式設置成邏輯twips即一個邏輯單位等于1/1440邏輯英寸。pDC->SetViewportExt (pDC->GetDeviceCaps (LOGPIXELSX),-pDC->GetDeviceCaps (LOGPIXELSY); 用SetWindowExt和SetViewportExt定義比例GetDeviceCaps函數(shù)可以獲得各種顯示參數(shù),典型的參數(shù)如下:在
31、640X480分辨率下:HORZSIZE 物理寬度(毫米) 320 VERTSIZE 物理高度(毫米) 240 HORZRES 象素寬度 640 VERTRES 象素高度 480 LOGPIXEXSX 每邏輯英寸的水平點數(shù) 96 LOGPIXEXSY 每邏輯英寸的垂直點數(shù) 96 3)加入一個Private類型的輔助函數(shù)ShowFont用來顯示文本。可以用Add Member Function的方法加入,也可以直接修改代碼 在82View.h中加入 private: void ShowFont(CDC* pDC, int& nPos, int nPoints); /以下為原生成代碼,不需
32、改變. 在82View.cpp中加入 void CMy82View:ShowFont(CDC* pDC, int& nPos, int nPoints) TEXTMETRIC tm; TEXTMETRIC結構包含字體的所有邏輯單位信息原型如下:typedef struct tagTEXTMETRIC /* tm */int tmHeight; int tmAscent; int tmDescent; int tmInternalLeading; int tmExternalLeading; int tmAveCharWidth; int tmMaxCharWidth; int tmWe
33、ight; BYTE tmItalic;BYTE tmUnderlined; BYTE tmStruckOut;BYTE tmFirstChar; BYTE tmLastChar;BYTE tmDefaultChar; BYTE tmBreakChar; BYTE tmPitchAndFamily; int tmOverhang;int tmDigitizedAspectX; int tmDigitizedAspectY; TEXTMETRIC; CFont fontText; CString strText; CSize sizeText; ANSI_CHARSET, OUT_DEFAULT
34、_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN, "Tahoma"); /調(diào)用CFont:CreateFont函數(shù),建立GDI的字體對象,參數(shù)1和2是字體的高度和寬度,最后一個參數(shù)是字體的名稱CFont* pOldFont = (CFont*) pDC->SelectObject(&fontText);/將新字體選進設備,并返回指向前一次被選對象的指針。作用保存原來的對象,以便完成任務時恢復它 pDC->GetTextMetrics(&tm);/參數(shù)是
35、指向TEXTMETRIC結構的指針,得到當前字體的屬性,strText.FormanPoint t("%d磅 WINDOWS 中文字體范例 1234567890", s); sizeText = pDC->GetTextExtent(strText); pDC->TextOut(0, nPos, strText); pDC->SelectObject(pOldFont);/恢復原來的對象 nPos -= tm.tmHeight + tm.tmExternalLeading; 4)編輯CMy82View:OnDraw函數(shù) void CMy82View:OnD
36、raw(CDC* pDC)int nPosition = 0; for (int i = 12; i <= 24; i += 2) ShowFont(pDC, nPosition, i); 五、圖形繪畫程序的具體實現(xiàn)(一)畫筆操作實現(xiàn)在程序運行時,軟件按鼠標拖動的軌跡繪制任意的線條6。在畫布上單擊鼠標左鍵或者右鍵時,令畫筆的繪圖標志為真,并將當前坐標作為下一次繪圖的起始坐標。在Picture1的MouseDown事件中添加以下代碼:canpen = Truepicture1.CurrentX = x: picture1.CurrentY = y在鼠標拖動的過程中,若繪圖標志為真并且鼠標按
37、鍵按下,則不斷地由當前坐標向新坐標的坐標畫極短的直線。在Picture1的MouseMove事件中添加以下代碼:If canpen And Button <> 0 Thenpicture1.Line -(x, y), picture1.ForeColorEnd If當釋放鼠標左鍵時,令繪圖標志位為False,并保存當前繪圖所用顏色,結束繪圖,在Picture1的MouseUp事件中添加以下代碼:fill_fixed_color = picture1.ForeColor '給油漆桶提供邊框顏色canpen = False橡皮擦操作與畫筆操作的編程思路相同。在使用橡皮工具時鼠標
38、指針的變更為十字形,Shape1作為擦除區(qū)域設置為可見。擦除區(qū)域的大小可根據(jù)線寬設置。在Picture1的MouseDown事件中添加以下代碼:canrubber = Truepicture1.CurrentX = x: picture1.CurrentY = yShape1.Visible = Truepicture1.MousePointer = 2Shape1.Width = (Combo1.ListIndex + 1) * 10Shape1.Height = (Combo1.ListIndex + 1) * 10(二)填充的實現(xiàn)以指定顏色填充任意閉合區(qū)域,該功能必須通過調(diào)用window
39、s的API函數(shù)來實現(xiàn)。聲明API函數(shù):Public Declare Function FloodFill Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long以Pictures1當前的前景色創(chuàng)建一個筆刷,用該筆刷代替原來的筆刷,在調(diào)用FloodFill函數(shù)完成填充后,還原原來的筆刷。編寫代碼如下:hBrush = CreateSolidBrush(picture1.ForeColor)hOldBrush = SelectObject(p
40、icture1.hdc, hBrush)FloodFill picture1.hdc, x, y, fill_fixed_colorSelectObject picture1.hdc, hOldBrushDeleteObject hBrush(三)直線繪制的實現(xiàn)在程序運行時,軟件按鼠標拖動的軌跡繪制任意方向的直線7。在畫布上單擊鼠標左鍵或者右鍵時,令畫直線的繪圖標志為真,保存當前的繪圖坐標,設置DrawMode為異或方式。在Picture1的MouseDown事件中添加以下代碼:canline = Truex0 = x: y0 = yxnow = x: ynow = ypicture1.Dra
41、wMode = 7在鼠標拖動的過程中,若繪圖標志為真并且鼠標按鍵按下,則不斷循環(huán)兩條語句,第一條語句用于畫一條直線與前一個循環(huán)所畫的直線重合,由于繪圖方式是異或方式,所以已畫直線直線被清除,后一條語句用于畫一條新的直線,這兩條不斷循環(huán)的語句是:picture1.Line (x0, y0)-(xnow, ynow), Not (picture1.ForeColor)picture1.Line (x0, y0)-(x, y), Not (picture1.ForeColor)再在循環(huán)中令當前鼠標坐標作為下一個循環(huán)的終點坐標xnow = x: ynow = y當釋放鼠標左鍵時,令繪圖標志位為Fals
42、e,用普通的繪圖方式將畫好的直線重新繪制一次,以免和之前繪制的直線重疊而導致直線被清除。保存當前繪圖所用顏色,結束繪圖,在Picture1的MouseUp事件中添加以下代碼:canline = Falsepicture1.Line (x0, y0)-(xnow, ynow)picture1.DrawMode = 13picture1.Line (x0, y0)-(xnow, ynow), picture1.ForeColorfill_fixed_color = picture1.ForeColor (四)圓形繪制的實現(xiàn)在程序運行時,軟件按鼠標拖動的軌跡繪制任意大小的圓形。首先將畫布上的圖像臨時
43、復制到另一個Picture控件中。在Picture1的MouseDown事件中添加以下代碼:'新添加一個Picture控件Picture1_copy作為臨時的畫布Picture1_copy.Height = Picture1.HeightPicture1_copy.Width = Picture1.WidthPicture1_copy.Picture = Picture1.image在拖動鼠標時,用circle方法繪制圓形,每次拖動鼠標都把上一次用circle方法繪制的圖像清除并載入未繪制圓形的圖像,按新的鼠標坐標重新繪制半徑不同的圓形,從而達到預覽的效果。在Picture1的Mous
44、eMove事件中添加以下代碼:Picture1.ClsPicture1.Picture = Picture1_copy.imagePicture1.Circle (x0, y0), Sqr(x - x0) * (x - x0) + (y - y0) * (y - y0), Picture1.ForeColor最后在鼠標彈起時再次載入原來的圖像,重新繪制已經(jīng)確定半徑的圓形。在Picture1的MouseUp事件中添加以下代碼:Picture1.Picture = Picture1_copy.imagePicture1.Circle (x0, y0), Sqr(x - x0) * (x - x0)
45、 + (y - y0) * (y - y0), Picture1.ForeColor(五)矩形繪制的實現(xiàn)通過拖動鼠標可以繪制不同長寬比例的矩形。繪制矩形的編程思路和繪制直線相同,但在用Line方法繪制圖形時,應設置第三個參數(shù)為B,這樣就可以利用對角坐標畫出矩形。用橡皮筋畫法實現(xiàn)矩形和直線工具8。繪制矩形工具的流程圖,如圖3-9所示: Picture1.Line (x0, y0)-(xnow, ynow),not(picture1.forecolor), B Picture1.Line (x0, y0)-(x, y),not(picture1.forecolor) , B(六)圓角矩形的繪制實現(xiàn)
46、通過拖動鼠標可以繪制不同長寬比例的矩形,該功能的實現(xiàn)和繪制圓形的思路一致,但必須通過調(diào)用Windows的API函數(shù)來實現(xiàn)。聲明API函數(shù):Public Declare Function RoundRect Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long在繪制圓角矩形時調(diào)用API函數(shù),x0,y0是鼠標的起始坐標,在MouseDown
47、事件獲得,最后的兩個參數(shù)是圓弧的角度:RoundRect Picture1.hdc, x0, y0, x, y, 20, 20(七)多邊形繪制實現(xiàn)在程序運行時,依次按下鼠標按鍵,軟件將以按下按鍵的坐標連接直線,最后雙擊鼠標按鍵,終點坐標和起始坐標首尾相連形成封閉的多邊形。用Line控件任意繪制一條線段。當鼠標在畫布上點擊時,該線段獲得其中一個端點坐標,拖動鼠標時獲得該線段的另一端點坐標,并達到預覽的效果,再次單擊鼠標按鍵時,用Line方法繪制該線段,此時該多邊形的第一條線段繪制完畢,存儲起點坐標為和終點坐標。再次拖動鼠標時,又可由Line控件預覽,用Line方法繪制線段9。在Picture1的
48、MouseDown中編寫代碼如下:If Button <> 0 Thenlpoly.X1 = xlpoly.Y1 = yIf Fstkey = False Then Picture1.Line (oldPoint.x, oldPoint.y)-(x, y), Picture1.ForeColorElseFstkey = Falselpoly.Visible = TrueFstPoint.x = x FstPoint.y = yEnd IfoldPoint.x = x oldPoint.y = yEnd If在Picture1的MouseMove和MouseUp中編寫代碼如下:lpoly.X2 = xlpoly.Y2 = y雙擊鼠標時,將最初繪制線段的起點坐標和最后繪制的線段的終點坐標相連,在Picture1的DblClick事件中編寫代碼如下:Picture1.Line (oldPoint.x, oldPoint.y)-(FstPoint.x, FstPoint.y), Picture1.ForeColor (八)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度攤鋪機租賃與操作培訓合同范本
- 個人合伙的協(xié)議書(15篇)
- 設計方案評審函
- 2025年健身俱樂部事故免責合同
- 2025年人工智能合作協(xié)議書
- 2025年臨時用電合作協(xié)議書規(guī)范文本
- 2025年飛機空調(diào)車ACM項目規(guī)劃申請報告模稿
- 2025年共同經(jīng)營商業(yè)地產(chǎn)合作協(xié)議
- 2025年短期勞動合同范例
- 2025年專利申請授權實施合同樣本
- 社交禮儀-儀態(tài)禮儀
- 2024暑期夏日露營潮趣互動音樂節(jié)(唱享潮夏旋律季)活動策劃方案
- 臨床成人ICU患者外周動脈導管管理要點
- 2024年長沙衛(wèi)生職業(yè)學院單招職業(yè)適應性測試題庫及參考答案
- 《讓學生創(chuàng)造著長大》讀書心得
- 江蘇省連云港市灌南華僑高級中學2024屆高三第二次模擬考試數(shù)學試卷含解析
- 畢業(yè)旅游活動設計與實施方案
- 政企業(yè)務部門培訓
- 2024年高考歷史:全3冊核心知識梳理和大事年表
- 非標設備方案
- 2024-2026招商信諾人壽中國健康指數(shù)白皮書
評論
0/150
提交評論