Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Загрузка графических файлов из ресурсов  (Прочитано 12280 раз)
0 Пользователей и 1 Гость смотрят эту тему.
assch
Интересующийся

ru
Offline Offline

« : 18-01-2012 20:38 » 

Есть один из способов загрузки файлов изображений из ресурсов при помощи библиотеки GDI+
Загружаешь файл в ресурсы.
В файле "rsrc.rc" делаешь запись:

Код:
2001 GIF "a.gif"

Инициализация:

Код:
.data
gifType   db "GIF", 0

.data?
gifImage    dd ?
hbuffer     dd ?
pIStream    dd ?
rcRes       dd ?
hResData    dd ?
sizeOfRes   dd ?
hBitmap     dd ?
hHeap       dd ?
hIcon       dd ?
Static      dd ?
hIStream    dd ?

Код:

Код:
invoke FindResource, hInstance, 2001, addr gifType
mov rcRes, eax
invoke LoadResource, hInstance, rcRes
mov hResData, eax
invoke SizeofResource, hInstance, rcRes
mov sizeOfRes, eax
invoke  GetProcessHeap
mov hHeap,eax
invoke  HeapAlloc,hHeap,0,sizeOfRes
mov hbuffer, eax
invoke RtlMoveMemory, hbuffer, hResData, sizeOfRes
invoke CreateStreamOnHGlobal, hbuffer, FALSE, addr pIStream
invoke GdipCreateBitmapFromStream, pIStream,addr hBitmap
В итоге в переменную hBitmap загружается хендл.
Этот метод загрузки битмапа из потока работает нормально
со всеми популярными файлами (Jpg Gif Png Bmp).
Только если захотите обьединить эти функции в одну функцию
то переменные лучше сделать глобальные а то с локальными
иногда будет работать не корректно.
Вроде бы всё хорошо всё работает но несколько смущает слишком
большой набор функций для такой операции.
Интересно что в GDI+ есть ещё одна функция

GdipCreateBitmapFromResource

описание функции:
1 - Дескриптор экземпляра модуля.
2 - Указатель на завершающуюся нулем Unicode строку, которая определяет
    путь и имя ресурса растрового изображения должны быть загружены.
    Кроме того, этот параметр может состоять из идентификатора ресурса
    в младшем слове и ноль в старшем слове.
3 - Указатель на DWORD переменную, которая указатель на Bitmap объекта.

По идее вроде бы должно работать так:

Код:
invoke MultiByteToWideChar,0,0,addr gifType,-1,addr Unicod,addr Char
invoke GdipCreateBitmapFromResource,hInstance,addr Unicod,addr hBitmap

Но к сожелению не работает.
И вместо "addr gifType" ставил просто "2001" всё равно
функция не срабатывает и в переменной hBitmap чистый ноль.
Честно говоря не пойму почему.
Подозреваю только что всё таки со вторым параметром у меня ошибка.

В поиске нашёл один сайт где показаны как работают
некоторые функции GDI+
И в частности эта функция GdipCreateBitmapFromResource

http://www.jose.it-berater.org/smfforum/index.php?topic=1800.0

Там чисто показано что эта функция (всего одна) из ресурсов загружает битмам  без проблем.
Я подумал что именно эта функция не хочет работать с таким форматом как Gif
и попробывал загрузить в ресурсы формат Bmp но результат тот же в hBitmap чистый ноль.
Честно говоря не понятно. Ведь если почитать описание этих функций

invoke   GdipCreateBitmapFromStream, pIStream,addr hBitmap
и
invoke GdipCreateBitmapFromResource,hInstance,addr Unicod,addr hBitmap

У всех в переменную hBitmap загружается битмап картинки, только одна берёт данные из потока
а другая (могу конечно ошибатся) работает вроде бы напрямую с ресурсами.

Может кто знает в чём проблемма?
« Последнее редактирование: 18-01-2012 23:28 от assch » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 18-01-2012 21:49 » 

Смотри в MSDN функции работы с ресурсами. Нужно найти ресурс нужного типа и загрузить его: FindResource, LoadResource, LockResource.
« Последнее редактирование: 18-01-2012 21:50 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
assch
Интересующийся

ru
Offline Offline

« Ответ #2 : 18-01-2012 22:04 » 

Это обычный порядок загрузки ресурсов, я это прекрасно знаю.
Мой вопрос был как при помощи именно функции  GDI+  GdipCreateBitmapFromResource это сделать.
Я указал ссылку на страницу где загрузка файла из ресурса сделана именно при помощи одной функции
GdipCreateBitmapFromResource  без помощи набора стандартных функций FindResource, LoadResource, LockResource.
По этому я и хотел узнать почему у них там это получается а у меня нет.
Я не исключаю что я делаю где то ошибку.
По этому и вопрос где эта ошибка?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 19-01-2012 07:52 » new

Обрати внимание на прототип функции:

Код: (C++)
GpStatus WINGDIPAPI GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO* gdiBitmapInfo, VOID* gdiBitmapData, GpBitmap** bitmap)

Третий параметр - указатель на указатель.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines