版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第17章
在窗口中繪圖
本章將介紹Windows下的圖形編程。Windows中負(fù)責(zé)圖形輸出的是GraphicsDeviceInterface(圖形設(shè)置接口),或稱GDI。GDI為應(yīng)用程序提供了可供調(diào)用的多種服務(wù),這些服務(wù)一起構(gòu)成了一種強(qiáng)大、通用的圖形編程語(yǔ)言。GDI+是GDI的升級(jí)版本,它是.NETFramework中的繪圖技術(shù),使用它進(jìn)行繪圖操作要比GDI簡(jiǎn)單的多。MFC設(shè)備描述表繪圖模式映射模式坐標(biāo)使用GDI對(duì)象繪圖使用不同的字體繪制文本使用鼠標(biāo)繪圖GDI+中的繪圖類GDI+圖形處理
17.1WindowsGDI
在Windows環(huán)境下,所有的輸出都是圖形,而不管它是直線、矩形還是文件。Windows使用GDI(圖形設(shè)備接口)繪制用戶界面元素,如窗口、菜單和對(duì)話框,基至鼠標(biāo)也是通過(guò)GDI繪制的。GDI支持與是顯示硬件無(wú)關(guān)的圖形輸出,這就意味著程序中使用GDI輸出的圖形和文本可以在不同的顯示設(shè)備中正常顯示。
17.1.1MFC設(shè)備描述表類
當(dāng)Windows程序在圖形輸出設(shè)備上進(jìn)行繪圖操作時(shí),它并不是將像素直接輸出到設(shè)備上,而是將圖形繪制到由設(shè)備描述表(DC)表示的邏輯意義的“平面”。設(shè)備描述表是Windows定義的一種數(shù)據(jù)結(jié)構(gòu),它包含的信息允許Windows將輸出請(qǐng)求轉(zhuǎn)換成特定物理設(shè)備的輸出動(dòng)作。在MFC應(yīng)用程序中,CDC類將Windows設(shè)備描述表和相關(guān)的GDI函數(shù)封裝在一起,組成了設(shè)備描述表類。而CDC的派生類如CPaintDC和CClientDC則代表Windows應(yīng)用程序使用的不同類型的設(shè)備描述表。
17.1.2設(shè)備描述表的屬性
當(dāng)使用CDC輸出函數(shù)在屏幕上繪圖時(shí),輸出的某些特性需要通過(guò)設(shè)備描述表進(jìn)行設(shè)置。例如,在調(diào)用CDC::DrawText()繪制文本時(shí),可以指定輸出文本的顏色和字體。表17-2列出了一些設(shè)備描述表中最常用的屬性和訪問(wèn)這些屬性的CDC函數(shù)。
17.1.3繪圖模式
GDI在進(jìn)行輸出時(shí),并不是直接將像素點(diǎn)輸出。相反,它是通過(guò)一系列的布爾運(yùn)算將輸出像素點(diǎn)的顏色和輸出目標(biāo)位置上像素點(diǎn)的顏色合成在一起。它所使用的布爾運(yùn)算由設(shè)備描述表當(dāng)前的繪圖模式確定。使用CDC::SetROP2()函數(shù)可以更改繪圖模式。默認(rèn)的繪圖模式為R2_COPYPEN,它將像素點(diǎn)復(fù)制到顯示平面上。表17-3列出了幾種可選的繪圖模式,所有這些繪圖模式代表了由AND、OR、XOR和NOT構(gòu)成的運(yùn)算。17.1.4映射模式
映射模式作為設(shè)備描述表的屬性,用于確定從邏輯坐標(biāo)值到設(shè)備坐標(biāo)值的轉(zhuǎn)換方式。調(diào)用CDC輸出函數(shù)的坐標(biāo)是邏輯坐標(biāo)值,而設(shè)備坐標(biāo)值是指窗口中相應(yīng)的像素點(diǎn)位置。例如:dc.Rectangle(0,0,200,100);這里設(shè)置的矩形寬為200個(gè)邏輯單位,高為100個(gè)邏輯單位;而不是200個(gè)像素點(diǎn)高,100個(gè)像素點(diǎn)寬的矩形。在默認(rèn)映射模式MM_TEXT下,一個(gè)邏輯單位等于一個(gè)像素點(diǎn)。但在其他映射模式中,邏輯單位被解釋為不同的設(shè)備單位。
17.1.5移動(dòng)坐標(biāo)原點(diǎn)
在所有的映射模式下,設(shè)備描述表的原點(diǎn)都是左上角,這與數(shù)學(xué)中經(jīng)常使用坐標(biāo)系不相同。然而,如果改變映射模式一樣,也可以移動(dòng)坐標(biāo)原點(diǎn)。MFC的CDC類提供了兩個(gè)可移動(dòng)坐標(biāo)原點(diǎn)的函數(shù):CDC::SetWindowOrg()和CDC::SetViewportOrg()。
17.1.6獲取設(shè)備信息CDC::GetDeviceCaps()函數(shù)可以檢索設(shè)備的各種信息,從設(shè)備支持的顏色數(shù)目到水平和堅(jiān)直方向上顯示的像素點(diǎn)數(shù)。表17-5列出了一些參數(shù),將這些參數(shù)傳遞給GetDeviceCaps()函數(shù)將獲得與設(shè)備描述表有關(guān)的信息。
17.2用GDI繪圖
了解GDI的基礎(chǔ)知識(shí)后,接下來(lái)就可以調(diào)用GDI函數(shù)在窗口中繪制圖形。在使用MFC應(yīng)用程序向?qū)傻某绦蛑邪艘粋€(gè)派生于CView類的視圖類,該類就是專門用于在屏幕上顯示文檔數(shù)據(jù)。
17.2.1應(yīng)用程序中的視圖類
MFC應(yīng)用程序向?qū)傻念愔饕?fù)責(zé)顯示文檔中的數(shù)據(jù)。該類包括了幾個(gè)重寫(xiě)后的虛函數(shù),其中有一個(gè)OnDraw()函數(shù)特別重要。每當(dāng)需要重新繪制視圖時(shí),都將調(diào)用這個(gè)函數(shù)。當(dāng)程序接收到WM_PAINT消息時(shí),就會(huì)調(diào)用該函數(shù)。
17.2.2繪制直線和曲線
MFC的CDC類中包含了許多可用來(lái)畫(huà)直線和曲線的成員函數(shù)。表17-6列出了幾個(gè)主要的函數(shù)。
17.2.3繪制橢圓和矩形
GDI不僅僅可以繪制簡(jiǎn)單的直線和曲線,還允許繪制橢圓、矩形和餅形等封閉圖形。MFC的CDC類將相關(guān)的GDI函數(shù)封裝為類的成員函數(shù)。表17-7列出其中幾個(gè)常用的成員函數(shù)。
17.2.4畫(huà)筆
到目前為止,繪制圖形在屏幕中都是黑色的,寬度為一個(gè)像素點(diǎn)。如果要改變這種情況,需要?jiǎng)?chuàng)建一個(gè)GDI畫(huà)筆,并由CDC::SelectObject()將它設(shè)為設(shè)備描述表所使用的畫(huà)筆。MFC使用類CPen表示GDI畫(huà)筆。創(chuàng)建畫(huà)筆的最簡(jiǎn)單方法是創(chuàng)建一個(gè)CPen對(duì)象,并使用適當(dāng)?shù)膶傩猿跏蓟搶?duì)象:CPenpen(PS_SOLID,1,RGB(255,0,0));第二種方法是先構(gòu)造一個(gè)未初始化的CPen對(duì)象,然后調(diào)用CPen::CreatePen()初始化畫(huà)筆對(duì)象:CPenpen;pen.CreatePen(PS_SOLID,1,RGB(255,0,0));如果畫(huà)筆創(chuàng)建成功,則CreatePen()返回TRUE,反之則返回FALSE。定義畫(huà)筆需要三個(gè)特性:樣式、寬度和顏色。
17.2.5畫(huà)刷
在默認(rèn)情況下,使用Ellipse()、Rectangle()函數(shù)以及其他輸出函數(shù)繪制封閉圖形時(shí),圖形的內(nèi)部將填充白色。通過(guò)創(chuàng)建GDI畫(huà)刷,并將之選入設(shè)備描述表中可以改變圖形的填充顏色。MFC的CBrush類封裝了Windows畫(huà)刷。畫(huà)刷有三種基本類型:?jiǎn)紊?、帶陰影線和圖案畫(huà)刷。只要將COLORREF的值傳遞給CBrush的構(gòu)造函數(shù),就可以創(chuàng)建一個(gè)單色畫(huà)刷。
17.2.6繪制文本
在輸出文字時(shí),MFC的CDC類成員提供了一系列的函數(shù),最常用的函數(shù)包括:CDC::TextOut()和CDC::DrawText()兩個(gè)函數(shù),其他的文本函數(shù)見(jiàn)表17-10所示。
17.2.7字體
在輸出文本時(shí),所有的CDC文本輸出函數(shù)都使用當(dāng)前設(shè)備描述表中的默認(rèn)字體。字體是文字顯示和打印的外觀形式,它包括了文字的字樣、風(fēng)格和尺寸等方面的屬性。字樣是字符書(shū)寫(xiě)和顯示時(shí)表現(xiàn)出的特定模式。絕大部分GDI字體可分為兩類:點(diǎn)陣字體和TrueType字體。與畫(huà)筆或畫(huà)刷一樣,字體也是一個(gè)GDI對(duì)象。在MFC中,字體由CFont類表示。創(chuàng)建字體由兩步完成:首先創(chuàng)建CFont類對(duì)象,然后調(diào)用CFont類的創(chuàng)建字體函數(shù)CreateFont()、CreateFontIndirect()、CreatePointFont或CreatePointFontIndirect()創(chuàng)建GUI字體。
17.2.9預(yù)定義對(duì)象
Windows預(yù)定義了一些畫(huà)筆、畫(huà)刷、字體以及其他一些GDI對(duì)象,它們?cè)谑褂袝r(shí)不需要再顯式地創(chuàng)建,直接調(diào)用CDC::SelectStockObject()函數(shù)將這些預(yù)定義對(duì)象選入設(shè)備描述表即可。表17-13列出了一些可用的預(yù)定義對(duì)象。
17.3使用鼠標(biāo)繪圖
1.
直線繪制過(guò)程
在繪制一條直線時(shí),用戶通過(guò)按下鼠標(biāo)左鍵確定直線的起始位置,然后按住左鍵移動(dòng)鼠標(biāo)來(lái)定義直線的終點(diǎn)。在按住鼠標(biāo)左鍵移動(dòng)時(shí),希望能夠連續(xù)繪制直線,以便讓用戶確認(rèn)當(dāng)前繪制的直線。17.3.1繪制圖形分析
2.繪制圓按下鼠標(biāo)左鍵的位置被定義為圓心,當(dāng)按住鼠標(biāo)左鍵移動(dòng)時(shí),圖將被連續(xù)重新繪制,在釋放鼠標(biāo)左鍵時(shí)圓將定型。
2.繪制矩形按下鼠標(biāo)左鍵的位置為矩形的左上角位置,釋放鼠標(biāo)左鍵的位置為最終矩形的右下角。在按住鼠標(biāo)左鍵移動(dòng)的過(guò)程中,將不斷更新矩形。
17.3.2創(chuàng)建繪圖類
在Drawing應(yīng)用程序中,用戶可以使用鼠標(biāo)隨意繪制直線、圓、矩形和曲線,因此我們可以使用四個(gè)類:CLine、CRectangle、CCirle和CCurve分別實(shí)現(xiàn)繪制相應(yīng)的圖形。這四個(gè)類彼此之間有一些相同的特性,如顏色、畫(huà)筆寬度等,為了方便使用,我們?yōu)檫@四個(gè)類創(chuàng)建一個(gè)共同的基類CShape類。另外,我們需要以某種方式在一個(gè)文檔中保存繪制的圖形,以便隨后使用。在MFC中,CObject類提供串行化的功能,這也就意味著如果從CObject派生自己的類,則可以使用CObject類提供的串行化功能。
17.3.3完成基類CShape
在基類CShape中包含所有類都通用的一些特性,如顏色、畫(huà)筆寬度等,以便可以在每個(gè)派生類中繼承它們。另外,在基類中還應(yīng)包含一些所有派生類中必須具有的函數(shù),如繪圖方法,所有的派生類都應(yīng)該包含繪圖方法,但它們的繪圖方法則是完全不相同的,因此該方法就應(yīng)該在基類中以虛函數(shù)的方法實(shí)現(xiàn)。
17.3.4繪制直線
直線的繪制是由CLine類來(lái)實(shí)現(xiàn)。對(duì)于直線而言,它需要兩個(gè)數(shù)據(jù):直線的起點(diǎn)和直線的終點(diǎn)。
17.3.5完成其他派生類
在完成繪制直線的CLine類后,CRectangle和CCircle類與此類似。1.繪制矩形在繪制矩形時(shí)需要知道矩形的左上角和右下角坐標(biāo),根據(jù)這兩點(diǎn)可以構(gòu)造一個(gè)表示矩形的CRect類類型的對(duì)象。2.繪制圓在繪制圓時(shí),按下鼠標(biāo)左鍵的位置將是圓的圓心,移動(dòng)鼠標(biāo)指針后,釋放鼠標(biāo)左鍵的位置將為最終圓的圓周上一點(diǎn)。因此,在構(gòu)造函數(shù)中需要根據(jù)圓心和圓的半徑計(jì)算出圓的外接矩形。3.繪制曲線CCure類與其他類不同,為了繪制曲線,它必須接收一系列的點(diǎn)。這就需要一個(gè)集合類來(lái)保存和管理這些點(diǎn)。也就是說(shuō),需要在CCurve類中添加一個(gè)vector<CPoint>容器類數(shù)據(jù)成員,以存儲(chǔ)構(gòu)成曲線的點(diǎn)。
17.3.6創(chuàng)建繪圖類對(duì)象
在定義各種繪圖類后,接下來(lái)就需創(chuàng)建各繪圖類對(duì)象,調(diào)用其成員函數(shù)完成繪圖功能。在Drawing程序中,當(dāng)用戶通過(guò)相應(yīng)的菜單項(xiàng)選擇希望繪制的圖形,然后再使用鼠標(biāo)進(jìn)行繪圖,因此,首先需要為程序添加繪圖和顏色菜單項(xiàng)。繪圖和顏色菜單項(xiàng)的各屬性設(shè)置如表17-14所示。
17.4.使用GDI+繪圖
GDI是使用C++類對(duì)Windows繪圖函數(shù)的包裝,而GDI+則對(duì)GDI進(jìn)行了包裝,并對(duì)它進(jìn)行了改進(jìn),使GDI+更容易使用。例如,在使用GDI繪圖時(shí),必須要指定一個(gè)設(shè)備環(huán)境DC,所有的繪圖操作都與該句柄有關(guān)。而GDI+不再使用這個(gè)設(shè)備環(huán)境或句柄,取而代之是使用Graphics對(duì)象。Pen、Brush,F(xiàn)ont,Image等對(duì)象是圖形對(duì)象獨(dú)立的,Graphics繪圖方法直接將Pen對(duì)象作為自己的參數(shù),從而避免了在GDI使用SelectObject進(jìn)行繁瑣的切換,類似的還有Brush、Path、Image和Font等。
17.4.1了解GDI+
盡管GDI+基本上是GDI的一個(gè)包裝器,但Microsoft已經(jīng)能通過(guò)GDI+提供新功能了,并對(duì)它有一些性能方面的改進(jìn)。GDI+封裝在一組托管代碼中,這些類被稱為GDI+的托管類接口,GDI+基類的命名空間信息如下:System::Drawing包含與基本繪圖功能有關(guān)的大多數(shù)類、結(jié)構(gòu)、枚舉和委托。System::Drawing::Drawing2D為大多數(shù)高級(jí)2D和矢量繪圖操作提供了支持,例如,消除鋸齒、幾何轉(zhuǎn)換和圖形路徑等。System::Drawing::Imaging幫助處理圖像(位圖、GIF文件等)的各種類。System::Drawing::Printing把打印機(jī)或打印預(yù)覽窗口作為輸出設(shè)備時(shí)使用的類。System::Drawing::Design一些預(yù)定義的對(duì)話框、屬性表和其他用戶界面元素,與在設(shè)計(jì)期間擴(kuò)展用戶界面相關(guān)。System::Drawing::Text對(duì)字體和字體系列執(zhí)行更高級(jí)的操作的類。命名空間System::Drawing中的Graphics類是GDI+的核心,Graphics類提供將對(duì)象繪制到顯示設(shè)備的方法。Graphics可以與特定設(shè)備的上下文相關(guān)聯(lián),是用于創(chuàng)建圖形的對(duì)象。它封裝了繪制直線、曲線、圖形、圖像和文本的方法,是GDI+實(shí)現(xiàn)繪制直線、曲線、圖形、圖像和文本的類,是GDI+操作的基礎(chǔ)類。
17.4.2圖形操作
GDI+定義了一系列與繪圖操作相關(guān)的繪圖類,通過(guò)這些繪圖類可以和Graphics對(duì)象一起實(shí)現(xiàn)繪圖處理,GDI+內(nèi)的主要繪圖類如下。1.Color結(jié)構(gòu)Color結(jié)構(gòu)表示ARGB顏色,使用Alpha、Red、Green、和Blue的值來(lái)表示顏色。Color結(jié)構(gòu)以屬性的方式定義了大量的有名稱的顏色。2.Pen類Pen類用于繪制直線或曲線,它通過(guò)本身的屬性繪制具有指定寬度和樣式的直線。可以使用DashStyle屬性繪制虛線,DashStyle屬性是DashStyle枚舉類型。3.Brush類Brush類定義用于填充圖形形狀內(nèi)部的對(duì)象,Brush類是一個(gè)抽象基類,不能進(jìn)行實(shí)例化處理。如果需要?jiǎng)?chuàng)建一個(gè)畫(huà)刷對(duì)象,應(yīng)使用派生于Brush的類。
17.4.3坐標(biāo)和區(qū)域
在進(jìn)行繪圖操作時(shí),經(jīng)常需要使有Point、Rectangle和Size等結(jié)構(gòu)來(lái)確定繪制的位置和區(qū)域等信息,這幾個(gè)類都是在System::Drawing命名空間中定義。
1.Point和PointF從概念上講,Point在這些結(jié)構(gòu)中是最簡(jiǎn)單的,在數(shù)學(xué)上,它完全等價(jià)于一個(gè)二維矢量。它包含兩個(gè)整數(shù)類型的屬性,分別特定位置的水平和垂直距離。2.Size和SizeF與Point和PointF一樣,Size也有兩個(gè)變體:Size和SizeF,Size結(jié)構(gòu)用于int類型而SizeF結(jié)構(gòu)用于float類型。3.Rectangle和RectangleFRectangle和RectangleF表示屏幕上的一個(gè)矩形區(qū)域,兩者的具體用法基本類似。RectangleF與Rectangle基本相同,只是RectangleF的屬性類型是float,而Rectangle的屬性類型是int。
17.4.4使用Font類繪制文本
Font類封裝了字體的3個(gè)主要特性:字體系列、字體大小和字體樣式。Font類在System::Drawing命名空間中。Font類的Style屬性設(shè)置了字體的樣式信息,其值是由FontSty
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版建筑工程勞務(wù)承攬協(xié)議樣本一
- 二零二五年度環(huán)保型空壓機(jī)銷售及環(huán)保檢測(cè)合同2篇
- 二零二五年開(kāi)發(fā)商與購(gòu)房者精裝修住宅買賣及智能家居配置協(xié)議3篇
- 2025年建筑防水密封材料銷售代理合同
- 個(gè)性化無(wú)共同財(cái)產(chǎn)離婚合同書(shū)(2024年版)版B版
- 二零二五年集裝箱運(yùn)輸全程管理服務(wù)合同3篇
- 2024版電動(dòng)單車采購(gòu)合同范本
- 2025年房地產(chǎn)投資咨詢與居間介紹合同3篇
- 項(xiàng)目合作協(xié)議
- 2024版建筑彩鋼供應(yīng)與安裝承包協(xié)議版B版
- 八年級(jí)上冊(cè)英語(yǔ)完形填空、閱讀理解100題含參考答案
- 2023年安徽省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 小學(xué)數(shù)學(xué)教學(xué)3000字(優(yōu)選11篇)
- 四川水泥廠土建工程基礎(chǔ)施工方案
- 新外研版高二英語(yǔ)選擇性必修二Unit2重點(diǎn)單詞短語(yǔ)歸納復(fù)習(xí)檢測(cè)(精編課件)
- 圍棋初級(jí)死活常型
- GB/T 6481-2002鑿巖用錐體連接中空六角形釬桿
- GB/T 20988-2007信息安全技術(shù)信息系統(tǒng)災(zāi)難恢復(fù)規(guī)范
- (最新)信息科技風(fēng)險(xiǎn)管理辦法
- 消防工程檢測(cè)設(shè)備公司市場(chǎng)營(yíng)銷方案
- 托福閱讀小班講義
評(píng)論
0/150
提交評(píng)論