用CreateBitmap或CreateBitmapIndirect來建立設備相關GDI點陣圖物件時,您可以給點陣圖圖素位元指定一個指標。或者您也可以讓點陣圖維持未初始化的狀態。在建立點陣圖以後,Windows還提供兩個函式來獲得並設定圖素位元。
要設定圖素位元,請呼叫:
SetBitmapBits (hBitmap, cBytes, &bits) ;
GetBitmapBits函式有相同的語法:
GetBitmapBits (hBitmap, cBytes, &bits) ;
在這兩個函式中,cBytes指明要複製的位元組數,bits是最少cBytes大小的緩衝區。
DDB中的圖素位元從頂列開始排列。我在前面說過,每列的位元組數都是偶數。除此之外,沒什麼好說明的了。如果點陣圖是單色的,也就是說它有1個位元面並且每個圖素占1位元,則每個圖素不是1就是0。每列最左邊的圖素是本列第一個位元組最高位元的位元。我們在本章的後面講完如何顯示單色DDB之後,將做一個單色的DDB。
對於非單色點陣圖,應避免出現您需要知道圖素位元含義的狀況。例如,假定在8位顏色的VGA上執行Windows,您可以呼叫CreateCompatibleBitmap。通過GetDeviceCaps,您能夠確定您正處理一個有1個顏色位元面和每圖素8位元的設備。一個位元組儲存一個圖素。但是圖素值0x37是什麼意思呢?很明顯是某種顏色,但到底是什麼顏色呢?
圖素實際上並不涉及任何固定的顏色,它只是一個值。DDB沒有顏色表。問題的關鍵在於:當DDB顯示在螢幕上時,圖素的顏色是什麼。它肯定是某種顏色,但具體是什麼顏色呢?顯示的圖素將與在顯示卡上的調色盤查看錶里的0x37索引值代表的RGB顏色有關。這就是您現在碰到的裝置依賴性。
不過,不要只因為我們不知道圖素值的含義,就假定非單色DDB沒用。我們將簡要看一下它們的用途。下一章,我們將看到SetBitmapBits和GetBitmapBits函式是如何被更有用的SetDIBits和GetDIBits函式所取代的。
因此,基本的規則是這樣的:不要用CreateBitmap、CreateBitmapIndirect或SetBitmapBits來設定彩色DDB的位元,您只能安全地使用這些函式來設定單色DDB的位元。(如果您在呼叫GetBitmapBits期間,從其他相同格式的DDB中獲得位元,那么這些規則例外。)
在繼續之前,讓我再討論一下SetBitmapDimensionEx和GetBitmapDimensionEx函式。這些函式讓您設定(和獲得)點陣圖的測量尺寸(以0.1毫米為單位)。這些資訊與點陣圖解析度一起儲存在GDI中,但不用於任何操作。它只是您與DDB聯繫的一個測量尺寸標識。