绘制鼠标指针图标?

5

我正在编写一个小型有趣的工具。我希望能够在与原始鼠标不同的位置绘制第二个(或更多)鼠标指针图标,但根据原始鼠标的移动来移动它。

我知道如何跟踪鼠标的移动,但是我不知道如何绘制/重绘鼠标指针;有人能帮忙吗?

2个回答

7
你可以使用以下代码:
CURSORINFO ci;
ci.cbSize = sizeof(CURSORINFO);
GetCursorInfo(&ci);

接下来,您可以调用以下代码绘制光标:

DrawIcon(ContextDC, YourXPosition, YourYPosition, ci.hCursor);

如果您需要有关光标的其他信息,例如热点,请查看ICONINFO结构:
ICONINFO ii;
GetIconInfo(ci.hCursor, &ii);

那就是我寻找的答案,因为DrawCursor()不存在。MSDN上说:DrawIcon()函数:在指定的设备上下文中绘制图标或光标。 - Elmue
不要忘记初始化 CURSORINFO 的大小,所以 ci.cbSize = sizeof(ci); - Ziriax

1

这可以这样做:

  1. 使用 LoadCursor() 从您的应用程序中获取当前鼠标光标。只需指定 NULL 和您想要的光标即可,或者加载一个位图作为光标。现在,您有了一个位图。

  2. 下一步是获取您的桌面设备上下文:GetWindowDC(NULL)。这将使您有机会在桌面的任何位置绘制。

  3. 很有可能您需要使用 #1 中的图像和 #2 中获得的 DC 应用 CreateCompatibleBitmap()

  4. 现在,使用一些 BitBlt() 将位从 #2 中获得的 DC 复制到您想要放置光标的位置的保存图像中(您需要创建这些图像)。

现在,将第3步获得的图像放置在第2步获得的桌面DC上的所需位置。

当用户移动鼠标时,使用#4处保存的数据还原桌面上的图像。释放所有不需要的东西(是的,这是强制性的)。

然后从#1重新开始。

这两个链接可能会有所帮助:

位图、设备上下文和BitBlt

捕获图像

祝你好运!


这种方式永远不会以清晰的方式工作。想象一下一个显示动态内容的窗口,就像浏览器显示动画一样。当用户移动鼠标时,您想要复制回旧内容,然后会出现很多伪影。干脆放弃吧。 - Elmue
我会简单地加载光标位图,然后创建一个单独的透明窗口来显示它,然后根据需要移动该窗口。这样编码更加清晰易懂,而且完全不必与桌面打交道。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接