介紹
Windows 98和Microsoft WindowsNT中的圖形主要由gdi32.dll動態連結程式庫輸出的函式來處理。在Windows 98中,這個GDI32.DLL實際是利用16位元GDI.EXE動態連結程式庫來執行許多函式。在Windows NT中,GDI.EXE只用於16位元的程式。這些動態連結程式庫呼叫您安裝的視訊顯示器和任何印表機呼叫驅動程式中的常式。視訊驅動程式存取視訊顯示器的硬體,印表機驅動程式將GDI命令轉換為各種印表機能夠理解的代碼或者命令。顯然,不同的視訊顯示卡和印表機要求不同的裝置驅動程式。
說明
因為PC相容機種上可以連線許多種不同的視訊設備,所以,GDI的主要目的之一是支援與裝置無關的圖形。Windows程式應該能夠毫無困難地在Windows支援的任意一種圖形輸出設備上執行,GDI通過將您的程式和不同輸出設備的特性隔離開來的方法來達到這一目的。圖形輸出設備分為兩大類:位元映射設備和向量設備。大多數PC的輸出設備是位元映射設備,這意味著它們以圖點構成的陣列來表示圖像,這類設備包括視訊顯示卡、點陣印表機和雷射印表機。向量設備使用線來繪製圖像,通常局限於繪圖機。
許多傳統的電腦圖形程式設計方式都是完全以向量為主的,這意味著使用向量圖形系統的程式與硬體有著一定層次的隔離。輸出設備用圖素表示圖形,但是程式與程式介面之間並不是用圖素進行溝通的。您當然可以使用Windows GDI作為一個高階的向量繪製系統,同時也可以將它用於比較低階的圖素操作。
從這方面來看,Windows GDI和傳統的圖形介面語言之間的關係,就如同C和其他程式設計語言之間的關係一樣。C以它在不同作業系統和環境之間的高度可攜性而聞名,然而C也以允許程式寫作者進行低階系統呼叫而聞名,這些呼叫在其他高階語言中通常是不可能的。正如C有時被認為是一種「高級組合語言」一樣,您可以認為GDI是圖形設備硬體之間的一種高階介面。
您已經看到,Windows內定使用圖素坐標系統。大多數傳統的圖形語言使用「虛擬」坐標系,其水平和垂直軸的範圍在0到32,767之間。雖然有些圖形語言不讓您使用圖素坐標,但是Windows GDI允許您使用兩種坐標系統之一(甚至依據實際度量衡的坐標系)。您可以使用虛擬坐標系以便讓程式獨立於硬體之外,或者也可以使用設備坐標系而完全迎合硬體設備提供的環境。
某些程式寫作者認為一旦開始使用操作圖素的程式設計方式,就放棄了裝置無關性。我們在上一章看到,這不完全是正確的,其中的訣竅是在與裝置無關的方式中使用圖素。這要求圖形介面語言為程式提供一些方法來確定設備的硬體特徵,並進行適當的調節。例如,在SYSMETS程式中,我們根據標準系統字型字元的圖素大小來確定螢幕上的文字間距,這種方法允許程式針對解析度、文字大小和方向比例各不相同的顯示卡進行相應的調節。您將在本章看到一些用於確定顯示尺寸的其他方法。
早期,許多使用者在單色顯示器上執行Windows。即使是幾年前,筆記本電腦也還只有灰階顯示。為此,GDI的設計保證了您可以在編寫一個程式時不必太擔心色彩問題-也就是說,Windows可以將色彩轉換為灰階顯示。甚至在今天,Windows 98使用的視訊顯示已經具有了不同的色彩能力(16色、256色、「high-Color」以及「true-color」)。雖然,彩色噴墨印表機的成本已經很低了,但是大多數使用者仍然堅持使用黑白印表機。盲目地使用這些設備是可以的,但是您的程式也應該能決定在某種顯示設備上有多少色彩可以使用,從而最佳利用硬體功能。
當然,就如同您編寫C程式時,為了使它在其他電腦上執行而遇到一些微妙的移植性問題一樣,您也可能不小心讓裝置依賴性溜進您的Windows程式,這就是不與硬體完全隔離的代價。您還應該知道Windows GDI的局限。雖然可以在顯示器上到處移動圖形物件,但GDI通常是一個靜態的顯示系統,只有有限的動畫支援。如果需要為遊戲編寫複雜的動畫,就應該研究一下Microsoft DirectX,它提供了您需要的支援。