我想在Windows光标图标。 我觉得语言我用的是不是在这里非常重要,所以我只写与WinAPI的功能,我想用伪代码:
c = CURSORINFO.new(20, 1, 1, POINT.new(1,1));
GetCursorInfo(c); #provides correctly filled structure with hCursor
DrawIcon(GetWindowDC(GetForegroundWindow()), 1, 1, c.hCursor);
所以这部分工作得很好,它绘制活动窗口的当前光标。 但是,这不是我想要的。 我想获得一个像素阵列,所以我应该画在内存中。
我试图做这样的:
hdc = CreateCompatibleDC(GetDC(0)); #returns non-zero int
canvas = CreateCompatibleBitmap(hdc, 256, 256); #returns non-zero int too
c = CURSORINFO.new(20, 1, 1, POINT.new(1,1));
GetCursorInfo(c);
DrawIcon(hdc, 1, 1, c.hCursor); #returns 1
GetPixel(hdc, 1, 1); #returns -1
为什么不GetPixel()返回COLORREF? 我在想什么?
我不是很有经验的WinAPI的,所以我可能做一些愚蠢的错误。
你必须选择创建到设备上下文的位图。 如果没有, GetPixel
函数将返回CLR_INVALID
(0xFFFFFFFF的):
位图必须在设备范围内进行选择,否则, CLR_INVALID
对所有像素返回。
此外,还有你的伪代码被严重泄漏对象。 当调用GetDC
,你必须调用ReleaseDC
当你使用它完成。 每当您创建一个GDI对象,你当你使用完毕,必须摧毁它。
最后,你似乎是假设为原点,即点的坐标,左上角点为(1,1)。 他们实际上是(0,0)。
下面是我会写(检查略去了错误)的代码:
// Get your device contexts.
HDC hdcScreen = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC(hdcScreen);
// Create the bitmap to use as a canvas.
HBITMAP hbmCanvas = CreateCompatibleBitmap(hdcScreen, 256, 256);
// Select the bitmap into the device context.
HGDIOBJ hbmOld = SelectObject(hdcMem, hbmCanvas);
// Get information about the global cursor.
CURSORINFO ci;
ci.cbSize = sizeof(ci);
GetCursorInfo(&ci);
// Draw the cursor into the canvas.
DrawIcon(hdcMem, 0, 0, ci.hCursor);
// Get the color of the pixel you're interested in.
COLORREF clr = GetPixel(hdcMem, 0, 0);
// Clean up after yourself.
SelectObject(hdcMem, hbmOld);
DeleteObject(hbmCanvas);
DeleteDC(hdcMem);
ReleaseDC(hdcScreen);
但是最后一个警告-该DrawIcon
功能像您期望可能会无法正常工作。 它仅限于在缺省大小绘制的图标或光标。 在大多数系统中,这将是32×32。 从文档:
DrawIcon
绘制使用由用于图标的系统量度值所指定的宽度和高度的图标或光标; 有关详细信息,请参阅GetSystemMetrics
。
相反,你可能想使用DrawIconEx
功能 。 下面的代码将绘制光标在资源的实际尺寸:
DrawIconEx(hdcMem, 0, 0, ci.hCursor, 0, 0, 0, NULL, DI_NORMAL);