R – How to set hotspot co-ordinates on a Windows cursor generated from an icon file

cursoriconswinapi

I'm setting a custom cursor on my app from an icon file, but the click point is at the wrong co-ordinates. I'm setting the cursor with

SetClassLongPtr(hwnd, GCL_HCURSOR, reinterpret_cast<LONG_PTR>cursor)

where cursor is the result of;

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
); 

The cursor loads fine, but its clicks come from the bottom-left corner of the cursor image, rather than top left.

The wikipedia article on .ico files says the hotspots are only specified on .cur files, not .ico.

Edit: Clarified question


ref: LoadImage() and SetClassLongPtr() on msdn.

Best Answer

You can do this with CreateIconFromResourceEx

You pass in a pointer to a CURSOR_RES_HDR as the first parameter. This is one of those structures that you can find buried in the documentation, but it isn't any header file I can find. It's pretty simple though, basically to 16 bit unsigned ints followed by a BITMAPINFOHEADER containing the cursor image data.

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);
Related Topic