如何使用自定义光标?

时间:2014-08-06 21:42:23

标签: 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'使用

2 个答案:

答案 0 :(得分:4)

在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,也有人删除了他们的回答。虽然[过于复杂的Noob],它似乎提供了关于如何在程序上正确实现自定义游标的很好的信息,以及如何在苹果操作系统上执行它而不是 - This也很有用 -colinsmith提到光标文件必须是.cur或.ani,.png确实不起作用

答案 1 :(得分:0)

  1. 此处描述了从位图创建光标http://www.codeproject.com/Articles/5220/Creating-a-color-cursor-from-a-bitmap 使用CImage可以轻松地将png转换为位图。只需加载PNG并分离HBITMAP即可。但单独的Bitmap不是Cursor。
  2. 游标由接收WM_SETCURSOR的窗口设置。所以&#34;替换&#34;特定的光标不起作用。您必须拦截WM_SETCURSOR消息以更改应返回的游标。
  3. 您的Edit2错误,因为您需要一个有效的窗口句柄来更改窗口类中的光标。但是如果窗口通过ist自己处理Cursor(参见2)
  4. ,这将永远不会起作用

    PS:在你询问如何全局更改游戏之前,最好先了解一下Windows如何处理游标......