繪圖系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)_第1頁(yè)
繪圖系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)_第2頁(yè)
繪圖系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)_第3頁(yè)
繪圖系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)_第4頁(yè)
繪圖系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

/繪圖系統(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四、圖形操作的基本學(xué)問介紹 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)測(cè)試 16七、結(jié)束語(yǔ) 17參考文獻(xiàn) 18繪圖系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)摘要自從上世紀(jì)計(jì)算機(jī)系統(tǒng)向繪畫界的延長(zhǎng)以來,繪圖技術(shù)已成為計(jì)算機(jī)系統(tǒng)不行分割的一部分。而圖形編輯器又是圖形編輯軟件的基礎(chǔ),幾乎全部的圖形編輯軟件,都是在擁有基本圖形編輯功能的基礎(chǔ)上實(shí)現(xiàn)更困難功能的。故在圖形應(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)行簡(jiǎn)潔的實(shí)現(xiàn)。 關(guān)鍵詞:硬件系統(tǒng)組成軟件系統(tǒng)構(gòu)架圖形操作及繪畫技術(shù)基本繪圖功能圖形界面

DesignandimplementationofdrawingsystemAbstractSincethelastcentury,thecomputersystemhasbeenextendedtothepaintingindustry,computergraphicstechnologyhasbecomeanintegralpartofthesystem.Thegraphicseditorgraphicseditingsoftwareisthefoundationofalmostallofthegraphicseditingsoftware,areinpossessionofbasicgraphicseditingcapabilitiesbasedonthemorecomplexfunctions.Itiswidelyusedingraphicstoday,researchanddevelopmentofgraphicssystemsisverymeaningful.Thisarticlefocusesonthemappingsystemthroughtheanalysisofhardwareandsoftwareconfigurations,themappingsystemdesignandimplementationofareasonableset.MFC-basedoperatingenvironment,throughtheCD,CDCclass,andCDI,CGdiobjectclassapplications,toachieveinthedrawingtodrawlines,rectangles,circlesandotherbasicfunctions,implementedintheinterfacedesignofgraphicsoperations,andthusfromtheunderlyinggraphicssystemforsimpleimplementation.Keywords:HardwaresystemThesoftwaresystemstructureGraphicoperationanddrawingtechnologydrawtoolsGUI一、繪圖系統(tǒng)概述計(jì)算機(jī)繪圖系統(tǒng)是基于計(jì)算機(jī)的系統(tǒng),由軟件系統(tǒng)和硬件系統(tǒng)組成。其中,軟件是計(jì)算機(jī)繪圖系統(tǒng)的核心,而相應(yīng)的系統(tǒng)硬件設(shè)備則為軟件的正常運(yùn)行供應(yīng)了基礎(chǔ)保障和運(yùn)行環(huán)境。另外,任何功能強(qiáng)大的計(jì)算機(jī)繪圖系統(tǒng)都只是一個(gè)幫助工具,系統(tǒng)的運(yùn)行離不開系統(tǒng)運(yùn)用人員的創(chuàng)建性思維活動(dòng)。因此,運(yùn)用計(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è)備(顯示器、繪圖儀、打印機(jī)等)、信息存儲(chǔ)設(shè)備(主要指外存,如硬盤、軟盤、光盤等)、以及網(wǎng)絡(luò)設(shè)備、多媒體設(shè)備等組成[1]。如圖1-1所示圖2.1計(jì)算機(jī)繪圖系統(tǒng)的基本硬件組成(一)主機(jī)主機(jī)由中心處理器(CPU)和內(nèi)存儲(chǔ)器(簡(jiǎn)稱內(nèi)存)組成,是整個(gè)計(jì)算機(jī)繪圖系統(tǒng)的核心。衡量一個(gè)主機(jī)性能的指標(biāo)中相互要有兩項(xiàng):CPU性能和內(nèi)存容量。1.CPU性能CPU的性能確定著計(jì)算機(jī)的數(shù)據(jù)處理實(shí)力、運(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í)鐘頻率來表示運(yùn)算速度更為普遍,時(shí)鐘頻率越高,運(yùn)算速度越快。2.內(nèi)存容量?jī)?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ǔ)器簡(jiǎn)稱為外存,雖然內(nèi)存儲(chǔ)器可以干脆和運(yùn)算器、限制器交換信息,存取速度很快,但內(nèi)存儲(chǔ)器成本較高,且其容量受到CPU干脆尋址實(shí)力的限制。外存作為內(nèi)存的后援,是計(jì)算機(jī)繪圖系統(tǒng)將大量程序、數(shù)據(jù)庫(kù)、圖形庫(kù)存放在外存器中,待須要時(shí)再調(diào)入內(nèi)存進(jìn)行處理。外存儲(chǔ)器通常包括硬盤、軟盤、光盤等。(三)圖形輸入設(shè)備在計(jì)算機(jī)繪圖作業(yè)過程中,不僅要求用戶能夠快速輸入圖形,而且還要求能夠?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ī)相像,不同之處在于電視機(jī)利用攝像機(jī)產(chǎn)生的模擬信號(hào)構(gòu)成屏幕上的圖像,而光柵掃描式顯示器則利用計(jì)算機(jī)產(chǎn)生的數(shù)字信號(hào)構(gòu)成屏幕上的圖像。衡量顯示器性能的主要指標(biāo)是辨別率和顯示速度。對(duì)于光柵掃描式顯示器而言,沿水平和垂直方向單位長(zhǎng)度上所能識(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ì)顯示器輕型化、薄型化以及大尺寸的要求,目前,液晶顯示器和等離子顯示器的應(yīng)用越來越多。由于這些顯示器的制造成本慢慢降低,已呈現(xiàn)出取代基于CRT的光柵掃描式顯示器的趨勢(shì)。繪圖儀、打印機(jī)等也是目前常用的圖形輸出設(shè)備。目前,常用的繪圖儀為滾筒式繪圖儀,這種繪圖儀具有結(jié)構(gòu)簡(jiǎn)潔緊湊、圖紙長(zhǎng)度不受限制、價(jià)格便宜、占用工作面積小等優(yōu)點(diǎn)。常用的打印機(jī)主要有針式、噴墨、激光打印機(jī)等。三、軟件系統(tǒng)概述計(jì)算機(jī)軟件是指限制計(jì)算機(jī)運(yùn)行,并使計(jì)算機(jī)發(fā)揮最大功效的各種程序、數(shù)據(jù)及文檔的集合。在計(jì)算機(jī)繪圖系統(tǒng)中,軟件配置水平確定著整個(gè)計(jì)算機(jī)繪圖系統(tǒng)的性能優(yōu)劣。因此可以說硬件是計(jì)算機(jī)繪圖系統(tǒng)的物質(zhì)基礎(chǔ),而軟件則是計(jì)算機(jī)繪圖系統(tǒng)的核心。從計(jì)算機(jī)繪圖系統(tǒng)的發(fā)展趨勢(shì)來看,軟件占據(jù)著愈來愈重要的地位,目前,系統(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)度和運(yùn)用計(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)軟件主要用于計(jì)算機(jī)的管理、維護(hù)、限制、運(yùn)行,以及計(jì)算機(jī)程序的編譯、裝載和運(yùn)行。系統(tǒng)軟件包括操作系統(tǒng)和編譯系統(tǒng)。操作系統(tǒng)主要擔(dān)當(dāng)對(duì)計(jì)算機(jī)的管理工作,其主要功能包括文件管理(建立、存儲(chǔ)、刪除、檢索文件)、外部設(shè)備管理(管理計(jì)算機(jī)的輸入、輸出等外部硬件設(shè)備)、內(nèi)存支配管理、作業(yè)管理和中斷管理。操作系統(tǒng)的種類很多,在工作站上主要接受UNIX、Windows2000/NT/XP等;在微機(jī)上主要接受UNIX的變種XENIX、ONIX、VENIX,以及Windows系列操作系統(tǒng)。編譯系統(tǒng)的作用是將用高級(jí)語(yǔ)言編寫的程序翻譯成計(jì)算機(jī)能夠干脆執(zhí)行的機(jī)器指令。有了編譯系統(tǒng),用戶就可以用接近于人類自然語(yǔ)言和數(shù)學(xué)語(yǔ)言的方式編寫程序,而翻譯成機(jī)器指令的工作則由編譯系統(tǒng)完成。這樣就可以使非計(jì)算機(jī)專業(yè)的各類工程技術(shù)人員很簡(jiǎn)潔地用計(jì)算機(jī)來實(shí)現(xiàn)其繪圖目的。目前,國(guó)內(nèi)外廣泛應(yīng)用的高級(jí)語(yǔ)言FORTRAN、PASCAL、C/C++、VisualBasic、LISP等均有相應(yīng)的編譯系統(tǒng)[2]。(二)支撐軟件支撐軟件是計(jì)算機(jī)繪圖軟件系統(tǒng)中的核心,是為滿足計(jì)算機(jī)繪圖工作中一些用戶的共同須要而開發(fā)的通用軟件。近30多年來,由于計(jì)算機(jī)應(yīng)用領(lǐng)域快速擴(kuò)大,支撐軟件的開發(fā)研制有了很大的進(jìn)展,推出了種類繁多的商品化支撐軟件。(三)\o"返回頁(yè)首"計(jì)算機(jī)繪圖應(yīng)用軟件應(yīng)用軟件是在系統(tǒng)軟件、支撐軟件的基礎(chǔ)上,針對(duì)某一特地應(yīng)用領(lǐng)域而開發(fā)的軟件。這類軟件通常由用戶結(jié)合當(dāng)前繪圖工作的須要自行探討開發(fā)或托付開發(fā)商進(jìn)行開發(fā),此項(xiàng)工作又稱為“二次開發(fā)”。能否充分發(fā)揮已有計(jì)算機(jī)繪圖系統(tǒng)的功能,應(yīng)用軟件的技術(shù)開發(fā)工作是很重要的,也是計(jì)算機(jī)繪圖從業(yè)人員的主要任務(wù)之一四、圖形操作的基本學(xué)問介紹(一)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類的虛擬性使我們可以很簡(jiǎn)潔的做到編寫同時(shí)適用于多種設(shè)備的代碼。例如OnDraw函數(shù)的pDC->TextOut(0,0,"Hello");既可以適用于顯示器、還可以適用于打印預(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)當(dāng)在堆棧中構(gòu)造對(duì)象??蠢?/例子voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){CRectrect;CClientDCdc(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ì)象的刪除。書上還給出了另一種寫法:voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){CRectrect;CDC*pDC=GetDC();//通過調(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派生CGdiObject派生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è)備的顏色描繪實(shí)力。CPen:筆是一種用來畫線及繪制有形邊框的工具,可以指定它的顏色及寬度,并可以指定畫虛線、點(diǎn)線還是實(shí)線。CRgn:區(qū)域是由多邊形、橢圓二者組合形成的一種范圍,可以用來進(jìn)行填充、裁剪、鼠標(biāo)點(diǎn)中測(cè)試等等。以上很簡(jiǎn)潔理解,可以用WINDOWS的畫圖幫助我們理解。CGdiObject類很眼生,看過很多代碼就沒有看到過它,緣由是由于CGdiObject類是全部GDI對(duì)象類的虛擬基類,所以我們不必創(chuàng)建CGdiObject類的對(duì)象,可以干脆構(gòu)造它的派生類的對(duì)象,例如這樣CPennewPen(PS_DASHDOTDOT,2,(COLORREF)0);//黑色的筆寬度為2但須要留意的是CFont和CRgn的對(duì)象建立須要先調(diào)用默認(rèn)的構(gòu)造函數(shù)來構(gòu)造C++對(duì)象,然后再調(diào)用相應(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ì)象voidCMy10View::OnDraw(CDC*pDC){pDC->MoveTo(10,10);pDC->LineTo(110,10);CPennewPen(PS_DASHDOTDOT,10,(COLORREF)192);//紅色的筆寬度為10CPen*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)當(dāng)顯示三條線,第一條和第三條一樣顏色和粗細(xì)因?yàn)樗麄兌际怯玫脑O(shè)備環(huán)境默認(rèn)的CPen對(duì)象,其次條是一條用我們自己設(shè)定的CPen對(duì)象。我們可以看出在將新對(duì)象選進(jìn)設(shè)備環(huán)境的同時(shí)返回指向前一次被選對(duì)象的指針。作用保存原來的對(duì)象,以便完成任務(wù)時(shí)復(fù)原它。Windows還包含有一些可以利用的庫(kù)存對(duì)象,它們不會(huì)被刪除,因?yàn)閃indows對(duì)企圖刪除它們的動(dòng)作不予理睬。我們可以用SelectStockObject函數(shù)將它們選進(jìn)設(shè)備環(huán)境。下面列出的是全部的有關(guān)刷子、筆、字體和調(diào)色板的庫(kù)存對(duì)象。由于SelectObject函數(shù)返回的GDIC++對(duì)象指針具有臨時(shí)性,當(dāng)程序的空閑處理階段或者限制函數(shù)返回時(shí)應(yīng)用程序框架會(huì)將臨時(shí)的C++對(duì)象刪除,我們不能簡(jiǎn)潔的把這一指針保存在類的數(shù)據(jù)成員中,而應(yīng)當(dāng)借助GetSafeHdc函數(shù)將它轉(zhuǎn)化為Windows的句柄,以便許久的保存GDI的標(biāo)識(shí)。voidCMy10View::OnDraw(CDC*pDC){HPENm_hPen;//一個(gè)指向CPen對(duì)象的指針pDC->MoveTo(10,10);pDC->LineTo(110,10);COLORREF)192);//紅色的筆寬度為10CPen*pOldPen=pDC->SelectObject(&newPen);//在將新對(duì)象選進(jìn)設(shè)備環(huán)境的同時(shí)返回指向前一次被選對(duì)象的指針。作用保存原來的對(duì)象,以便完成任務(wù)時(shí)復(fù)原它。m_hPen=(HPEN)pOldPen->GetSafeHandle();//獲得并保存原來對(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派生類的Windowshandletype列表CPenHPENCBrushHBRUSHCFontHFONTCBitmapHBITMACRgnHRGN(三)圖形操作中顏色的變更標(biāo)準(zhǔn)的VGA顯示卡運(yùn)用的是8位顏色寄存器,所以它可以表示出262144種顏色,然而由于視頻內(nèi)存的限制、標(biāo)準(zhǔn)的VGA只能接受4位顏色代碼,一次只能同時(shí)顯示16種標(biāo)準(zhǔn)純色。太少了不是嗎?如何獲得更加豐富的色調(diào)呢,面對(duì)顏色的GDI函數(shù)可以使我們獲得更多的顏色。每一種WINDOWS的顏色都是通過8位RGB值的組合來表示,面對(duì)顏色的GDI函數(shù)可以接收32位的COLORREF參數(shù),這種類型的參數(shù)包含了8位的紅、綠、藍(lán)顏色值。WINDOWS的RGB宏可以將8位的紅綠藍(lán)值轉(zhuǎn)化成COLORREF參數(shù),經(jīng)過模糊處理可以得到更多的顏色。我們可以這樣創(chuàng)建刷子[5]:CBrushbrush(RGB(128,128,192));例子voidCMy81View::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ā)覺SetBkColor和SetTextColor函數(shù)并不總是顯示模糊色,假如模糊色過于困難,它們會(huì)選擇和之相近的純色來顯示。書上是這樣說的。以目前的硬件設(shè)備來說我們可以在1024X768的方式下獲得24位真彩色,這意味著我們可以通過RGB宏獲得任何我們想要的顏色,其實(shí)我們的肉眼已經(jīng)不能辨別它們的區(qū)分了。其實(shí)256色已經(jīng)足夠作出很精致的畫面了。下面我們來看看字體。字體是GDI對(duì)象,和其他GDI對(duì)象一樣它可以按比例縮放,被裁剪,可以被選進(jìn)設(shè)備環(huán)境,并可以被釋放和刪除。書上對(duì)于字體部分描述實(shí)在令我不情愿讀,我想大家可能也是這樣的心情。那好我們便不去讀它,干脆用一個(gè)例子來理解字體。例子1)建立一個(gè)新MFCAppWizard(exe)項(xiàng)目“82”,除選擇單文檔外其余全用默認(rèn)項(xiàng)。2)重載My82View類的OnPrepareDC函數(shù)voidCMy82View::OnPrepareDC(CDC*pDC,CPrintInfo*pInfo){pDC->SetMapMode(MM_ANISOTROPIC);//應(yīng)當(dā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ù)如下:在640X480辨別率下:HORZSIZE物理寬度(毫米)320VERTSIZE物理高度(毫米)240HORZRES象素寬度640VERTRES象素高度480LOGPIXEXSX每邏輯英寸的水平點(diǎn)數(shù)96LOGPIXEXSY每邏輯英寸的垂直點(diǎn)數(shù)96}3)加入一個(gè)Private類型的幫助函數(shù)ShowFont用來顯示文本??梢杂肁ddMemberFunction的方法加入,也可以干脆修改代碼在82View.h中加入{private:voidShowFont(CDC*pDC,int&nPos,intnPoints);//以下為原生成代碼,不需變更}在82View.cpp中加入voidCMy82View::ShowFont(CDC*pDC,int&nPos,intnPoints){TEXTMETRICtm;TEXTMETRIC結(jié)構(gòu)包含字體的全部邏輯單位信息原型如下:typedefstructtagTEXTMETRIC{/*tm*/inttmHeight;inttmAscent;inttmDescent;inttmInternalLeading;inttmExternalLeading;inttmAveCharWidth;inttmMaxCharWidth;inttmWeight;BYTEtmItalic;BYTEtmUnderlined;BYTEtmStruckOut;BYTEtmFirstChar;BYTEtmLastChar;BYTEtmDefaultChar;BYTEtmBreakChar;BYTEtmPitchAndFamily;inttmOverhang;inttmDigitizedAspectX;inttmDigitizedAspectY;}TEXTMETRIC;CFontfontText;CStringstrText;CSizesizeText;ANSI_CHARSET,OUT_DEFAULT_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ù)是指向TEXTMETRIC結(jié)構(gòu)的指針,得到當(dāng)前字體的屬性,strText.FormanPointt("%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ù)voidCMy82View::OnDraw(CDC*pDC){intnPosition=0;for(inti=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事務(wù)中添加以下代碼:canpen=Truepicture1.CurrentX=x:picture1.CurrentY=y在鼠標(biāo)拖動(dòng)的過程中,若繪圖標(biāo)記為真并且鼠標(biāo)按鍵按下,則不斷地由當(dāng)前坐標(biāo)向新坐標(biāo)的坐標(biāo)畫極短的直線。在Picture1的MouseMove事務(wù)中添加以下代碼:IfcanpenAndButton<>0Thenpicture1.Line-(x,y),picture1.ForeColorEndIf當(dāng)釋放鼠標(biāo)左鍵時(shí),令繪圖標(biāo)記位為False,并保存當(dāng)前繪圖所用顏色,結(jié)束繪圖,在Picture1的MouseUp事務(wù)中添加以下代碼:fill_fixed_color=picture1.ForeColor'給油漆桶供應(yīng)邊框顏色canpen=False橡皮擦操作和畫筆操作的編程思路相同。在運(yùn)用橡皮工具時(shí)鼠標(biāo)指針的變更為十字形,Shape1作為擦除區(qū)域設(shè)置為可見。擦除區(qū)域的大小可依據(jù)線寬設(shè)置。在Picture1的MouseDown事務(wù)中添加以下代碼: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)用windows的API函數(shù)來實(shí)現(xiàn)。聲明API函數(shù):PublicDeclareFunctionFloodFillLib"gdi32"(ByValhdcAsLong,ByValxAsLong,ByValyAsLong,ByValcrColorAsLong)AsLong以Pictures1當(dāng)前的前景色創(chuàng)建一個(gè)筆刷,用該筆刷代替原來的筆刷,在調(diào)用FloodFill函數(shù)完成填充后,還原原來的筆刷。編寫代碼如下:hBrush=CreateSolidBrush(picture1.ForeColor)hOldBrush=SelectObject(picture1.hdc,hBrush)FloodFillpicture1.hdc,x,y,fill_fixed_colorSelectObjectpicture1.hdc,hOldBrushDeleteObjecthBrush(三)直線繪制的實(shí)現(xiàn)在程序運(yùn)行時(shí),軟件按鼠標(biāo)拖動(dòng)的軌跡繪制隨意方向的直線[7]。在畫布上單擊鼠標(biāo)左鍵或者右鍵時(shí),令畫直線的繪圖標(biāo)記為真,保存當(dāng)前的繪圖坐標(biāo),設(shè)置DrawMode為異或方式。在Picture1的MouseDown事務(wù)中添加以下代碼:canline=Truex0=x:y0=yxnow=x:ynow=ypicture1.DrawMode=7在鼠標(biāo)拖動(dòng)的過程中,若繪圖標(biāo)記為真并且鼠標(biāo)按鍵按下,則不斷循環(huán)兩條語(yǔ)句,第一條語(yǔ)句用于畫一條直線和前一個(gè)循環(huán)所畫的直線重合,由于繪圖方式是異或方式,所以已畫直線直線被清除,后一條語(yǔ)句用于畫一條新的直線,這兩條不斷循環(huán)的語(yǔ)句是: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)記位為False,用一般的繪圖方式將畫好的直線重新繪制一次,以免和之前繪制的直線重疊而導(dǎo)致直線被清除。保存當(dāng)前繪圖所用顏色,結(jié)束繪圖,在Picture1的MouseUp事務(wù)中添加以下代碼: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í)復(fù)制到另一個(gè)Picture控件中。在Picture1的MouseDown事務(wù)中添加以下代碼:'新添加一個(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的MouseMove事務(wù)中添加以下代碼: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事務(wù)中添加以下代碼:Picture1.Picture=Picture1_copy.imagePicture1.Circle(x0,y0),Sqr((x-x0)*(x-x0)+(y-y0)*(y-y0)),Picture1.ForeColor(五)矩形繪制的實(shí)現(xiàn)通過拖動(dòng)鼠標(biāo)可以繪制不同長(zhǎng)寬比例的矩形。繪制矩形的編程思路和繪制直線相同,但在用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)通過拖動(dòng)鼠標(biāo)可以繪制不同長(zhǎng)寬比例的矩形,該功能的實(shí)現(xiàn)和繪制圓形的思路一樣,但必需通過調(diào)用Windows的API函數(shù)來實(shí)現(xiàn)。聲明API函數(shù):PublicDeclareFunctionRoundRectLib"gdi32"(ByValhdcAsLong,ByValX1AsLong,ByValY1AsLong,ByValX2AsLong,ByValY2AsLong,ByValX3AsLong,ByValY3AsLong)AsLong在繪制圓角矩形時(shí)調(diào)用API函數(shù),x0,y0是鼠標(biāo)的起始坐標(biāo),在MouseDown事務(wù)獲得,最終的兩個(gè)參數(shù)是圓弧的角度:RoundRectPicture1.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的MouseDown中編寫代碼如下:IfButton<>0Thenlpoly.X1=xlpoly.Y1=yIfFstkey=FalseThenPicture1.Line(oldPoint.x,oldPoint.y)-(x,y),Picture1.ForeColorElseFstkey=Falselpoly.Visible=TrueFstPoint.x=xFstPoint.y=yEndIfoldPoint.x=xoldPoint.y=yEndIf在Picture1的MouseMove和MouseUp中編寫代碼如下:lpoly.X2=xlpoly.Y2=y雙擊鼠標(biāo)時(shí),將最初繪制線段的起點(diǎn)坐標(biāo)和最終繪制的線段的終點(diǎn)坐標(biāo)相連,在Picture1的DblClick事務(wù)中編寫代碼如下:Picture1.Line(oldPoint.x,oldPoint.y)-(FstPoint.x,FstPoint

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論