Создать курсор из байтов формата .cur? - PullRequest
1 голос
/ 12 января 2011

Я могу найти пару способов создать курсор в win32, но мне нужен третий, тот, который я не могу найти.

Первое, что я могу найти, - это использовать LoadXXX (), чтобы открыть файл или ресурс и таким образом загрузить курсор.

Второе, что я могу найти, - это использовать CreateCursor, чтобы взять горячие точки, некоторые массивы данных и сделать один из битов.

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

Ответы [ 4 ]

3 голосов
/ 12 января 2011

Поскольку я более кратко написал в комментарии, я думаю, что самый простой и разумный способ - просто записать двоичные данные, хранящиеся в массиве, во временный файл .CUR на диске, а затем использовать * 1002. * функция для чтения этого файла .CUR. Затем вы можете удалить временный файл. Нет смысла охотиться за сложными решениями, когда подойдут более простые.

При этом, если вам действительно нужен способ сделать это, вы можете подумать о том, чтобы сделать что-то похожее на то, что сделала команда .NET Framework для загрузки объекта курсора из потока памяти. Это использует преимущество между курсорами и значками .

Используйте функцию OleCreatePictureIndirect для создания нового неинициализированного объекта IPicture, который затем инициализируется из массива байтов в памяти с помощью IPersistStream::Load метод . Как только вы это сделаете, просто используйте функцию CopyImage , чтобы создать курсор из загруженного изображения.

2 голосов
/ 12 января 2011

Аргументы для CreateCursor () находятся здесь: http://msdn.microsoft.com/en-us/library/ms648385(VS.85).aspx

HCURSOR WINAPI CreateCursor(
  __in_opt  HINSTANCE hInst,
  __in      int xHotSpot,
  __in      int yHotSpot,
  __in      int nWidth,
  __in      int nHeight,
  __in      const VOID *pvANDPlane,
  __in      const VOID *pvXORPlane
);

Формат файла .cur задокументирован в Википедии здесь: http://en.wikipedia.org/wiki/ICO_(file_format)#Legacy_format

Вы можете получить все аргументы дляCreateCursor () из этого заголовка файла значка;Я думаю, что указатель на данные изображения, вероятно, имеет точечный рисунок для плоскости and, за которым непосредственно следует точечный рисунок для плоскости xor.

1 голос
/ 28 мая 2019

В поисках ответа на этот вопрос я наткнулся на CreateIconIndirect, который «создает значок или курсор из структуры ICONINFO», который задает дескриптор растрового изображения (HBITMAP) для изображения курсора (поэтому вы можете использовать подпрограммы растрового изображения Win32 API подготовить курсор):

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-createiconindirect

HICON CreateIconIndirect(
    PICONINFO piconinfo
);

Хотя его тип возвращаемого значения - HICON, в документации говорится, что он возвращает значок или курсор.

Структура ICONINFO имеет логический член fIcon для определения, является ли он значком (TRUE) или курсором (FALSE):

typedef struct _ICONINFO {
    BOOL    fIcon;
    DWORD   xHotspot;
    DWORD   yHotspot;
    HBITMAP hbmMask;
    HBITMAP hbmColor;
} ICONINFO;

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

0 голосов
/ 13 января 2011

Не может быть сделано.Лучше не тратить время на попытки.Я только пытался избежать необходимости конвертировать кучу файлов .cur в то, что поддерживаются разумными библиотеками.Думал, что я использовал бы конструктор HCURSOR для QCursor, и я мог бы, но это не стоит того, чтобы пытаться обойти худший API, когда я могу просто использовать файлы PNG или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...