使用GDI 程式設計

2021-03-31 15:34:20 字數 4400 閱讀 6725

1.引言

gdi+是windows xp中的乙個子系統,它主要負責在顯示螢幕和列印裝置輸出有關資訊,它是一組通過c++類實現的應用程式程式設計介面。顧名思義,gdi+是以前版本gdi的繼承者,出於相容性考慮,windows xp仍然支援以前版本的gdi,但是在開發新應用程式的時候,開發人員為了滿足圖形輸出需要應該使用gdi+,因為gdi+對以前的windows版本中gdi進行了優化,並新增了許多新的功能。

作為圖形裝置介面的gdi+使得應用程式開發人員在輸出螢幕和印表機資訊的時候無需考慮具體顯示裝置的細節,他們只需呼叫gdi+庫輸出的類的一些方法即可完成圖形操作,真正的繪圖工作由這些方法交給特定的裝置驅動程式來完成,gdi+使得圖形硬體和應用程式相互隔離.從而使開發人員編寫裝置無關的應用程式變得非常容易.

2.gdi+新增功能

(1)漸變的畫刷(gradient brushes)

gdi+允許使用者建立乙個沿路徑或直線漸變的畫刷,來填充外形(shapes),路徑(paths),區域(regions),漸變畫刷同樣也可以畫直線、曲線、路徑,當你用乙個線形畫刷填充乙個外形(shapes)時,顏色就能夠沿外形逐漸變化。

(2)基數樣條函式(cardinal splines)

gdi+支援基數樣條函式,而gdi不支援。基數樣條是一組單個曲線按照一定的順序連線而成的一條較大曲線。樣條由一系列點指定,並通過每乙個指定的點。由於基數樣條平滑地穿過組中的每乙個點(不出現尖角),因而它比用直線連線建立的路徑更精確。下面是分別使用兩種方法建立的圖形,乙個使用基數樣條,乙個使用直線。

(3)持久路徑物件persistent path objects

在gdi中,路徑屬於裝置描述表(dc),畫完後路徑就會被破壞。在gdi+中,繪圖工作由graphics物件來完成,你可以建立幾個與graphics分開的路徑物件,繪圖操作時路徑物件不被破環,這樣你就可以多次使用同乙個路徑物件畫路徑了。

(4)變形和矩陣物件transformations & matrix object

gdi+提供了矩陣物件,乙個非常強大的工具,使得編寫圖形的旋轉、平移、縮放**變得非常容易。乙個矩陣物件總是和乙個圖形變換對相聯絡起來,比方說,路徑物件(path)有乙個transform方法,它的乙個引數能夠接受矩陣物件的位址,每次路徑繪製時,它能夠根據變換矩陣繪製。下面的圖形是乙個圖形變換前後的例子,變換按照先縮放後旋轉完成。

(5)可伸縮區域 scalable regions

gdi+ 在區域(regions)方面對gdi進行了改進,在gdi中,regions儲存在裝置座標中,對regions 唯一可進行圖形變換的操作就是對區域進行平移。而gdi+用世界座標儲存區域(regions),允許對區域進行任何圖形變換(譬如如圖所示的縮放),圖形變換以變換矩陣儲存,下面例子是乙個區域變換前後的例子(縮放、旋轉、平移)

(6)alpha blending(混合)

你可能會注意到上面顯示的圖形,紅色未平移區域與變換後區域有一部分交叉區域,這一部分形成的夢幻效果就是由gdi+支援的alpha blending(混合)實現的,利用alpha融合,你可以指定填充顏色的透明度,透明顏色與背景色相互融合,填充色越透明,背景色顯示越清晰,下圖所示的四個橢圓被填充了同樣的顏色,但由於擁有不同的透明度而呈現不同的顯示效果。

(7)多種影象格式支援.

影象在圖形介面程式中占有舉足輕重的地位,gdi+除了支援bmp等gdi支援的圖形格式外,還支援jpeg(joint photographic experts group)、gif(graphics interchange format)、png(exchangeable image file)、exif(portable ***work graphics)、tiff(tag image file format)等影象格式,你可以直接在程式中使用這些檔案,而無需考慮它們所用壓縮演算法。

(8)其它。

gdi+還將支援其它技術,譬如重新著色、顏色校正、元資料、圖形容器,也許這些功能我們會在將來的windowsxp或者microsoft visualstudio。***中看到.

3.程式設計模式的改變 device contexts(裝置描述表), handles(控制代碼), 和 graphics objects(圖形物件)

利用gdi+函式,你不必使用控制代碼或者裝置描述表。相反,你可以簡單地建立乙個圖形物件(graphics),然後以你熟悉的物件導向的程式設計方式呼叫它的方法即可,譬如mygraphicsobject.drawline(parameters)。graphics物件是gdi+的核心,正如裝置描述表是gdi的核心一樣,裝置描述表(dc)和圖形物件(graphics)在不同的環境下扮演著同樣的角色,發揮著類似的作用,但是兩者也存在著這質的不同。前者使用基於控制代碼的程式設計方法而後者使用物件導向的程式設計方法。

