天天看點

《Windows API巡禮》のGetObject函數和GradientFill函數

GetObject函數用于從指定的圖形對象中擷取資訊,原型如下:

int GetObject(

__in HGDIOBJ hgdiobj,

__in int cbBuffer,

__out LPVOID lpvObject

);

其中

(1)參數hgdiobj是圖形對象的句柄,圖形對象可以是如下幾種:邏輯位圖、刷子、字型、調色闆、畫筆或者由函數CreateDIBSection建立的裝置無關位圖;

(2)參數cbBuffer是即将寫入到緩沖區中的圖形對象資訊的位元組數;

(3)參數lpvObject是指向接收圖形對象資訊的緩沖區的指針,下表是每一種圖形對象對應擷取到的緩沖區中的資訊:

傳回值:

當函數執行成功且參數lpvObject為NULL時,傳回值是儲存擷取的資訊的緩沖區需要的位元組數;

當函數執行成功且參數lpvObject是有效地指針時,傳回值是存儲到緩沖區中的資料的位元組數;

當函數執行失敗時,傳回值是0。

執行個體代碼如下,使用GetObject函數擷取指定位圖的大小:

/********************************************************************

* 擷取指定位圖的寬和高

********************************************************************/

inline void GetBitmapSize(HBITMAP hBitmap, int& nWidth, int& nHeight)

{

BITMAP bm;

::GetObject(hBitmap, sizeof(BITMAP), (PSTR)&bm);

nWidth = bm.bmWidth;

nHeight = bm.bmHeight;

}

GradientFill函數用于填充矩形和三角形結構,原型如下:

BOOL GradientFill(

__in HDC hdc,

__in PTRIVERTEX pVertex,

__in ULONG nVertex,

__in PVOID pMesh,

__in ULONG nMesh,

__in ULONG ulMode

);

其中

(1)參數hdc是目标裝置上下文的句柄;

(2)參數pVertex是指向存儲TRIVERTEX結構資料的數組;

(3)參數nVertex是數組pVertex中的頂點數;

(4)參數pMesh在三角形模式中表示存儲GRADIENT_TRIANGLE結構資料的數組;在矩形模式中表示存儲GRADIENT_RECT結構資料的數組;

(5)參數nMesh是pMesh數組中元素的個數;

(6)參數ulMode指定漸變填充模式,取值如下:

傳回值:

函數執行成功時傳回TRUE;失敗時傳回FALSE;

上面函數中使用到了幾個結構,下面分别介紹:

1)TRIVERTEX結構包含了顔色資訊和位置資訊,原型如下:

typedef struct _TRIVERTEX {

LONG x; //邏輯機關下矩形左上角的x坐标

Long y; //邏輯機關下矩形左上角的y坐标

COLOR16 Red; //上述點的顔色資訊

COLOR16 Green;

COLOR16 Blue;

COLOR16 Alpha;

} TRIVERTEX, *PTRIVERTEX;

2)GRADIENT_RECT結構指定了函數GradientFill中參數pVertex數組中的兩個點的索引,這兩個點分别是一個矩形的左上角和右下角點,結構原型如下:

typedef struct _GRADIENT_RECT {

ULONG UpperLeft; //矩形左上角

ULONG LowerRight; //矩形右下角

} GRADIENT_RECT, *PGRADIENT_RECT;

3)GRADIENT_TRIANGLE結構指定了函數GradientFill函數中pVertex數組中的三個點的索引,這三個點組成一個三角形,結構原型如下:

繼續閱讀