簡介
但是首先讓我們看一下DIBHELP函式所處理的結構,該結構在DIBHELP.C中定義如下:
typedef struct
{
PBYTE * ppRow ; // array of row pointers
int iSignature ; // = "Dib "
HBITMAP hBitmap ; // handle returned from CreateDIBSection
BYTE * pBits ; // pointer to bitmap bits
DIBSECTION ds ; // DIBSECTION structure
int iRShift[3] ; // right-shift values for color masks
int iLShift[3] ; // left-shift values for color masks
}
DIBSTRUCT, * PDIBSTRUCT ;
最後兩個欄位
DIBSECTION結構的最後兩個欄位指的是DIB區塊,此區塊由檔案映射建立。DIBHELP不使用CreateDIBSection的這個特性,因此可以忽略這些欄位。
DIBSTRUCT的最後兩個欄位儲存左右移位值,這些值用於處理16位元和32位元DIB的顏色遮罩。我們將在第十五章討論這些移位值。
讓我們再回來看一下DIBSTRUCT的第一個欄位。正如我們所看到的一樣,在開始建立DIB時,此欄位設定為指向一個指標陣列的指標,該陣列中的每個指標都指向DIB中的一行圖素。這些指標允許以更快的方式來獲得DIB圖素位元,同時也被定義,以便頂行可以首先引用DIB圖素位元。此陣列的最後一個元素-引用DIB圖像的最底行-通常等於DIBSTRUCT的pBits欄位。
第一個、第三個欄位
現在跳過第一個欄位。它之所以為第一個欄位是因為它使某些巨集更易於使用-在討論完其他欄位以後再來理解第一個欄位就更容易了。
在DIBHELP.C中,當DIB建立的函式首先設定了此結構時,第二個欄位就設定為文字字串「Dib」的二進位值。通過一些DIBHELP函式,第二個欄位將用於結構有效指標的一個標記。
第三個欄位,即hBitmap,是從CreateDIBSection函式傳回的點陣圖代號。您將想起該代號可有多種使用方式,它與我們在第十四章遇到的GDI點陣圖物件的代號用法一樣。不過,從CreateDIBSection傳回的代號將涉及按裝置無關格式儲存的點陣圖,該點陣圖格式一直儲存到通過呼叫BitBlt和StretchBlt來將位元圖畫到輸出設備。
DIBSTRUCT的第四個欄位是指向點陣圖位元的指標。此值也可由CreateDIBSection函式設定。您將想起,作業系統將控制這個記憶體塊,但套用程式有存取它的許可權。在刪除點陣圖代號時,記憶體塊將自動釋放。
DIBSTRUCT的第五個欄位是DIBSECTION結構。如果您有從CreateDIBSection傳回的點陣圖代號,那么您可以將代號傳遞給GetObject函式以獲得有關DIBSECTION結構中的點陣圖資訊:
GetObject (hBitmap, sizeof (DIBSECTION), &ds) ;
作為提示,DIBSECTION結構在WINGDI.H中定義如下:
typedef struct tagDIBSECTION {
BITMAP dsBm ;
BITMAPINFOHEADER dsBmih ;
DWORD dsBitfields[3] ; // Color masks
HANDLE dshSection ;
DWORD dsOffset ;
}
DIBSECTION, * PDIBSECTION ;
第一個欄位是BITMAP結構,它與CreateBitmapIndirect一起建立點陣圖物件,與GetObject一起傳回關於DDB的資訊。第二個欄位是BITMAPINFOHEADER結構。不管點陣圖資訊結構是否傳遞給CreateDIBSection函式,DIBSECTION結構總有BITMAPINFOHEADER結構而不是其他結構,例如BITMAPCOREHEADER結構。這意味著在存取此結構時,DIBHELP.C中的許多函式都不必檢查與OS/2相容的DIB。
對於16位元和32位元的DIB,如果BITMAPINFOHEADER結構的biCompression欄位是BI_BITFIELDS,那么在資訊表頭結構後面通常有三個遮罩值。這些遮罩值決定如何將16位元和32點陣圖素值轉換成RGB顏色。遮罩儲存在DIBSECTION結構的第三個欄位中。