版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、繪圖系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)目 錄一、繪圖系統(tǒng)概述1二、硬件系統(tǒng)組成2(一)主機(jī)2(二)外存儲(chǔ)器2(三)圖形輸入設(shè)備2(四)圖形輸出設(shè)備3三、軟件系統(tǒng)概述4(一)系統(tǒng)軟件4(二)支撐軟件4(三)計(jì)算機(jī)繪圖應(yīng)用軟件4四、圖形操作的基本知識(shí)介紹5(一)CD和CDC類的介紹5(二)CDI和CGdiobject類5(三)圖形操作中顏色的變化7五、圖形繪畫程序的具體實(shí)現(xiàn)11(一)畫筆操作實(shí)現(xiàn)11(二)填充的實(shí)現(xiàn)11(三)直線繪制的實(shí)現(xiàn)12(四)圓形繪制的實(shí)現(xiàn)12(五)矩形繪制的實(shí)現(xiàn)13(六)圓角矩形的繪制實(shí)現(xiàn)13(七)多邊形繪制實(shí)現(xiàn)13(八)噴槍的實(shí)現(xiàn)14(九)運(yùn)行程序界面15六、系統(tǒng)測試16七、結(jié)束語17參考文
2、獻(xiàn)18繪圖系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)摘 要自從上世紀(jì)計(jì)算機(jī)系統(tǒng)向繪畫界的延伸以來,繪圖技術(shù)已成為計(jì)算機(jī)系統(tǒng)不可分割的一部分。而圖形編輯器又是圖形編輯軟件的基礎(chǔ),幾乎所有的圖形編輯軟件,都是在擁有基本圖形編輯功能的基礎(chǔ)上實(shí)現(xiàn)更復(fù)雜功能的。故在圖形應(yīng)用非常廣泛的今天,研究開發(fā)繪圖系統(tǒng)是非常有意義的。本文主要經(jīng)過對(duì)繪圖系統(tǒng)軟硬件配置的分析,就繪圖系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)進(jìn)行了合理的闡述。在基于MFC的操作環(huán)境中,通過對(duì)CD、CDC類以及CDI、CGdiobject類的應(yīng)用,在繪圖方面實(shí)現(xiàn)繪制直線、矩形、圓形等基本功能,在界面設(shè)計(jì)方面實(shí)現(xiàn)了對(duì)圖形的操作,從而從底層對(duì)繪圖系統(tǒng)進(jìn)行簡單的實(shí)現(xiàn)。關(guān)鍵詞:硬件系統(tǒng)組成 軟件系統(tǒng)構(gòu)
3、架 圖形操作及繪畫技術(shù) 基本繪圖功能 圖形界面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)概述計(jì)算機(jī)繪圖系統(tǒng)是基于計(jì)算機(jī)的系統(tǒng),由軟件系統(tǒng)和硬件系統(tǒng)組成。其中,軟件是計(jì)算機(jī)繪圖系統(tǒng)的核心,而相
7、應(yīng)的系統(tǒng)硬件設(shè)備則為軟件的正常運(yùn)行提供了基礎(chǔ)保障和運(yùn)行環(huán)境。另外,任何功能強(qiáng)大的計(jì)算機(jī)繪圖系統(tǒng)都只是一個(gè)輔助工具,系統(tǒng)的運(yùn)行離不開系統(tǒng)使用人員的創(chuàng)造性思維活動(dòng)。因此,使用計(jì)算機(jī)繪圖系統(tǒng)的技術(shù)人員也屬于系統(tǒng)組成的一部分,將軟件、硬件及人這三者有效地融合在一起,是發(fā)揮計(jì)算機(jī)系統(tǒng)強(qiáng)大功能的前提。從上世紀(jì)計(jì)算機(jī)系統(tǒng)向繪畫界得引入到現(xiàn)在,計(jì)算機(jī)繪圖已然成為計(jì)算機(jī)圖形學(xué)的一個(gè)重要分支,其主要特點(diǎn)是向計(jì)算機(jī)輸入非圖形信息,由計(jì)算機(jī)處理后生成圖形輸出。二、硬件系統(tǒng)組成通常,將用戶進(jìn)行計(jì)算機(jī)繪圖作業(yè)的獨(dú)立硬件環(huán)境稱作計(jì)算機(jī)繪圖的硬件系統(tǒng)。計(jì)算機(jī)繪圖的硬件主要由主機(jī)、輸入設(shè)備(鍵盤、鼠標(biāo)、掃描儀等)、輸出設(shè)備(顯
8、示器、繪圖儀、打印機(jī)等)、信息存儲(chǔ)設(shè)備(主要指外存,如硬盤、軟盤、光盤等)、以及網(wǎng)絡(luò)設(shè)備、多媒體設(shè)備等組成1。如圖1-1所示圖2.1 計(jì)算機(jī)繪圖系統(tǒng)的基本硬件組成(一)主機(jī)主機(jī)由中央處理器(CPU)和內(nèi)存儲(chǔ)器(簡稱內(nèi)存)組成,是整個(gè)計(jì)算機(jī)繪圖系統(tǒng)的核心。衡量一個(gè)主機(jī)性能的指標(biāo)中相互要有兩項(xiàng):CPU性能和內(nèi)存容量。1CPU性能CPU的性能決定著計(jì)算機(jī)的數(shù)據(jù)處理能力、運(yùn)算精度和速度。CPU的性能通常用每秒可執(zhí)行的指令數(shù)目或進(jìn)行浮點(diǎn)運(yùn)算的速度指標(biāo)來衡量,其單位符號(hào)為MI/S(每秒處理1百萬條指令)和GI/S(每秒處理10億條指令)。目前,CPU的速度已達(dá)到160GI/S以上。一般情況下,用芯片的時(shí)鐘
9、頻率來表示運(yùn)算速度更為普遍,時(shí)鐘頻率越高,運(yùn)算速度越快。2.內(nèi)存容量內(nèi)存是存放運(yùn)算程序、原始數(shù)據(jù)、計(jì)算結(jié)果等內(nèi)容的記憶裝置。如果內(nèi)存容量過小,將直接影響計(jì)算機(jī)繪圖軟件系統(tǒng)的運(yùn)行效果。因?yàn)?,?nèi)存容量越大,主機(jī)能容納和處理的信息量也就越大。(二)外存儲(chǔ)器外存儲(chǔ)器簡稱為外存,雖然內(nèi)存儲(chǔ)器可以直接和運(yùn)算器、控制器交換信息,存取速度很快,但內(nèi)存儲(chǔ)器成本較高,且其容量受到CPU直接尋址能力的限制。外存作為內(nèi)存的后援,是計(jì)算機(jī)繪圖系統(tǒng)將大量程序、數(shù)據(jù)庫、圖形庫存放在外存器中,待需要時(shí)再調(diào)入內(nèi)存進(jìn)行處理。外存儲(chǔ)器通常包括硬盤、軟盤、光盤等。(三)圖形輸入設(shè)備在計(jì)算機(jī)繪圖作業(yè)過程中,不僅要求用戶能夠快速輸入圖形
10、,而且還要求能夠?qū)⑤斎氲膱D形以人機(jī)交互方式進(jìn)行修改,以及對(duì)輸入的圖形進(jìn)行圖形變換(如縮放、平移、旋轉(zhuǎn))等操作。因此,圖形輸入設(shè)備在計(jì)算機(jī)繪圖硬件系統(tǒng)中占有重要的地位。目前,計(jì)算機(jī)繪圖系統(tǒng)常用的輸入設(shè)備有鍵盤、鼠標(biāo)、掃描儀等。(四)圖形輸出設(shè)備圖形輸出設(shè)備包括圖形顯示器、繪圖儀、打印機(jī)等。圖形顯示器是計(jì)算機(jī)繪圖系統(tǒng)中最為重要的硬件設(shè)備之一,主要用于圖形圖像的顯示和人機(jī)交互操作,是一種交互式的圖形顯示設(shè)備,其主要部件是陰極射線管(CRT)。它有3種類型:直接存儲(chǔ)管式顯示器、射線刷新式顯示器、光柵掃描式顯示器。目前,交互式圖形系統(tǒng)采用的主流顯示器是基于CRT的光柵掃描式顯示器。其工作原理與電視機(jī)相似
11、,不同之處在于電視機(jī)利用攝像機(jī)產(chǎn)生的模擬信號(hào)構(gòu)成屏幕上的圖像,而光柵掃描式顯示器則利用計(jì)算機(jī)產(chǎn)生的數(shù)字信號(hào)構(gòu)成屏幕上的圖像。衡量顯示器性能的主要指標(biāo)是分辨率和顯示速度。對(duì)于光柵掃描式顯示器而言,沿水平和垂直方向單位長度上所能識(shí)別的最大光點(diǎn)數(shù)稱為分辨率(光點(diǎn)也稱為像素)。對(duì)于相同尺寸的屏幕,點(diǎn)數(shù)越多,距離越小,分辨率就越高,顯示的圖形也越精細(xì)。顯示速度同顯示器在輸出圖形時(shí)采用的分辨率以及計(jì)算機(jī)本身處理圖形的速度有關(guān)。從人機(jī)工程學(xué)的角度來看,通常應(yīng)滿足人眼觀察圖形時(shí)不出現(xiàn)閃爍這一基本要求,圖形屏幕的刷新速度應(yīng)不低于30幀/秒。隨著人們對(duì)顯示器輕型化、薄型化以及大尺寸的要求,目前,液晶顯示器和等離子
12、顯示器的應(yīng)用越來越多。由于這些顯示器的制造成本逐漸降低,已呈現(xiàn)出取代基于CRT的光柵掃描式顯示器的趨勢。繪圖儀、打印機(jī)等也是目前常用的圖形輸出設(shè)備。目前,常用的繪圖儀為滾筒式繪圖儀,這種繪圖儀具有結(jié)構(gòu)簡單緊湊、圖紙長度不受限制、價(jià)格便宜、占用工作面積小等優(yōu)點(diǎn)。常用的打印機(jī)主要有針式、噴墨、激光打印機(jī)等。三、軟件系統(tǒng)概述計(jì)算機(jī)軟件是指控制計(jì)算機(jī)運(yùn)行,并使計(jì)算機(jī)發(fā)揮最大功效的各種程序、數(shù)據(jù)及文檔的集合。在計(jì)算機(jī)繪圖系統(tǒng)中,軟件配置水平?jīng)Q定著整個(gè)計(jì)算機(jī)繪圖系統(tǒng)的性能優(yōu)劣。因此可以說硬件是計(jì)算機(jī)繪圖系統(tǒng)的物質(zhì)基礎(chǔ),而軟件則是計(jì)算機(jī)繪圖系統(tǒng)的核心。從計(jì)算機(jī)繪圖系統(tǒng)的發(fā)展趨勢來看,軟件占據(jù)著愈來愈重要的地
13、位,目前,系統(tǒng)配置中的軟件成本已經(jīng)超過了硬件。目前而言,計(jì)算機(jī)繪圖系統(tǒng)的軟件可以分為3個(gè)層次,即系統(tǒng)軟件、支撐軟件和應(yīng)用軟件。系統(tǒng)軟件是與計(jì)算機(jī)硬件直接關(guān)聯(lián)的軟件,一般由專業(yè)的軟件開發(fā)人員研制,它起著擴(kuò)充計(jì)算機(jī)的功能以及合理調(diào)度與使用計(jì)算機(jī)的作用。系統(tǒng)軟件有2個(gè)特點(diǎn):一是公用性,無論哪個(gè)應(yīng)用領(lǐng)域都要用到它;二是基礎(chǔ)性,各種支撐軟件及應(yīng)用軟件都需要在系統(tǒng)軟件的支撐下運(yùn)行。支撐軟件是在系統(tǒng)軟件的基礎(chǔ)上研制的,它包括進(jìn)行計(jì)算機(jī)繪圖作業(yè)時(shí)所需的各種通用軟件。應(yīng)用軟件則是在系統(tǒng)軟件及支撐軟件支持下,為實(shí)現(xiàn)某個(gè)應(yīng)用領(lǐng)域內(nèi)的特定任務(wù)而開發(fā)的軟件。下面分別對(duì)這3類軟件進(jìn)行具體介紹。 (一)系統(tǒng)軟件系統(tǒng)軟件主要
14、用于計(jì)算機(jī)的管理、維護(hù)、控制、運(yùn)行,以及計(jì)算機(jī)程序的編譯、裝載和運(yùn)行。系統(tǒng)軟件包括操作系統(tǒng)和編譯系統(tǒng)。操作系統(tǒng)主要承擔(dān)對(duì)計(jì)算機(jī)的管理工作,其主要功能包括文件管理(建立、存儲(chǔ)、刪除、檢索文件)、外部設(shè)備管理(管理計(jì)算機(jī)的輸入、輸出等外部硬件設(shè)備)、內(nèi)存分配管理、作業(yè)管理和中斷管理。操作系統(tǒng)的種類很多,在工作站上主要采用UNIX、Windows 2000/NT/XP等;在微機(jī)上主要采用UNIX的變種XENIX、ONIX、VENIX,以及Windows系列操作系統(tǒng)。編譯系統(tǒng)的作用是將用高級(jí)語言編寫的程序翻譯成計(jì)算機(jī)能夠直接執(zhí)行的機(jī)器指令。有了編譯系統(tǒng),用戶就可以用接近于人類自然語言和數(shù)學(xué)語言的方式編
15、寫程序,而翻譯成機(jī)器指令的工作則由編譯系統(tǒng)完成。這樣就可以使非計(jì)算機(jī)專業(yè)的各類工程技術(shù)人員很容易地用計(jì)算機(jī)來實(shí)現(xiàn)其繪圖目的。目前,國內(nèi)外廣泛應(yīng)用的高級(jí)語言FORTRAN、PASCAL、C/C+、Visual Basic、LISP等均有相應(yīng)的編譯系統(tǒng)2。(二)支撐軟件支撐軟件是計(jì)算機(jī)繪圖軟件系統(tǒng)中的核心,是為滿足計(jì)算機(jī)繪圖工作中一些用戶的共同需要而開發(fā)的通用軟件。近30多年來,由于計(jì)算機(jī)應(yīng)用領(lǐng)域迅速擴(kuò)大,支撐軟件的開發(fā)研制有了很大的進(jìn)展,推出了種類繁多的商品化支撐軟件。(三)計(jì)算機(jī)繪圖應(yīng)用軟件應(yīng)用軟件是在系統(tǒng)軟件、支撐軟件的基礎(chǔ)上,針對(duì)某一專門應(yīng)用領(lǐng)域而開發(fā)的軟件。這類軟件通常由用戶結(jié)合當(dāng)前繪圖
16、工作的需要自行研究開發(fā)或委托開發(fā)商進(jìn)行開發(fā),此項(xiàng)工作又稱為“二次開發(fā)”。能否充分發(fā)揮已有計(jì)算機(jī)繪圖系統(tǒng)的功能,應(yīng)用軟件的技術(shù)開發(fā)工作是很重要的,也是計(jì)算機(jī)繪圖從業(yè)人員的主要任務(wù)之一四、圖形操作的基本知識(shí)介紹(一)CD和CDC類的介紹CDC是設(shè)備環(huán)境類的基類直接由CObject派生。是GDI的關(guān)鍵元素,它代表了物理設(shè)備。每一個(gè)C+設(shè)備環(huán)境對(duì)象都有相對(duì)應(yīng)Windows設(shè)備環(huán)境,并通過一個(gè)32位類型的HDC句柄來標(biāo)識(shí)。CDC類的虛擬性使我們可以很容易的做到編寫同時(shí)適用于多種設(shè)備的代碼。例如OnDraw函數(shù)的pDC->TextOut(0,0,"Hello");既可以適用于顯示
17、器、還可以適用于打印預(yù)覽和打印,只需要在CView:OnDraw函數(shù)的pDC參數(shù)指向不同的對(duì)象類3。CClientDC和CWindowDC是顯示設(shè)備環(huán)境類,都是由CDC派生而來,區(qū)別在于CClientDC是窗口的客戶區(qū)不包括邊框、標(biāo)題欄和菜單欄,(0,0)指客戶區(qū)域的左上角。CWindowDC的(0,0)指整個(gè)屏幕的左上角,這意味著我們可以在顯示器的任意地方繪圖,包括窗口邊框、標(biāo)題欄和菜單欄等等。CWindowDC一般應(yīng)用在框架窗口,而不是視圖窗口。CDC對(duì)象被創(chuàng)建后一定要在合適的時(shí)候?qū)⑺鼊h除掉,如果忘記了刪除設(shè)備環(huán)境對(duì)象則會(huì)造成內(nèi)存丟失。如何做才能避免出現(xiàn)這個(gè)問題呢,我們應(yīng)該在堆棧中構(gòu)造對(duì)象
18、??蠢? 例子void CMyView:OnLButtonDown(UINT nFlags,CPoint point) CRect rect; CClientDC dc(this); /在堆棧中構(gòu)造設(shè)備環(huán)境對(duì)象,用一個(gè)窗口指針this作參數(shù)。 dc.GetClipBox(rect); /GetClipBox函數(shù)是一個(gè)虛函數(shù),作用是可以獲得選定區(qū)域的尺寸 /析構(gòu)函數(shù)在函數(shù)返回時(shí)自動(dòng)調(diào)用,也就完成對(duì)設(shè)備環(huán)境對(duì)象的刪除。書上還給出了另一種寫法:void CMyView:OnLButtonDown(UINT nFlags,CPoint point)CRect rect; CDC * pDC=GetD
19、C(); /通過調(diào)用CWnd的GetDC()函數(shù)獲得設(shè)備環(huán)境指針pDC->GetClipBox(rect); /可以獲得選定區(qū)域的尺寸 ReleaseDC(pDC); /一定不能忘記,釋放設(shè)備環(huán)境。(書上寫錯(cuò)了) 創(chuàng)建的設(shè)備環(huán)境對(duì)象具有一些默認(rèn)的特性,通過CDC類的成員函數(shù)可以設(shè)定這些特性。例如前一篇筆記用到的刷子、映射模式等等。我們還可以通過重載SelectObject函數(shù)將GDI對(duì)象選進(jìn)設(shè)備環(huán)境中。(二)CDI和CGdiobject類 GDI對(duì)象是通過CGdiObject派生類的C+對(duì)象來表示的4。CBrush是一個(gè)GDI的派生類,它在MFC中的層次結(jié)構(gòu)是這樣的:CObject派生C
20、GdiObject派生CBrush,明白了吧。CGdiObject是所有GDI對(duì)象的抽象基類。下面列出的是GDI派生類的列表:CBitmap:位圖是一種位矩陣,每一個(gè)顯示象素都對(duì)應(yīng)于其中的一個(gè)或多個(gè)位,可以用來表示圖象,也可以用來創(chuàng)建刷子 CBrush:刷子定義了一種位圖形式的象素,可以用來對(duì)區(qū)域內(nèi)部填充顏色。 CFont:字體是一種具有某種風(fēng)格和尺寸的所有字符的完整集合,常常被作為資源,其中一些依賴某種設(shè)備。CPalette:調(diào)色板是一種顏色映射接口,它允許應(yīng)用程序在不影響其他應(yīng)用程序的前提下,可以充分利用輸出設(shè)備的顏色描繪能力。CPen:筆是一種用來畫線及繪制有形邊框的工具,可以指定它的顏
21、色及寬度,并可以指定畫虛線、點(diǎn)線還是實(shí)線。CRgn:區(qū)域是由多邊形、橢圓二者組合形成的一種范圍,可以用來進(jìn)行填充、裁剪、鼠標(biāo)點(diǎn)中測試等等。 以上很容易理解,可以用WINDOWS的畫圖幫助我們理解。CGdiObject類很眼生,看過很多代碼就沒有看到過它,原因是由于CGdiObject類是所有GDI對(duì)象類的虛擬基類,所以我們不必創(chuàng)建CGdiObject類的對(duì)象,可以直接構(gòu)造它的派生類的對(duì)象,例如這樣 CPen newPen(PS_DASHDOTDOT,2,(COLORREF) 0); /黑色的筆寬度為2 但需要注意的是CFont和CRgn的對(duì)象建立需要先調(diào)用默認(rèn)的構(gòu)造函數(shù)來構(gòu)造C+對(duì)象,然后再調(diào)
22、用相應(yīng)的創(chuàng)建函數(shù)如:CreateFont或CreatePolygonRgn等。CGdiObject類有一個(gè)虛擬的析構(gòu)函數(shù),它派生類的析構(gòu)函數(shù)需要將與C+對(duì)象相關(guān)聯(lián)的GDI對(duì)象刪除掉,一定要在退出程序之前把構(gòu)造的CGdiObject派生類對(duì)象干掉。因?yàn)橐粋€(gè)沒有釋放的GDI對(duì)象會(huì)占用很多的內(nèi)存。讓我們用一個(gè)例子跟蹤一下GDI對(duì)象 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); /在將新對(duì)象選進(jìn)設(shè)備環(huán)境的同時(shí)返回指向前一次被選對(duì)象的指針。作用保存原來的對(duì)象,以便完成任務(wù)時(shí)恢復(fù)它。pDC->MoveTo (10,20);pDC->LineTo (110,20); pDC->SelectObject (pOldPen);/把原來的對(duì)象恢復(fù) pDC->MoveTo (10,30); pDC->LineTo (110,30); 屏幕上應(yīng)該顯示三條線,第一條和第三條一樣顏色和粗細(xì)因?yàn)樗麄兌际怯玫脑O(shè)備環(huán)境默認(rèn)的CPen對(duì)象,第二條是一條用我們自己設(shè)
24、定的CPen對(duì)象。我們可以看出在將新對(duì)象選進(jìn)設(shè)備環(huán)境的同時(shí)返回指向前一次被選對(duì)象的指針。作用保存原來的對(duì)象,以便完成任務(wù)時(shí)恢復(fù)它。 Windows還包含有一些可以利用的庫存對(duì)象,它們不會(huì)被刪除,因?yàn)閃indows對(duì)企圖刪除它們的動(dòng)作不予理睬。我們可以用SelectStockObject函數(shù)將它們選進(jìn)設(shè)備環(huán)境。下面列出的是所有的有關(guān)刷子、筆、字體和調(diào)色板的庫存對(duì)象。 由于SelectObject函數(shù)返回的GDI C+對(duì)象指針具有臨時(shí)性,當(dāng)程序的空閑處理階段或者控制函數(shù)返回時(shí)應(yīng)用程序框架會(huì)將臨時(shí)的C+對(duì)象刪除,我們不能簡單的把這一指針保存在類的數(shù)據(jù)成員中,而應(yīng)該借助GetSafeHdc函數(shù)將它轉(zhuǎn)化
25、為Windows的句柄,以便持久的保存GDI的標(biāo)識(shí)。void CMy10View:OnDraw(CDC* pDC) HPEN m_hPen; /一個(gè)指向CPen對(duì)象的指針pDC->MoveTo (10,10); pDC->LineTo (110,10); COLORREF) 192); /紅色的筆寬度為10 CPen * pOldPen=pDC->SelectObject (&newPen); /在將新對(duì)象選進(jìn)設(shè)備環(huán)境的同時(shí)返回指向前一次被選對(duì)象的指針。作用保存原來的對(duì)象,以便完成任務(wù)時(shí)恢復(fù)它。m_hPen=(HPEN)pOldPen->GetSafeHandl
26、e ();/獲得并保存原來對(duì)象的句柄 pDC->MoveTo (10,20); pDC->LineTo (110,20); pDC->SelectObject (CPen:FromHandle (m_hPen);/把原來的對(duì)象恢復(fù),和例子7-2不同的是通過句柄pDC->MoveTo (10,30); pDC->LineTo (110,30); 補(bǔ)充一下IGDI派生類的Windows handle type列表 CPen HPENCBrush HBRUSH CFont HFONT CBitmap HBITMACRgn HRGN (三)圖形操作中顏色的變化標(biāo)準(zhǔn)的VGA
27、顯示卡使用的是8位顏色寄存器,所以它可以表示出262144種顏色,然而由于視頻內(nèi)存的限制、標(biāo)準(zhǔn)的VGA只能采用4位顏色代碼,一次只能同時(shí)顯示16種標(biāo)準(zhǔn)純色。太少了不是嗎?如何獲得更加豐富的色彩呢,面向顏色的GDI函數(shù)可以使我們獲得更多的顏色。每一種WINDOWS的顏色都是通過8位RGB值的組合來表示,面向顏色的GDI函數(shù)可以接收32位的COLORREF參數(shù),這種類型的參數(shù)包含了8位的紅、綠、藍(lán)顏色值。WINDOWS的RGB宏可以將8位的紅綠藍(lán)值轉(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ù)中設(shè)定文本的背景色和前景色,我們?cè)囍淖僐GB宏的數(shù)值,會(huì)發(fā)現(xiàn)SetBkColor和SetTextColor函數(shù)并不總是顯示模糊色,如果模糊色過于復(fù)雜,它們會(huì)選擇與之相近的純色來顯示。書上是這樣說的。以目前的硬件設(shè)備來說我們可以在1024X768的方式下獲得24位真彩色,這意味著我們可以通過RGB宏
29、獲得任何我們想要的顏色,其實(shí)我們的肉眼已經(jīng)不能分辨它們的區(qū)別了。其實(shí)256色已經(jīng)足夠作出很精美的畫面了。 下面我們來看看字體。字體是GDI對(duì)象,和其他GDI對(duì)象一樣它可以按比例縮放,被裁剪,可以被選進(jìn)設(shè)備環(huán)境,并可以被釋放和刪除。書上對(duì)于字體部分描述實(shí)在令我不愿意讀,我想大家可能也是這樣的心情。那好我們便不去讀它,直接用一個(gè)例子來理解字體。例子1)建立一個(gè)新MFC AppWizard(exe)項(xiàng)目“82”,除選擇單文檔外其余全用默認(rèn)項(xiàng)。 2)重載My82View類的OnPrepareDC函數(shù) void CMy82View:OnPrepareDC(CDC* pDC, CPrintInfo* pI
30、nfo) pDC->SetMapMode (MM_ANISOTROPIC);/應(yīng)該還記得此種映射模式是X,Y的比例因子可以獨(dú)立變化pDC->SetWindowExt (1440,1440);/將映射模式設(shè)置成邏輯twips即一個(gè)邏輯單位等于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 每邏輯英寸的水平點(diǎn)數(shù) 96 LOGPIXEXSY 每邏輯英寸的垂直點(diǎn)數(shù) 96 3)加入一個(gè)Private類型的輔助函數(shù)ShowFont用來顯示文本??梢杂肁dd 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結(jié)構(gòu)包含字體的所有邏輯單位信息原型如下: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的字體對(duì)象,參數(shù)1和2是字體的高度和寬度,最后一個(gè)參數(shù)是字體的名稱CFont* pOldFont = (CFont*) pDC->SelectObject(&fontText);/將新字體選進(jìn)設(shè)備,并返回指向前一次被選對(duì)象的指針。作用保存原來的對(duì)象,以便完成任務(wù)時(shí)恢復(fù)它 pDC->GetTextMetrics(&tm);/參數(shù)是
35、指向TEXTMETRIC結(jié)構(gòu)的指針,得到當(dāng)前字體的屬性,strText.FormanPoint t("%d磅 WINDOWS 中文字體范例 1234567890", s); sizeText = pDC->GetTextExtent(strText); pDC->TextOut(0, nPos, strText); pDC->SelectObject(pOldFont);/恢復(fù)原來的對(duì)象 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); 五、圖形繪畫程序的具體實(shí)現(xiàn)(一)畫筆操作實(shí)現(xiàn)在程序運(yùn)行時(shí),軟件按鼠標(biāo)拖動(dòng)的軌跡繪制任意的線條6。在畫布上單擊鼠標(biāo)左鍵或者右鍵時(shí),令畫筆的繪圖標(biāo)志為真,并將當(dāng)前坐標(biāo)作為下一次繪圖的起始坐標(biāo)。在Picture1的MouseDown事件中添加以下代碼:canpen = Truepicture1.CurrentX = x: picture1.CurrentY = y在鼠標(biāo)拖動(dòng)的過程中,若繪圖標(biāo)志為真并且鼠標(biāo)按
37、鍵按下,則不斷地由當(dāng)前坐標(biāo)向新坐標(biāo)的坐標(biāo)畫極短的直線。在Picture1的MouseMove事件中添加以下代碼:If canpen And Button <> 0 Thenpicture1.Line -(x, y), picture1.ForeColorEnd If當(dāng)釋放鼠標(biāo)左鍵時(shí),令繪圖標(biāo)志位為False,并保存當(dāng)前繪圖所用顏色,結(jié)束繪圖,在Picture1的MouseUp事件中添加以下代碼:fill_fixed_color = picture1.ForeColor '給油漆桶提供邊框顏色canpen = False橡皮擦操作與畫筆操作的編程思路相同。在使用橡皮工具時(shí)鼠標(biāo)
38、指針的變更為十字形,Shape1作為擦除區(qū)域設(shè)置為可見。擦除區(qū)域的大小可根據(jù)線寬設(shè)置。在Picture1的MouseDown事件中添加以下代碼:canrubber = Truepicture1.CurrentX = x: picture1.CurrentY = yShape1.Visible = Truepicture1.MousePointer = 2Shape1.Width = (Combo1.ListIndex + 1) * 10Shape1.Height = (Combo1.ListIndex + 1) * 10(二)填充的實(shí)現(xiàn)以指定顏色填充任意閉合區(qū)域,該功能必須通過調(diào)用window
39、s的API函數(shù)來實(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當(dāng)前的前景色創(chuàng)建一個(gè)筆刷,用該筆刷代替原來的筆刷,在調(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(三)直線繪制的實(shí)現(xiàn)在程序運(yùn)行時(shí),軟件按鼠標(biāo)拖動(dòng)的軌跡繪制任意方向的直線7。在畫布上單擊鼠標(biāo)左鍵或者右鍵時(shí),令畫直線的繪圖標(biāo)志為真,保存當(dāng)前的繪圖坐標(biāo),設(shè)置DrawMode為異或方式。在Picture1的MouseDown事件中添加以下代碼:canline = Truex0 = x: y0 = yxnow = x: ynow = ypicture1.Dra
41、wMode = 7在鼠標(biāo)拖動(dòng)的過程中,若繪圖標(biāo)志為真并且鼠標(biāo)按鍵按下,則不斷循環(huán)兩條語句,第一條語句用于畫一條直線與前一個(gè)循環(huán)所畫的直線重合,由于繪圖方式是異或方式,所以已畫直線直線被清除,后一條語句用于畫一條新的直線,這兩條不斷循環(huán)的語句是:picture1.Line (x0, y0)-(xnow, ynow), Not (picture1.ForeColor)picture1.Line (x0, y0)-(x, y), Not (picture1.ForeColor)再在循環(huán)中令當(dāng)前鼠標(biāo)坐標(biāo)作為下一個(gè)循環(huán)的終點(diǎn)坐標(biāo)xnow = x: ynow = y當(dāng)釋放鼠標(biāo)左鍵時(shí),令繪圖標(biāo)志位為Fals
42、e,用普通的繪圖方式將畫好的直線重新繪制一次,以免和之前繪制的直線重疊而導(dǎo)致直線被清除。保存當(dāng)前繪圖所用顏色,結(jié)束繪圖,在Picture1的MouseUp事件中添加以下代碼:canline = Falsepicture1.Line (x0, y0)-(xnow, ynow)picture1.DrawMode = 13picture1.Line (x0, y0)-(xnow, ynow), picture1.ForeColorfill_fixed_color = picture1.ForeColor (四)圓形繪制的實(shí)現(xiàn)在程序運(yùn)行時(shí),軟件按鼠標(biāo)拖動(dòng)的軌跡繪制任意大小的圓形。首先將畫布上的圖像臨時(shí)
43、復(fù)制到另一個(gè)Picture控件中。在Picture1的MouseDown事件中添加以下代碼:'新添加一個(gè)Picture控件Picture1_copy作為臨時(shí)的畫布Picture1_copy.Height = Picture1.HeightPicture1_copy.Width = Picture1.WidthPicture1_copy.Picture = Picture1.image在拖動(dòng)鼠標(biāo)時(shí),用circle方法繪制圓形,每次拖動(dòng)鼠標(biāo)都把上一次用circle方法繪制的圖像清除并載入未繪制圓形的圖像,按新的鼠標(biāo)坐標(biāo)重新繪制半徑不同的圓形,從而達(dá)到預(yù)覽的效果。在Picture1的Mous
44、eMove事件中添加以下代碼:Picture1.ClsPicture1.Picture = Picture1_copy.imagePicture1.Circle (x0, y0), Sqr(x - x0) * (x - x0) + (y - y0) * (y - y0), Picture1.ForeColor最后在鼠標(biāo)彈起時(shí)再次載入原來的圖像,重新繪制已經(jīng)確定半徑的圓形。在Picture1的MouseUp事件中添加以下代碼:Picture1.Picture = Picture1_copy.imagePicture1.Circle (x0, y0), Sqr(x - x0) * (x - x0)
45、 + (y - y0) * (y - y0), Picture1.ForeColor(五)矩形繪制的實(shí)現(xiàn)通過拖動(dòng)鼠標(biāo)可以繪制不同長寬比例的矩形。繪制矩形的編程思路和繪制直線相同,但在用Line方法繪制圖形時(shí),應(yīng)設(shè)置第三個(gè)參數(shù)為B,這樣就可以利用對(duì)角坐標(biāo)畫出矩形。用橡皮筋畫法實(shí)現(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(六)圓角矩形的繪制實(shí)現(xiàn)
46、通過拖動(dòng)鼠標(biāo)可以繪制不同長寬比例的矩形,該功能的實(shí)現(xiàn)和繪制圓形的思路一致,但必須通過調(diào)用Windows的API函數(shù)來實(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在繪制圓角矩形時(shí)調(diào)用API函數(shù),x0,y0是鼠標(biāo)的起始坐標(biāo),在MouseDown
47、事件獲得,最后的兩個(gè)參數(shù)是圓弧的角度:RoundRect Picture1.hdc, x0, y0, x, y, 20, 20(七)多邊形繪制實(shí)現(xiàn)在程序運(yùn)行時(shí),依次按下鼠標(biāo)按鍵,軟件將以按下按鍵的坐標(biāo)連接直線,最后雙擊鼠標(biāo)按鍵,終點(diǎn)坐標(biāo)和起始坐標(biāo)首尾相連形成封閉的多邊形。用Line控件任意繪制一條線段。當(dāng)鼠標(biāo)在畫布上點(diǎn)擊時(shí),該線段獲得其中一個(gè)端點(diǎn)坐標(biāo),拖動(dòng)鼠標(biāo)時(shí)獲得該線段的另一端點(diǎn)坐標(biāo),并達(dá)到預(yù)覽的效果,再次單擊鼠標(biāo)按鍵時(shí),用Line方法繪制該線段,此時(shí)該多邊形的第一條線段繪制完畢,存儲(chǔ)起點(diǎn)坐標(biāo)為和終點(diǎn)坐標(biāo)。再次拖動(dòng)鼠標(biāo)時(shí),又可由Line控件預(yù)覽,用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雙擊鼠標(biāo)時(shí),將最初繪制線段的起點(diǎn)坐標(biāo)和最后繪制的線段的終點(diǎn)坐標(biāo)相連,在Picture1的DblClick事件中編寫代碼如下:Picture1.Line (oldPoint.x, oldPoint.y)-(FstPoint.x, FstPoint.y), Picture1.ForeColor (八)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度民間擔(dān)保機(jī)構(gòu)與企業(yè)合作協(xié)議4篇
- 2025年西瓜種植與環(huán)保節(jié)能技術(shù)合作合同3篇
- 2025年度個(gè)人果園果樹種植與農(nóng)產(chǎn)品品牌建設(shè)合作協(xié)議4篇
- 2025年度個(gè)人藝術(shù)品收藏與鑒定服務(wù)合同4篇
- 2025年度智能運(yùn)輸承包運(yùn)輸合同模板(2024年度更新)4篇
- 2025年度智慧園區(qū)綜合管理搭建服務(wù)合同4篇
- 2025年房地產(chǎn)產(chǎn)業(yè)鏈?zhǔn)鄯糠课葙I賣合同2篇
- 2025年度虛擬現(xiàn)實(shí)技術(shù)在教育培訓(xùn)中的應(yīng)用服務(wù)合同范本4篇
- 2025年綠色環(huán)保櫥柜制造與銷售合作協(xié)議3篇
- 二零二五版摩托車行業(yè)標(biāo)準(zhǔn)制定合同范本4篇
- 副廠長競聘演講稿
- 高二物理題庫及答案
- 2024年河北省廊坊市廣陽區(qū)中考一模道德與法治試題
- 電影項(xiàng)目策劃書
- 產(chǎn)業(yè)園區(qū)金融綜合服務(wù)創(chuàng)新藍(lán)皮書(2024.1)
- 高一數(shù)學(xué)單元練習(xí)卷
- 國際標(biāo)準(zhǔn)IQ測試題及答案樣本
- 美容院管理制度章程
- 職業(yè)發(fā)展展示園林
- 統(tǒng)編版六年級(jí)下冊(cè)語文1-6單元習(xí)作課件
- 社會(huì)安全風(fēng)險(xiǎn)評(píng)估模型的研究
評(píng)論
0/150
提交評(píng)論