簡體   English   中英

如何在win32中獲取鼠標光標的RGB字節數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM