2016-12-01 8 views
0

Я использую следующий код, чтобы получить курсор мыши растровое изображение:Как получить массив байтов RGB для курсора мыши в win32?

HCURSOR hCursor = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED | LR_DEFAULTSIZE); 

ICONINFO info = { 0 }; 
BOOL ret = GetIconInfo(hCursor, &info); 

Когда я сохранить info.hbmMask растровый файл, он выглядит следующим образом:

Mouse cursor bitmap

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

Или есть ли другой способ получить массив байтов RGB стандартного курсора Windows?

+2

Используйте 'GetDIBits' для извлечения битов из растрового изображения. –

ответ

1

Значок состоит из двух растровых изображений, работающих вместе, как описано в ICONINFO documentation:

hbmMask
Тип: HBITMAP

на значок битовой маски растрового изображения. Если эта структура определяет черно-белый значок, эта битмаска отформатирована так, что верхняя половина - это значок и битмаска, а нижняя половина - битовая маска значка XOR. При этом условии высота должна быть даже кратной двум. Если эта структура определяет значок цвета, эта маска определяет только битовую область И значка.

hbmColor
Тип: HBITMAP

Дескриптор значок цвета растрового изображения. Этот член может быть необязательным, если эта структура определяет черно-белый значок. Битовая маска AND hbmMask применяется с флагом SRCAND к месту назначения; впоследствии цветовая растровая карта применяется (с использованием XOR) к месту назначения с использованием флага SRCINVERT.

В вашем случае, у вас есть значок монохромного, так hbmColor является NULL и hbmMask содержит как маску и цвет. Верхняя половина: AND 'ed с целью очистить пиксели и создать пустое место для значка, а затем нижняя половина - XOR ed с целью заполнить пространство, созданное маской.

Для иконки, не монохромной, hbmMask бы AND «под ред как есть с мишенью, а затем hbmColor будет XOR ред как есть с мишенью.

Как пояснил Раймонд Чен в своем комментарии, вы можете «использовать GetDIBits() для извлечения битов из растрового изображения». Поэтому вам нужно извлечь биты пикселей из соответствующего HBITMAP и обработать их в зависимости от того, работаете ли вы с монохромным значком или нет.