如何使用自定义光标?

我试图将默认的OS光标更改为自定义的一个。 截至目前,我只处理Windows。 我得到一个图像文件,我想要的光标(.png,我应该改变格式?)。 总而言之,我一直在寻找并试图简单地改变光标,但没有成功。 此外,截至目前我正在寻找最简单的解决scheme,尽可能less的代码行。

如果相关:
– 我用的是使用SFML创build的窗口(2.1)。
– 以下编译但没有区别:

HCURSOR hCursor = LoadCursor(NULL, "path/filename.png"); SetCursor(hCursor); 

那么,我在寻求社区的知识,有什么想法?

下面的作品:)然而,它立即恢复到默认的Windows鼠标:

 HCURSOR hCursor = LoadCursorFromFile("path/filename.cur"); SetCursor(hCursor); 

我发现这个LINK ,这和我的问题似乎是一样的。
然而,我不能应用链接中给出的答案

 HWND windowHandle; int GCL_Hcursor = -12; //GCL_HCURSOR HCURSOR hCursor = LoadCursorFromFile("Graphics/Cursors/Pointer_small.cur"); SetCursor(hCursor); SetClassLong(windowHandle, GCL_Hcursor, (DWORD)hCursor); 

我(显然?)得到:

使用未初始化的局部variables“windowHandle”

大约4小时30分钟后,试图在Windows上获得一个使用SFML的自定义鼠标,我终于设法完成了一个我预计不超过5到10分钟的任务。 因此,我在这里留下了自己的问题的答案,因为互联网无法为像我这样的高手提供清晰明了的答案。 对于需要它的人来说,这可能是有用的。

 #include <SFML/Graphics.hpp> #include <windows.h> int main() { sf::RenderWindow window(sf::VideoMode(800, 600), "Simple Cursor Demonstration"); // {This is what matters} { sf::WindowHandle wHandle; wHandle = window.getSystemHandle(); HCURSOR Cursor = LoadCursor(NULL, IDC_HAND); // IDC_ARROW IDC_WAIT IDC_HAND... http://msdn.microsoft.com/en-us/library/ms648391%28v=vs.85%29.aspx //HCURSOR Cursor = LoadCursorFromFile("path/filename.cur"); //.cur or .ani SetCursor(Cursor); SetClassLongPtr(wHandle, GCLP_HCURSOR, reinterpret_cast<LONG_PTR>(Cursor)); } // to prove it works, just move the mouse around // not 100% sure the following actually proves it, but the above worked wonders on the project I wanted it for window.clear(sf::Color(sf::Color(0, 255, 0))); window.display(); sf::sleep(sf::milliseconds(3000)); return 0; //I've read this line or equivalent is a good idea... :) } 

资料来源:

这个解决方案是从互联网上掠夺的,但主要是从过于复杂的Noob ,这也被删除他们的答案的人提到。 虽然[过于复杂的Noob],它似乎提供了如何在程序上正确实现自定义游标,以及如何在苹果操作系统thingy
– 这也是有用的。
-colinsmith提到光标文件必须是.cur或.ani,.png确实不起作用

  1. 从位图创建一个光标在这里描述http://www.codeproject.com/Articles/5220/Creating-a-color-cursor-from-a-bitmap转换成一个位图可以很容易地用CImage&#x3002; 只需加载PNG并分离HBITMAP。 但是一个Bitmap就是没有光标。
  2. 游标由接收WM_SETCURSOR的窗口设置。 所以“替换”一个特定的光标将不起作用。 你必须拦截WM_SETCURSOR消息来改变应该返回的游标。
  3. 你的Edit2是错误的,因为你需要一个有效的窗口句柄来改变窗口的类中的光标。 但是,如果窗口自己处理光标,这将无法工作(参见2)

PS:最好告诉你自己,在你问及如何在全球范围内改变它之前,Windows如何处理光标。