【问题标题】:How to use a custom cursor?如何使用自定义光标?
【发布时间】:2014-09-29 23:58:51
【问题描述】:

我正在尝试将默认操作系统光标更改为自定义光标。截至目前,我只处理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”

【问题讨论】:

  • 它必须是 .cur 或 .ani 文件......使用支持该格式的资源编辑器或图形包......如果要从文件加载,请使用 LoadCursorFromFile.. ..或将其放入您的“资源”中,并使用 LoadCursor 访问该资源(通过其“id”)。 ....msdn.microsoft.com/en-gb/library/windows/desktop/…
  • 谢谢 :) 它现在可以在屏幕上加载和显示光标 :) 它确实消失了
  • 为什么不简单地隐藏光标(它是 sf::Window 类的成员函数)并在鼠标位置显示一个精灵?这比覆盖操作系统光标要简单得多。
  • 这样做输入延迟很糟糕。通过覆盖 OS 光标,即使在低 fps 下也不会出现输入延迟。

标签: c++ windows mfc sfml mouse-cursor


【解决方案1】:

在大约 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... :)
}

来源:

-该解决方案是从互联网上掠夺的,但主要来自Overcomplicated for a Noob,删除答案的人也提到了这一点。虽然 [对于菜鸟来说过于复杂],但它似乎确实提供了有关如何在程序上正确实现自定义光标以及如何在苹果操作系统上执行此操作的重要信息
-This 也很有用。
-colinsmith 提到游标文件必须是.cur 或.ani,.png 确实不行

【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多