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