Page 1 of 1

DevCon bits: WinCreatePointerIndirect troubles

Posted: Mon Mar 29, 2010 16:29
by Eugene Gorbunoff
From: Glassman
Date: 2010/03/29

WinCreatePointerIndirect, непонятки, значки

Область

WinCreatePointerIndirect.

Проблема

Единственная функция в OS/2, позволяющая создать полноцветный указатель или значок - это WinCreatePointerIndirect. Она принимает в качестве аргумента указатель на структуру POINTERINFO:

Code: Select all

typedef struct _POINTERINFO {
 ULONG       fPointer;        /*  Bit-map size indicator. */
 LONG        xHotSpot;        /*  X-coordinate of action point. */
 LONG        yHotSpot;        /*  Y-coordinate of action point. */
 HBITMAP     hbmPointer;      /*  Bit-map handle of pointer. */
 HBITMAP     hbmColor;        /*  Bit-map handle of color bit map. */
 HBITMAP     hbmMiniPointer;  /*  Bit-map handle of a pointer to a mini bit map. */
 HBITMAP     hbmMiniColor;    /*  Bit-map handle of mini color bit map. */
} POINTERINFO;


Также имеется функция WinQueryPointerInfo, которая заполняет структуру POINTERINFO информацией о существующем указателе или значке. Кажется очевидным, что следующая последовательность команд

Code: Select all

POINTERINFO pi;
WinQueryPointerInfo( hptr, &pi );
hnewptr = WinCreatePointerIndirect( HWND_DESKTOP, &pi );


должна создать полнофункциональную копию значка. На самом деле, это не так. Функция WinCreatePointerIndirect игнорирует поля hbmMiniPointer и hbmMiniColor. Поэтому при отрисовке мини значков - возникнет неприятный сюрприз. Скопировав поля hbmMini* в hbm* можно получить копию мини значка. Но не более того.

Возможное решение

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