Как установить координаты горячей точки для курсора Windows, сгенерированного из файла значков? - PullRequest
2 голосов
/ 25 января 2010

Я устанавливаю пользовательский курсор на свое приложение из файла значков, но точка щелчка находится на неправильных координатах. Я устанавливаю курсор с помощью

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

Курсор загружается нормально, но его щелчки исходят из нижнего левого угла изображения курсора, а не из верхнего левого угла.

В статье Википедии о файлах .ico говорится, что горячие точки указываются только для файлов .cur, но не для .ico.

Редактировать: Уточненный вопрос


ref: LoadImage () и SetClassLongPtr () в msdn.

Ответы [ 3 ]

4 голосов
/ 26 января 2010

Вы можете сделать это с помощью 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 голос
/ 25 января 2010

Да, точка доступа определяется содержимым файла .cur. Статья в Википедии показывает это, смещения 4 и 6. В Windows нет API для изменения точки доступа после загрузки курсора. Просто отредактируйте курсор в Visual Studio или любом другом редакторе курсоров, укажите «горячую точку» и сохраните файл как файл .cur.

1 голос
/ 25 января 2010

Используйте этот превосходный редактор курсоров для создания курсоров, и вы можете установить точку доступа, сделать ее анимированной и т. Д. Я нашел ее довольно изящной и аккуратной.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...