VLV*_*VLV 6 c++ windows mfc cursor sfml
我正在尝试将默认操作系统光标更改为自定义光标。截至目前,我只处理 Windows。我得到了一个带有我想要的光标的图像文件(.png,我应该更改格式吗?)。总而言之,我一直在搜索并尝试简单地更改光标,但没有成功。另外,到目前为止,我正在寻找最简单的解决方案,代码行越少越好。
如果相关:-我
正在使用一个用 SFML(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);
我(显然?)得到:
使用了未初始化的局部变量“windowHandle”
在尝试让自定义鼠标在 Windows 上与 SFML 一起工作大约 4 小时 30 分钟后,我终于设法完成了一项我预计不超过 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... :)
}
资料来源:
- 这个解决方案是从互联网上掠夺来的,但主要来自Overcomplicated for a Noob,也有人删除了他们的答案。尽管 [对于新手来说过于复杂],它似乎确实提供了有关如何在程序上正确实现自定义游标以及如何在 Apple OS 上实现自定义游标的重要信息
-这也很有用。
-colinsmith 提到光标文件必须是 .cur 或 .ani,.png 确实不起作用