《Windows程序設計》讀書筆記------------->>GDI的簡單基礎

關於GDI 

GDI全稱爲Graphics Device Interface(圖形設備接口)

圖形設備接口(GDI:Graphics Device Interface)是Windows的子系統,它負責在視訊顯示器和打印機上顯示圖形。正如您所認爲的那樣,GDI是Windows非常重要的部分。不只您爲Windows編寫的應用系統在顯示視覺信息時使用GDI,就連Windows本身也使用GDI來顯示使用者接口對象,諸如菜單、滾動條、圖標和鼠標光標。

由n多函數組成,所以要學完GDI就可以寫一本書了,只要知道個大概就行了。

供設備無關的顯示、打印支持。

提供向量和位圖兩種方式繪圖。

許多傳統的計算機圖形程序設計方式都是完全以向量爲主的,這意味着使用向量圖形系統的程序與硬件有着一定層次的隔離。輸出設備用圖素表示圖形,但是程序與程序接口之間並不是用圖素進行溝通的。您當然可以使用Windows GDI作爲一個高階的向量繪製系統,同時也可以將它用於比較低階的圖素操作。

從這方面來看,Windows GDI和傳統的圖形接口語言之間的關係,就如同C和其它程序設計語言之間的關係一樣。C以它在不同操作系統和環境之間的高度可移植性而聞名,然而C也以允許程序寫作者進行低階系統呼叫而聞名,這些呼叫在其它高級語言中通常是不可能的。正如C有時被認爲是一種「高級彙編語言」一樣,您可以認爲GDI是圖形設備硬件之間的一種高階界面。

------------------------------------------下面就是應用了,因爲都有小標題,就不寫了--------------------------------------------

GDI函數呼叫

組成GDI的幾百個函數呼叫可以分爲幾大類:

  • 取得(或者建立)和釋放(或者清除)設備內容的函數 我們在前面的章節中已經看到過,您在繪圖時需要設備內容句柄。GetDC和RealseDC函數讓您在非WM_PAINT的消息處理期間來做到這一點,而BeginPaint和EndPaint函數(雖然在技術上它們是USER模塊而不是GDI模塊的一部分)在進行繪圖的WM_PAINT消息處理期間使用。我們馬上還會介紹有關設備內容的其它一些函數。
     
  • 取得有關設備內容信息的函數再以第四章中SYSMETS程序爲例,我們使用GetTextMetrics函數來取得有關設備內容中目前所選字體的尺寸信息。在本章後面,我們將看到一個取得非常廣泛的設備內容信息的DEVCAPS1程序
     
  • 繪圖函數顯然,在所有前提條件都得以滿足之後,這些函數是真正重要的部分。在上一章中,我們使用TextOut函數在窗口的顯示區域顯示一些文字。我們將看到,其它GDI函數還可以讓您畫線、填入區域。在第十四章第十五章還會看到如何建立位圖圖像。
     
  • 設定和取得設備內容參數的函數設備內容的「屬性」決定有關繪圖函數如何工作的細節。例如,用SetTextColor來指定TextOut(或者其它文字輸出函數)所繪製的文字色彩。在第四章中SYSMETS程序中,我們使用SetTextAlign來告訴GDI:TextOut函數中的字符串的開始位置應該在字符串的右邊而不是內定的左邊。設備內容的所有屬性都有默認值,取得設備內容時這些默認值就設定好了。對於所有的Set函數,都有相應的Get函數,以允許您取得目前設備內容屬性。
     
  • 使用GDI對象的函數GDI在這裏變得有點混亂。首先舉一個例子:內定時使用GDI繪製的所有直線都是實線並具有一個標準的寬度。您可能希望繪製更細的直線,或者是由一系列的點或短劃線組成的直線。這種線的寬度和這種線的畫筆樣式不是設備內容的屬性,而是一個「邏輯畫筆」的特徵。您可以通過在CreatePen、 CreatePenIndirect或ExtCreatePen函數中指定這些特徵來建立一個邏輯畫筆,這些函數傳回一個邏輯畫筆的句柄(雖然這些函數被認爲是GDI的一部分,但是和大多數GDI函數呼叫不一樣,它們不要求設備內容的句柄)。要使用這個畫筆,就要將畫筆句柄選進設備內容。我們認爲,設備內容中目前選中的畫筆就是設備內容的一個屬性。這樣,您畫任何線都使用這個畫筆,然後,您可以取消設備內容中的畫筆選擇,並清除畫筆對象。清除畫筆對象是必要的,因爲畫筆定義佔用了分配的內存空間。除了畫筆以外,GDI對象還用於建立填入封閉區域的畫刷、字體、位圖以及GDI的其它一些方面。
     

GDI基本圖形

