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

时间:2010-01-25 14:54:51

标签: winapi cursor icons

我正在通过图标文件在我的应用上设置自定义光标,但点击点位于错误的坐标。我用

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

其中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。

编辑:澄清问题


msdn上的

ref:LoadImage()SetClassLongPtr()

3 个答案:

答案 0 :(得分:4)

您可以使用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);

答案 1 :(得分:1)

使用这个优秀的cursor editor创建游标,你可以设置热点,使其动画等等。我发现它非常漂亮和整洁。

希望这有帮助, 最好的祝福, 汤姆。

答案 2 :(得分:1)

是的,热点由.cur文件的内容决定。维基百科文章向您展示了这一点,偏移4和6. Windows没有用于在加载游标后更改热点的API。只需在Visual Studio或任何其他光标编辑器中编辑光标,指定热点并将文件另存为.cur文件。