GDI
Graphics Device Interface,即圖形設備接口,是Windows API的一個重要組成部分。它是Windows圖形顯示程序與實際物理設備之間的橋樑,GDI使得用戶無需關心具體設備的細節,而只需在一個虛擬的環境(即邏輯設備)中進行操作。它的橋樑作用體現在:
(1)用戶通過調用GDI函數將邏輯空間的操作轉化爲具體針對設備驅動程序的調用。
爲實現圖形設備無關性,Windows的繪圖操作在一個設備描述表上進行。用戶擁有自己的“邏輯座標”系統,它獨立於實際的物理設備,與“設備座標”相對應。開發Windows應用程序時,程序員關心的是邏輯座標,我們在邏輯座標系上繪圖,利用GDI將邏輯窗口映射到物理設備上。
(2)GDI能檢測具體設備的能力,並依據具體的設備以最優方式驅動這些設備,完成真實的顯示。
GDI函數大致可分類爲:
- 設備上下文函數(如GetDC、CreateDC、DeleteDC)
- 畫線函數(如LineTo、Polyline、Arc)
- 填充畫圖函數(如Ellipse、FillRect、Pie)
- 畫圖屬性函數(如SetBkColor、SetBkMode、SetTextColor)
- 文本、字體函數(如TextOut、GetFontData)
- 位圖函數(如SetPixel、BitBlt、StretchBlt)
- 座標函數(如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen)
- 映射函數(如SetMapMode、SetWindowExtEx、SetViewportExtEx)
- 元文件函數(如PlayMetaFile、SetWinMetaFileBits)
- 區域函數(如FillRgn、FrameRgn、InvertRgn)
- 路徑函數(如BeginPath、EndPath、StrokeAndFillPath)
- 裁剪函數(如SelectClipRgn、SelectClipPath)
GDI雖然使程序員得到了一定程度的解脫,但是其編程方式仍很麻煩。譬如,顯示一張位圖,程序員需要進行“裝入位圖 | 讀取位圖文件頭信息 | 啓用設備場景 | 調色板變換”等一連串操作。而有了GDI+,這些問題便迎刃而解了。
GDI+
GDI+是GDI的後續版本,最早於2001年隨WinXP一起推出,後來又被包裝進.NET框架的託管類庫中,成爲.NET中窗體繪圖的主要工具。
GDI+主要提供了以下三類服務:
(1)二維矢量圖形:GDI+提供了存儲圖形基元自身信息的類(或結構體)、存儲圖形基元繪製方式信息的類以及實際進行繪製的類。
(2)圖像處理:大多數圖片都難以劃定爲直線和曲線的集合,無法使用二維矢量圖形方式進行處理。因此,GDI+爲我們提供了Bitmap、Image等類。它們可用於顯示、操作和保存BMP、JPG、GIF等圖像。
(3)文字顯示:GDI+支持使用各種字體、字號和樣式來顯示文本。
GDI接口是基於函數的,而GDI+是基於C++ OO的編程接口,因此使用起來比GDI要方便。因爲GDI+實際上是GDI的封裝和擴展,所以執行效率一般要低於GDI。