代码之家  ›  专栏  ›  技术社区  ›  RJFalconer

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

  •  2
  • RJFalconer  · 技术社区  · 15 年前

    我正在用图标文件在我的应用程序上设置一个自定义光标,但是点击点的坐标不正确。我将光标设置为

    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上。

    3 回复  |  直到 15 年前
        1
  •  4
  •   John Knoeller    15 年前

    你可以用 CreateIconFromResourceEx

    您将一个指针作为第一个参数传递给一个光标。这是文档中隐藏的结构之一,但我找不到任何头文件。不过,这很简单,基本上是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);
    
        2
  •  1
  •   t0mm13b    15 年前

    用这个很好 cursor editor 对于创建光标,您可以设置热点,使其动画等。我发现它相当漂亮和整洁。

    希望这有帮助, 最好的问候, 汤姆。

        3
  •  1
  •   Hans Passant    15 年前

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