注:如果使用GDI+圖形系統,圖形和藝術字將具有更平滑的輪廓,以及可調整的用真實顏色調和的透明度級別。在調整圖片大小時,圖片的顯示將會更加清晰。
功能及特色
正如其名稱一樣,GDI+是對原有的GDI在功能上的升級,GDI+為我們提供的功能主要有三類:矢量圖形輸出、光柵圖形輸出和文字排版等。
GDI+與傳統的GDI相比,主要有以下六方面的新特色:漸變畫刷、獨立的路徑對象(Path Objects)、矩陣對象(Matrix Object)、區域(Scalable Regions)、Alpha Blending和多格式圖片支持。
設備環境和圖形對象
熟悉GDI編程的朋友對設備環境DC(Device Context)應該不會陌生。DC的數據結構存儲了顯示器(或打印機)的性能、屬性之類的詳細信息,這些數據信息決定程序如何在顯示器上進行輸出。所有的輸出都通過DC來實現,如果想在窗口中畫一個矩形,首先得通過GetDC得到DC,然後讓DC去執行具體操作。
使用GDI+後,就不必考慮句柄、設備環境等概念了。只要簡單地創建一個圖形對象(Graphics Object),然後直接調用該對象的方法(Methods)進行繪圖即可。圖形對象是GDI+的核心,它和DC有許多相似的地方,在使用上遵循著相同的使用規則,但是兩者在本質上已經有很大的區別。一個是基於句柄的GDI,一個是基於對象模型的GDI+。
同DC一樣,圖形對象也是和具體的窗口或是屏幕結合在一起的。圖形對象中也包括了許多具體屬性,這些具體的屬性值指明了進行繪圖的方法。圖形對象中沒有在DC中所綁定的具體的畫筆、畫刷、路徑等對象。在GDI中繪圖,首先必須為DC中選入一個畫筆對象(在DC中的畫筆只有一支是可以使用的),這支“筆”一直會使用到下次新選定畫筆為止。而在GDI+中,你只需要在圖形對象中調用畫直線時,將畫筆作為畫直線的一個參數就可以了,即在GDI+中,可以同時使用多個畫筆進行不同的繪圖操作。
參數化的對象
從OnDrawlineGdiplus()的代碼可以看出,GDI+可以將畫筆作為單獨的對象進行管理。並且對畫刷、路徑、圖片、字體等對象也實現了參數化。在GDI+的圖形對象中,這些對象被作為參數來傳遞的。舉例說明,在填充矩形區域時,使用紅色畫刷,要做的只是建立紅色畫刷,在調用FillRectangle函數時,將紅色畫刷作為函數的參數,這樣就能完成填充過程。
摒棄當前位置的概念
從上面的示例代碼OnDraLine可以看出,在GDI中畫一條直線首先得將筆的“當前位置”移到直線的起點坐標上(MoveTo),然後才能進行畫直線的操作。“當前位置”這個定義給編程帶來了不少的麻煩。GDI+中解決了這個問題,摒棄了“當前位置”這個沒有多大用處的概念。對於畫直線,直接說明起止點的坐標就行了。
注:如果你習慣了原來的GDI編程,這點應該引起你的注意。
方法的重載
GDI+的圖形對象中有許多的方法在調用時可有多種形式,如畫直線的函數DrawLine就有以下的幾種調用方法:
Status DrawLine(IN const Pen* pen, IN REAL x1, IN REAL y1, IN REAL x2, IN REAL y2);
Status DrawLine(IN const Pen* pen, IN const PointF&& pt1, IN const PointF&& pt2);
Status DrawLine(IN const Pen* pen, IN INT x1, IN INT y1, IN INT x2, IN INT y2);
Status DrawLine(IN const Pen* pen, IN const Point&& pt1, IN const Point&& pt2);
上面的四種調用方式的目的都一樣,從起點到終點以pen畫筆畫一條直線。
注:方法的重載為多樣化的編程提供了方便。
繪圖和填充相互獨立
在GDI中使用Rectangle繪制矩形時,GDI用當前畫筆繪制輪廓、用當前的畫刷將矩形內部自動填充,畫矩形和填充一步完成。而GDI+則將繪制輪廓填充內部相分離,這樣一來,GDI+繪制填充輪廓時就顯得更靈活。
構造區域
區域是窗口內的一塊多邊形或橢圓形的區域。在GDI中,CreateRectRgn、Crea-
teEllpticRgn、CreateRoundRectRgn、CreatePolygonRgn和CreatePolyPolygonRgn等函數都是與構造各種區域有關的,在GDI+中,這一切變得相對簡單。在GDI+中,我們可以將一個矩形對象(Rectangle Object)作為參數傳遞給區域類(Region Class)的構造函數,這個參數也可以是圖形路徑對象(GraphicsPath Object)的地址,這樣一來,創建一個區域較GDI要簡單的多。比如,你想要創造一個橢圓形的區域,首先建立一個包含橢圓的圖形路徑對象A,通過“Region Region1(&&A)”便可以做出橢圓形的區域對象Region1。對於復雜區域(由各種形狀和路徑合成的區域),GDI+采用了新的管理方式。區域類支持區域、路徑合成、交集運算。
支持GDI+的SDK
最新的Platform SDK支持我們直接使用GDI+。Platform為GDI+提供的頭文件及庫文件中,有40個類、50個列舉(Enumerations)及6個結構(Structures)。其中,最關鍵的是圖形類(Graphics Class),通過該類能夠進行畫直線、曲線、圖片及文字輸出。在這些類中,每個類之間並不是完全獨立的,它們通常互為參數。開始調用GDI+函數之前,使用GdiplusStartup對GDI+進行啟動。函數調用完之後,應使用GdiplusShutdown函數進行終止操作。