如何使用自定义游标

How to use a custom cursor?

本文关键字:游标 自定义 何使用      更新时间:2023-10-16

我正在尝试将默认操作系统光标更改为自定义光标。到目前为止,我只处理Windows。我得到了一个带有我想要的光标的图像文件(.png,我应该改变格式吗?)总而言之,我一直在搜索,并试图简单地改变光标,但没有成功。另外,到目前为止,我正在寻找最简单的解决方案,使用尽可能少的代码行。

如果有关

:
-我使用SFML(2.1)创建的窗口。

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

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

以下作品:)但是,它会立即恢复到默认的windows鼠标:

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

我发现了这个链接,它似乎和我的一样有问题。
然而,我无法应用链接

中给出的答案。
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,也有人删除了他们的答案。虽然[对于新手来说过于复杂],但它确实提供了如何在程序上正确实现自定义游标的重要信息,以及如何在苹果操作系统上实现它。
-这也是有用的。
-colinsmith提到游标文件必须是。cur或。ani, .png确实不起作用

  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是如何处理光标的…