如何在win32中获取鼠标光标的RGB字节数组?

时间:2016-12-01 10:07:08

标签: c++ windows winapi gdi direct3d

我使用以下代码获取鼠标光标位图:

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字节数组?

1 个答案:

答案 0 :(得分:1)

图标由两个位图组成,如ICONINFO documentation中所述:

  

hbmMask
  键入:HBITMAP

     

图标位掩码位图。如果此结构定义了黑白图标,则对此位掩码进行格式化,使上半部分为图标AND位掩码,下半部分为图标XOR位掩码。在这种情况下,高度应该是两倍的偶数倍。如果此结构定义了颜色图标,则此掩码仅定义图标的AND位掩码。

     

hbmColor
  键入:HBITMAP

     

图标颜色位图的句柄。如果此结构定义了黑白图标,则此成员可以是可选的。 hbmMask的AND位掩码与SRCAND标志一起应用于目标;随后,使用SRCINVERT标志将颜色位图(使用XOR)应用于目标。

在您的情况下,您有一个单色图标,因此hbmColor为NULL,hbmMask包含蒙版和颜色。上半部分是AND,目标是清除像素并为图标创建一个空白区域,然后下半部分与目标XOR一起填充创建的空间通过面具。

对于非单色图标,hbmMaskAND与目标一致,然后hbmColor将被XOR编辑为HBITMAP - 与目标一起。

正如Raymond Chen在他的评论中所说,你可以" 使用GetDIBits()从位图中提取位"。因此,您必须从相应的$('#aTable select').each(function(){ console.log($(this).find('option:selected').text()); }); 中提取像素位,并根据您是否使用单色图标来处理它们。