[英]How to get RGB byte array for the mouse cursor in win32?
我使用以下代碼來獲取鼠標光標位圖:
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
位圖保存到文件時,它看起來像這樣:
我想將此光標用作 Direct3d9 紋理進行繪圖。 我不知道如何將此單色位圖轉換為可用於創建紋理的 RGB 字節緩沖區。
或者有沒有其他方法可以獲得標准 Windows 光標的 RGB 字節數組?
圖標由兩個位圖共同構成,如ICONINFO
文檔中所述 :
hbmMask
類型:HBITMAP圖標位掩碼位圖。 如果此結構定義了黑白圖標,則將格式化此位掩碼,以便上半部分為圖標AND位掩碼,下半部分為圖標XOR位掩碼。 在這種情況下,高度應為2的偶數倍。 如果此結構定義了彩色圖標,則此掩碼僅定義圖標的AND位掩碼。
hbmColor
類型:HBITMAP圖標顏色位圖的句柄。 如果此結構定義了黑白圖標,則該成員可以是可選的。 hbmMask的AND位掩碼與SRCAND標志一起應用於目標; 隨后,通過使用SRCINVERT標志將顏色位圖(使用XOR)應用於目標。
在您的情況下,您有一個單色圖標,因此hbmColor
為NULL, hbmMask
包含蒙版和顏色。 上半部分AND
目標進行“與” XOR
以清除像素並為圖標創建一個空白空間,然后下半部分與目標進行XOR
以填充由掩碼創建的空間。
對於非單色圖標, hbmMask
將與目標按原樣進行AND
XOR
,然后hbmColor
將與目標按hbmColor
進行XOR
。
正如Raymond Chen在其評論中所述,您可以“ 使用GetDIBits()
從位圖中提取位 ”。 因此,您必須從適當的HBITMAP
提取像素位,並根據是否使用單色圖標進行處理。
下面介紹如何使用GetDIBits()
獲取游標數據的字節數組。 為此,請調用GetDIBits()
兩次,一次獲取光標圖像的實際細節,另一次獲取像素。
您可以將此代碼應用於顏色和蒙版,但請注意,它僅返回 32x32 像素的光標,即使為其他內容配置了大小。
之后,您可以同時調整兩者。
var windowDeviceContext = User32.GetWindowDC(IntPtr.Zero);
//Initialize the bitmap header and calculate its size.
var maskHeader = new BitmapInfoHeader();
maskHeader.Size = (uint) Marshal.SizeOf(maskHeader);
//Gets the image details.
Gdi32.GetDIBits(windowDeviceContext, iconInfo.Mask, 0, 0, null, ref maskHeader, DibColorModes.RgbColors);
//If there's any data, get it.
if (maskHeader.Height != 0)
{
//To prevent the cursor image from being inverted.
maskHeader.Height *= -1;
var maskBuffer = new byte[maskHeader.SizeImage];
Gdi32.GetDIBits(windowDeviceContext, iconInfo.Mask, 0, (uint) maskHeader.Height, maskBuffer, ref maskHeader, DibColorModes.RgbColors);
}
它是 C#,但可以輕松轉換為您選擇的語言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.