設備對象屬性決定著繪圖方式,當使用GDI函數繪圖時,所繪制的圖形和文本的顏色、大小和位置等由設備對象的當前屬性決定,應用程序可以使用GDI函數改變設備對象的當前屬性。本章介紹設備對象的一些主要屬性和用於改變這些屬性的有關函數,其它的設備對象屬性在後面的章節中陸續介紹。
3.1、圖形設備接口
在第二章,我們一直在使用圖形設備接口(GDI),GDI的主要目標之一是支持在輸出設備(例如顯示器、打印機)上建立與設備無關的圖形輸出。Windows的圖形大部分是由GDI.EXE(Windows系統的一個模塊,稱GDI模塊)中的函數處理的。GDI模塊通過調用在不同設備驅動程序模塊中的例程來控制輸出設備。例如,顯示設備驅動程序用於訪問與視頻顯示器有關的硬件。通過GDI,Windows可以確定驅動程序能夠進行什麼工作,並且由於應用程序只與GDI打交道。這樣,GDI通過將應用程序與不同的輸出設備隔離,使應用程序可以在支持Windows的任何圖形輸出設備上工作。
圖形輸出設備可以分為兩組:光柵設備和矢量設備。光柵設備將圖象表示為點(象素)的圖案。這類輸出設備包括顯示設備、點陣打印機和激光打印機。向量設備用線段來繪制圖象,例如繪圖儀。Windows的GDI是一種隔離了硬件具體特性的圖形語言。雖然輸出設備用象素來表示圖形,但GDI卻可以被用作一個高級的向量繪圖系統,也可以被用來進行較低級的象素操作。
在編寫Windows應用程序時,程序員不必為顏色過分擔心,如果在應用程序中使用的一種顏色不能被該顯示器所表示,Windows或為應用程序選擇一種最直接的純顏色(顯示設備可以表示的顏色),或通過將幾種純顏色相混合來表示這種顏色。當在彩色顯示器上開發的程序運行在單色顯示器上時,Windows將使用灰度來表示顏色。應用程序也可以在程序中確定輸出設備的有關特性,例如,可表示的顏色數目、設備的顯示區的尺寸等,以便最大限度地發揮硬件的能力。
3.2、設備對象屬性
設備對象具有許多決定GDI函數在設備對象上如何工作的當前屬性。例如,在使用函數TextOut()時,只需要在函數中說明設備對象的句柄、繪制字符的起始坐標、文本和文本長度,而不用說明字體、文本顏色、背景顏色和字符間距等,因為這些特征由設備對象的屬性決定。每種設備對象都賦有缺省的屬性,可以使用GDI函數改變這些屬性中的某一個。表3-1給出了顯示設備各個屬性的缺省值,當使用GetDC()和BeginPaint()等函數初次得到一個顯示設備對象時,該對象的屬性具有缺省值。
屬性
缺省值
視區原點
(0, 0)
視區范圍
(1, 1)
窗口原點
(0, 0)
窗口范圍
(1, 1)
背景顏色
白色
背景方式
OPAQUE
位圖
任意值
刷子
WHITE_BRUSH
刷子原點
(0, 0)
裁剪區
用戶區/無效矩形區/子窗口區
調色板
DEFAULT_PALETTE
屬性
缺省值
筆的當前位置
(0, 0)
筆的顏色
BLACK_PEN
文本顏色
黑
設備的原點
用戶區的左上角
繪圖方式
R2_COPYPEN
字體
SYSTEM_FONT
字符間距
0
映射方式
MM_TEXT
多邊形填充方式
ALTERNATE
相對一絕坐標
ABSOLUTE
縮放方式
BLACKONWHITE
在本章以後的各節中將介紹其中一些設備屬性,其它屬性在以後章節中介紹。
3.3、設備坐標系
為在輸出設備上定位和繪制圖形對象,必須引入一種坐標系。Windows的各種不同類型設備所使用的坐標稱為設備坐標。它們使用笛卡爾坐標系,在這些設備坐標系中,單位都以象素的個數表示(稱為設備單位)。x軸上的值自左向右增加,y軸上的值自頂向下增加,見圖3-1。
圖3-1 Windows的設備坐標系
本節以視頻顯示設備為例介紹Windows的設備坐標系,其中的許多內容也適合用於象打印機等硬拷貝輸出設備。
在Windows環境中,視頻顯示設備是一個共享設備,即在同一時刻,顯示設備上可以同時顯示多個應用程序的輸出信息。為了保護一個程序顯示的信息不被其他程序破壞,Windows通過將顯示區看作不同的設備對象來限制應用程序輸出信息的范圍。
一個應用程序可獲取三種不同的顯示設備對象句柄,每種句柄所標識的設備對象代表屏幕上的不同區域。我們可以將這三個句柄所標識的對象視作三個不同的抽象顯示設備,都帶有如圖3-1所示的設備坐標系,但對不同的抽象設備,坐標原點不一樣的。這樣,當使用相同的起始坐標而使用不同的設備對象句柄調用GetDC函數(例如TextOut())進行繪圖時,信息顯示的位置不一樣。
第一抽象設備是用戶區對象,它的坐標原點在用戶區的左上角。定位該區域的設備坐標系稱為用戶區坐標系。使用函數GetDC()或BeginPaint()得到的句柄是標識用戶區的句柄。當使用該句柄標識該區域的句柄作為GDI函數的參數時,GDI函數所使用的坐標值是相對於用戶區坐標系。
第二個抽象設備是全窗口對象。它包括標題欄、選單、滾動桿和窗口框架等。定位這個區域的坐標系稱為全窗口坐標系,它的原點的左上角。使用函數GetWindowsDC()可以獲得該設備對象的句柄,然後通過該句柄使用全窗口坐標系在該區域中繪圖。應用程序一般不在這個區域中繪圖。
第三個抽象設備是整個屏幕對象,其坐標原點在屏幕的左上角,定位該區域的設備坐標系稱為屏幕坐標系。使用語句:
HDC hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
可以獲得該設備對象的句柄,使用該句柄的GDI函數所使用的坐標是相對於屏幕坐標系。
這三種坐標系方便了程序在不同的區域繪制圖形的需要。例如,由於使用用戶區坐標系,即使窗口在屏幕上被移動到其他位置,但用戶區中顯示的信息相對於用戶坐標系而言其坐標值不變。
使用坐標系,解決了顯示對象的定位的問題的。但以象素單位所建立的坐標系不符合用戶(或程序員)的習慣,而且在不同分