2011-01-12 4 views
1

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

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

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

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

+1

Что параметр является именем файла? –

+0

Запишите данные файла .cur во временный файл на диске, затем используйте ['LoadCursorFromFile'] (http://msdn.microsoft.com/en-us/library/ms648392.aspx). –

+0

Где находятся данные курсора в памяти? Сеть? Если вы собираетесь скомпилировать его в продукт, я предполагаю, что вы просто поместили его в раздел ресурсов, чтобы работали обычные API. – metamatt

ответ

-2

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

2

Аргументов 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() из этой иконы заголовок файла; Я думаю, что указатель на данные изображения, вероятно, имеет растровое изображение для плоскости и непосредственно после растрового изображения для плоскости xor.

+0

Я считаю, что в своем вопросе я упомянул CreateCursor. Я знаю, что могу исследовать и писать своего читателя. Вы можете ВСЕГДА писать свои собственные. Я ищу решение для API. –

+2

В своем вопросе вы упомянули CreateCursor. Там нет API-решения. До вас ли вы считаете что-то среднее между полезными. – metamatt

3

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

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

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

+0

Это профессиональный продукт, такое решение совсем не приемлемо. –

+0

@Noah Roberts: Что это за «профессиональный продукт, который имеет отношение к чему-либо?» Это абсолютно правдоподобное решение, чтобы делать то, что вы просите. Фактически, оно используется в профессиональном продукте. вы считаете, что это непрофессионально и «неприемлемо»? Если вы собираетесь использовать абсолютно правильные ответы, потому что они не соответствуют вашим произвольно высоким стандартам, вам необходимо включить * подробное описание этих вопросов. –

+0

Какой продукт? Было бы неплохо узнать, для чего следует избегать программного обеспечения. –

Смежные вопросы