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.
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With