2016-12-01 67 views
0

我用下面的代碼來獲取鼠標光標的位圖:如何在win32中獲取鼠標光標的RGB字節數組?

HCURSOR hCursor = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED | LR_DEFAULTSIZE); 

ICONINFO info = { 0 }; 
BOOL ret = GetIconInfo(hCursor, &info); 

當我info.hbmMask位圖保存到一個文件,它看起來像這樣:

Mouse cursor bitmap

我想用這個遊標作爲繪製的Direct3d9紋理。我不知道如何將這個單色位圖轉換成可用於創建紋理的RGB字節緩衝區。

或者有沒有其他方法可以獲得標準Windows遊標的RGB字節數組?

+2

使用'GetDIBits'從位圖中提取位。 –

回答

1

的圖標由位圖一起,工作作爲在ICONINFO documentation描述:

hbmMask
類型:HBITMAP

圖標位掩碼位圖。如果此結構定義了黑白圖標,則此位掩碼將被格式化,以便上半部分是圖標AND位掩碼,下半部分是圖標XOR位掩碼。在這種情況下,高度應該是偶數倍。如果此結構定義了顏色圖標,則此掩碼只定義圖標的AND位掩碼。

hbmColor
類型:HBITMAP

的句柄圖標顏色位圖。如果此結構定義了黑白圖標,則此成員可以是可選的。 hbmMask的AND位掩碼與SRCAND標誌一起被應用到目的地;隨後,通過使用SRCINVERT標誌將顏色位圖應用於(使用XOR)目標。

在你的情況,你有一個單色圖標,所以hbmColor是NULL和hbmMask同時包含掩碼和顏色。上半部分是AND',其目標是清除像素併爲該圖標創建一個空白區域,然後用目標填充由掩碼創建的空間的下半部分。

對於非單色圖標,hbmMaskAND「ED原樣與目標,然後hbmColorXOR ED原樣與目標。

由於雷蒙德陳在他的評論中指出,可以通過「使用GetDIBits()的位從位圖提取」。因此,您必須從適當的HBITMAP中提取像素位,並根據您是否使用單色圖標來處理它們。