圖形物件和裝置物件一樣,與螢幕的顯示視窗有關,它包含著與專案重繪有關的屬性資訊(譬如平滑度),然而圖形物件並沒有像gdi那樣與pen(畫筆)、path(路徑)、image(影象)、font(字型)等攪在一起。在gdi中,所有與繪圖有關的繪圖物件必須選入指定裝置描述表中(使用selectobject函式),才能被指定的裝置描述表所使用。而在gdi+中,你只需把這些繪圖物件作為乙個引數傳遞給圖形物件graphics方法呼叫即可,每乙個圖形物件所使用的繪圖工具至於它呼叫方法使用的引數有關,它可以通過引數使用多種pen和brush繪圖,而不是與特定的筆和畫刷聯絡在一起。

下面的**分別用兩種方法實現紅線的繪製,其中線寬3,起點(20,10),終點(200,100)

gdi

hdc hdc;

paintstruct ps;

hpen hpen;

…hdc = beginpaint(hwnd, &ps); 獲得裝置控制代碼,開始繪製

hpen = createpen(ps_solid, 3, rgb(255, 0, 0));建立紅色畫筆,寬3

selectobject(hdc, hpen); 選入裝置描述表

movetoex(hdc, 20, 10, null); 畫線

li***o(hdc, 200, 100);

endpaint(hwnd, &ps); 結束繪製

gdi+

hdc hdc;

paintstruct ps;

pen* mypen;

graphics* mygraphics;

…hdc = beginpaint(hwnd, &ps);

mypen = new pen(0xffff0000, 3); 建立乙個筆,寬3,紅色

mygraphics = new graphics(hdc); 利用裝置控制代碼建立圖形物件

mygraphics->drawline(mypen, 20, 10, 200, 100);呼叫圖形物件畫線的方法

endpaint(hwnd, &ps);

四 如何使用gdi+

gdi+並不是windows xp的專利,它同樣可以在其它windows作業系統下使用(不包括win3.x),包括64位的windows版本,按照微軟官方的話說,gdi+支援所有基於windows的應用程式。你只要把gdiplus.dll拷入windows的系統目錄,即可使用需要gdi+支援的應用程式。microsoft visual c#全面支援gdi+,microsoft visual c++.***

使用gdi+有兩種方法,一種方法是通過託管(managed )的應用程式實現,另一種方法是在非託管專案中借助於呼叫c++物件導向類實現。

下面是乙個基於win32 sdk的視窗程式。使用要包含gdiplus.h標頭檔案,連線設定要包含gdiplus.lib庫檔案。

#define unicode

#include

#include

using namespace gdiplus;

void onpaint(hwnd hwnd)

// onpaint

lresult callback wndproc(hwnd, uint, wparam, lparam);

int winapi winmain(hinstance hinstance, hinstance,

pstr szcmdline, int icmdshow)

gdiplusshutdown(gdiplustoken); 關閉gdi+

return msg.wparam;

} // winmain

lresult callback wndproc(hwnd hwnd, uint message,

wparam wparam, lparam lparam)

} // wndproc

綜上所述,我們可以看出使用gdi+進行圖形程式設計更容易,功能更強大,gdi+不僅是microsoft visual studio.***的組成部分,也是windowxp的重要組成部分,未來是gdi+的天下,gdi將逐漸退出歷史舞台,這是大勢所趨,不可逆轉。早日鎖定gdi+是你明智的選擇。

GDI 程式設計 二 使用畫筆

畫筆常用於繪製圖形的輪廓.gdi 的畫筆除了具有常見的色彩和寬度屬性外,還具有對齊方式,線帽,變換方式等屬性。gdi 中通過pen類來定義畫筆物件。一 構造與使用畫筆 pen brush,width 用顏色與線寬構造乙個畫筆 pen color,width 用畫刷與寬度構造乙個畫筆例子 pen pe...

GDI 程式設計 二 使用畫筆

畫筆常用於繪製圖形的輪廓.gdi 的畫筆除了具有常見的色彩和寬度屬性外,還具有對齊方式,線帽,變換方式等屬性。gdi 中通過pen類來定義畫筆物件。一 構造與使用畫筆 pen brush,width 用顏色與線寬構造乙個畫筆 pen color,width 用畫刷與寬度構造乙個畫筆 例子 pen p...

GDI 程式設計

image和bitmap類概述 gdi 的image類封裝了對bmp gif jpeg png tiff wmf windows元檔案 和emf 增強wmf 影象檔案的調入 格式轉換以及簡單處理的功能。而bitmap是從image類繼承的乙個影象類,它封裝了windows點陣圖操作的常用功能。例如,...