您在屏幕或打印機上顯示的圖形型態本身可以被分爲幾類,通常被稱爲「基本圖形」,它們是:

  • 直線和曲線線條是所有向量圖形繪製系統的基礎。GDI支持直線、矩形、橢圓(包括橢圓的子集,也就是我們所說的「圓」)、橢圓圓周上的部分曲線即所謂的「弧」以及貝塞爾曲線(Bezier spline),我們將在本章中分別對它們進行介紹。所有更復雜的曲線可由折線(polyline)代替,折線通過一組非常短的直線來定義一條曲線。線條用設備內容中選中的目前畫筆繪製。
     
  • 填入區域當一系列直線或者曲線封閉了一個區域時,該區域可以使用目前GDI畫刷對象進行填圖。這個畫刷可以是實心色彩、圖案(可以是一系列的水平、垂直或者對角標記)或者是在區域內垂直或者水平重複的位圖圖像。
     
  • 位圖位圖是位的矩形數組,這些位對應於顯示設備上的圖素,它們是位映像圖形的基礎工具。位圖通常用於在視訊顯示器或者打印機上顯示覆雜(一般都是真實的)圖像。位圖還可以用於顯示必須快速繪製的小圖像(諸如圖標、鼠標光標以及在應用工具條中出現的按鈕等)。GDI支持兩種型態的位圖-舊式的(雖然還非常有用)「設備相關」位圖,是GDI對象;和新的(如Windows 3.0的)「設備無關」位圖(或者DIB),可以儲存在磁盤文件中。第十四章第十五章討論位圖。
     
  • 文字文字的數學味道不像計算機圖形的其它方面那樣濃。文字和幾百年的傳統印刷術有關,它被許多印刷工人看作爲一門藝術。因此,文字通常不僅是所有的計算機圖形系統中最複雜的部分,而且(如果識字還是社會基本要求的話)也是最重要的部分。用於定義GDI字體對象和取得字體信息的數據結構是Windows中最龐大的部分之一。從Windows 3.1開始,GDI開始支持TrueType字體,該字體是在填入輪廓線基礎上建立的,這樣的填入輪廓線可由其它GDI函數處理。依據兼容性和儲存大小的考慮,Windows 98繼續支持舊式的點陣字體。我會在第十七章討論字體。
     

其它部分

GDI的其它部分無法這麼容易地分類,它們是:

  • 映像模式和變換雖然內定以圖素爲單位進行繪圖,但是您並非侷限於此。GDI映像模式允許您以英寸(或者甚至以幾分之一英寸)、毫米或者任何您想使用的單位來繪圖(Windows NT還支持傳統的以三乘三矩陣表示的「座標變換」, 這允許傾斜和旋轉圖形對象。不幸的是,在Windows 98中不支持座標變換)。
     
  • MetafileMetafile是以二進制形式儲存的GDI命令集合。Metafile主要用於通過剪貼板傳輸向量圖形。第十八章會討論metafile。
     
  • 繪圖區域繪圖區域是形狀任意的複雜區域,通常定義爲較簡單的繪圖區域組合。在GDI內部,繪圖區域除了儲存爲最初用來定義繪圖區域的線條組合以外,還以一系列掃描線的形式儲存。您可以將繪圖區域用於繪製輪廓、填入圖形和剪裁。
     
  • 路徑路徑是GDI內部儲存的直線和曲線的集合。路徑可以用於繪圖、填入圖形和剪裁,還可以轉換爲繪圖區域。
     
  • 剪裁繪圖可以限制在顯示區域的某一部分中,這就是所謂的剪裁。剪裁區域是不是矩形都可以,剪裁通常是通過區域或者路徑來定義的。
     
  • 調色盤自訂調色盤通常限於顯示256色的顯示器。Windows僅保留這些色彩之中的20種以供系統使用,您可以改變其它236種色彩,以準確顯示按位圖形式儲存的真實圖像。第十六章會討論調色盤。
     
  • 打印雖然本章限於討論視訊顯示,但是您在本章中所學到的全部知識都適用於打印。第十三章會討論打印。


 

GDI可以使用兩種座標系統(依據實際度量衡的座標系和虛擬座標系)後面有學到
---------------------------------------------------------
這些動態鏈接庫呼叫您安裝的視訊顯示器和任何打印機呼叫驅動程序中的例程。視訊驅動程序存取視訊顯示器的硬件,打印機驅動程序將GDI命令轉換爲各種打印機能夠理解的代碼或者命令。顯然,不同的視訊顯示卡和打印機要求不同的設備驅動程序。
因爲PC兼容機種上可以連接許多種不同的視訊設備,所以,GDI的主要目的之一是支持與設備無關的圖形。Windows程序應該能夠毫無困難地在Windows支持的任意一種圖形輸出設備上執行,GDI通過將您的程序和不同輸出設備的特性隔離開來的方法來達到這一目的。
----------------------------------------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章