winapi - 如何在从图标文件生成的 Windows 光标上设置热点坐标?

标签 winapi cursor icons

我正在从图标文件在我的应用程序上设置自定义光标,但单击点的坐标错误。我用

设置光标
SetClassLongPtr(hwnd, GCL_HCURSOR, reinterpret_cast<LONG_PTR>cursor)

其中光标是;的结果

LoadImage(
    NULL,
    "some_path/cursor.ico", 
    IMAGE_ICON, //also tried IMAGE_CURSOR
    0, //width. 0 uses the width of the file provided
    0, //height. 0 uses the height of the file provided
    LR_LOADFROMFILE
); 

光标加载良好,但其点击来自光标图像的左下角,而不是左上角。

wikipedia article on .ico files说热点仅在 .cur 文件上指定,而不是在 .ico 上。

编辑:澄清问题

<小时/>

引用:LoadImage()SetClassLongPtr()在 msdn 上。

最佳答案

您可以使用CreateIconFromResourceEx来做到这一点

您传入一个指向 CURSOR_RES_HDR 的指针作为第一个参数。这是您可以在文档中找到的结构之一,但它不是我能找到的任何头文件。不过它非常简单,基本上是 16 位无符号整数,后跟包含光标图像数据的 BITMAPINFOHEADER。

typedef struct {
   WORD             xHot;         // x hotspot
   WORD             yHot;         // y hotspot
   BITMAPINFOHEADER bih;
   } CURSOR_RES_HDR;

...

CURSOR_RES_HDR * pImage;

// Fill out pImage

HCURSOR hcur = CreateIconFromREsourceEx((BYTE*)pImage, 
                  cbImage, // size of image data + hotspot (in bytes)
                  FALSE,
                  0x00030000, // version: value mandated by windows
                  0, 0,       // width & height, 0 means use default
                  LR_DEFAULTSIZE | LR_DEFAULTCOLOR);

关于winapi - 如何在从图标文件生成的 Windows 光标上设置热点坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2133078/

相关文章:

通用控件中断 WM_KEYDOWN 通知

c - 使用 golang 的 Windows Hook

objective-c - 使用 Cocoa NSFIleManager 忽略文件夹中的 .DS_Store 和 Icon 文件

html - 图标不会在导航菜单栏中格式化

c++ - 我能保证 Sleep() 不会休眠超过 10 毫秒吗?

c++ - 如何在QT Creator中检查ShellExecute命令返回(HINSTANCE)代码

Emacs - 奇怪的空白

opengl - 什么是硬件游标,它如何工作?

MySql 程序用于更新整个表的奖金计算

iphone - iOS 4 的透明应用程序图标?