Страница 1 из 2
Как вытащить BMP из ресурсов
Добавлено: 21 Январь 2013, 14:07
ru_alex
Всем привет!
Задача следующая, с помощью Winapi получить хендл изображения и отобразить на экране.
У меня есть работающий код для иконок:
Код: Выделить всё
szIcon = 'myIcon_ico'
hIcon = LoadImage(hInst, szIcon, IMAGE_ICON, w, h, LR_SHARED)
если по аналогии делать для изображения, то хендл не возвращает:
Код: Выделить всё
szBitmap = 'MyImage_bmp'
hBitmapBak = LoadImage(hInst, szBitmap, IMAGE_BITMAP, 0, 0, LR_SHARED)
если читать с диска, все ОК:
Код: Выделить всё
szBitmap = 'c:\myImage.bmp'
hBitmapBak = LoadImage(0,szBitmap,IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
может кто сталкивался?
Re: Как вытащить BMP из ресурсов
Добавлено: 21 Январь 2013, 17:26
legionary
попробуйте так
hBitmapBak = LoadImage(SYSTEM{PROP:AppInstance},ADDRESS(szBitmap), IMAGE_BITMAP, 0, 0, LR_SHARED)
Re: Как вытащить BMP из ресурсов
Добавлено: 21 Январь 2013, 17:47
ru_alex
legionary писал(а):попробуйте так
hBitmapBak = LoadImage(SYSTEM{PROP:AppInstance},ADDRESS(szBitmap), IMAGE_BITMAP, 0, 0, LR_SHARED)
это зависит от прототипа, у меня было так:
LoadImage(UNSIGNED hInst, *CSTRING szIcon, UNSIGNED uType, SIGNED cxDesired, SIGNED cyDesired, UNSIGNED fuLoad),UNSIGNED,PASCAL,RAW,NAME('LoadImageA')
если работать через address, то надо объявлять так:
LoadImage(UNSIGNED hInst, LONG szIcon, UNSIGNED uType, SIGNED cxDesired, SIGNED cyDesired, UNSIGNED fuLoad),UNSIGNED,PASCAL,RAW,NAME('LoadImageA')
на всякий случай проверил, не помогло
Re: Как вытащить BMP из ресурсов
Добавлено: 21 Январь 2013, 19:22
Дед Пахом
GetLastError() что возвращает?
Re: Как вытащить BMP из ресурсов
Добавлено: 21 Январь 2013, 19:57
ru_alex
GetLastError() возвращает 1813
Re: Как вытащить BMP из ресурсов
Добавлено: 21 Январь 2013, 20:06
ru_alex
Еще поэксперементировал с функциями EnumResourceNames и EnumResourceTypes, правда не сразу разобрался как они работают, но все же, если
вот выполнить что-то типа:
Код: Выделить всё
lpTypeStr = 'IMAGE'
res# = EnumResourceNames(hInst,address(lpTypeStr),address(MyEnumNamesFunc),0);
где MyEnumNamesFunc это:
Код: Выделить всё
MyEnumNamesFunc PROCEDURE(UNSIGNED hModule, LONG lpType, LONG lpName, LONG lParam)
TypeStrTmp byte
TypeStr STRING(100)
CODE
if band(lpName, 0FFFF0000H)
clear(TypeStr)
loop i#=1 to 100
peek(lpName+i#-1, TypeStrTmp)
if TypeStrTmp = 0 then break.
TypeStr[i#] = chr(TypeStrTmp)
end
PUTINI('resurce', lpName, TypeStr, '.\Autolog.ini')
else
PUTINI('resurce', lpName, lpType, '.\Autolog.ini')
end
return(1)
в ini фале получаю, что ресурс с типом image и именем M4BAKGROUND_BMP есть, соответсвенно есть мысль, что все из-за того, что изображение там хранится не в стандартном типе с номером 2 (RT_BITMAP), хотя это только догадки...
Re: Как вытащить BMP из ресурсов
Добавлено: 21 Январь 2013, 21:20
Дед Пахом
ERROR_RESOURCE_TYPE_NOT_FOUND, значит тип чего-то там не тот...
Re: Как вытащить BMP из ресурсов
Добавлено: 24 Январь 2013, 16:42
ru_alex
Вообщем да, возможно и есть битмапы, которые в ресурсы попадают с типом RT_BITMAP, и их можно получить через LoadImage или LoadBitmap, хз. Я несколько разных попробовал, больших и маленьких, все ложатся с типом IMAGE. Теоретически с любыми ресурсами вроде как можно работать с помощью функций FindResource и LoadResource. Размер ресурса определяется с помощью SizeofResource, адрес первого байта - LockResource. Но получаю ту же ошибку 1813 на функции SizeofResource
Код: Выделить всё
szBitmapType = 'IMAGE'
szBitmap = 'MYIMAGE_BMP'
hResourceInfo = FindResource(hInst, address(szBitmap), address(szBitmapType))
if hResourceInfo = 0
PUTINI('main', 'FindResource', 'Error '&GetLastError(), '.\Autolog.ini')
else
PUTINI('main', 'FindResource', hResourceInfo, '.\Autolog.ini')
sizeResource = SizeofResource(hInst, hResourceInfo)
if sizeResource = 0
PUTINI('main', 'SizeofResource', 'Error '&GetLastError(), '.\Autolog.ini')
else
PUTINI('main', 'SizeofResource', sizeResource, '.\Autolog.ini')
hResource = LoadResource(hInst, hResourceInfo)
if hResource = 0
PUTINI('main', 'LoadResource', 'Error '&GetLastError(), '.\Autolog.ini')
else
PUTINI('main', 'LoadResource', hResource, '.\Autolog.ini')
addrResource = LockResource(hResource)
if addrResource = 0
PUTINI('main', 'LockResource', 'Error '&GetLastError(), '.\Autolog.ini')
else
PUTINI('main', 'LockResource', addrResource, '.\Autolog.ini')
end
end
end
end
Re: Как вытащить BMP из ресурсов
Добавлено: 25 Январь 2013, 15:06
ru_alex
Вобщем сам допустил ошибку, просто описался а определении прототипа функции SizeofResource, а точнее атрибута Name. Таким образом сейчас могу, считать из памяти кусок данных, сохранить их файл на диск. Получяется тот же самый bmp файл, что и добавил в ресурсы. Теперь его можно с помошью LoadImage загрузить и потом отобразить. Но естественно хотелось бы избежать сохранения на диск. То есть он уже есть в памяти. Теперь встал вопрос как его нарисовать.
Может есть у кого мысли?
Re: Как вытащить BMP из ресурсов
Добавлено: 26 Январь 2013, 7:54
StillZero
Re: Как вытащить BMP из ресурсов
Добавлено: 26 Январь 2013, 9:56
gromov
А что тебе мешает использовать ImagEx ?
Re: Как вытащить BMP из ресурсов
Добавлено: 05 Февраль 2013, 15:04
ru_alex
Срочно переключился на другие дела, пока руки не доходят доделать.
gromov писал(а):А что тебе мешает использовать ImagEx ?
Библиотека прикольная, использую ее в другом месте проекта, но тут мне она не подойдет, потому как дело там не только в рисовании. Хотя может и подойдет. но переписывать чсе на нее я точно не буду сейчас.
Видимо то что нужно, как руки дойдут, обязательно отпишучь что и как. Спасибо!
Re: Как вытащить BMP из ресурсов
Добавлено: 05 Февраль 2013, 20:22
gromov
Если я правильно понял, тебе надо из памяти нарисовать картинку. Это легко делается в ImagEx. Тебе от них будет нужен Viewer. У меня в базе хранятся изображения, я их достаю (работаю с MAV) и вывожу на экран. Через сохранение работает дольше, понятное дело ...
Re: Как вытащить BMP из ресурсов
Добавлено: 07 Февраль 2013, 18:51
ru_alex
gromov писал(а):Если я правильно понял, тебе надо из памяти нарисовать картинку. Это легко делается в ImagEx. Тебе от них будет нужен Viewer. У меня в базе хранятся изображения, я их достаю (работаю с MAV) и вывожу на экран. Через сохранение работает дольше, понятное дело ...
Есть шаблон - PowerToolbar, основан на классе POTolbarClass и еще нескольких вспомогательных. В нем чистое рисование через GDI, и подключены функции обраного вызова для взаимодействия с пользователем. Я его использую, к тому же перелопатил уже достаточно серьезно, добавлял свои кнопки, стили и еще кое какие примочки. Сейчас понадобилось "подложить" под кнопки картинку, и вот столкнулся с проблемой. Не спорю, что рисование намного более удобно с помощью ImageEx, более того я его использую и знаком с функционалом их классов. Но она не предназначена для взаимодествия с пользователем, хотя там есть что-то типа OnMouseDown и другие, но боюсь, что этого не достаточно. К тому же, если бы он даже идеально подходил под эту задачу, я не стану переписывать килобайты кода просто ради перехода на другую, тем более закрытую библиотеку.
Re: Как вытащить BMP из ресурсов
Добавлено: 14 Февраль 2013, 10:00
ru_alex
На самом деле не сильно помогло, меня смутило наличие изображения в примере
А так там впринципе тоже самое, что у меня уже работает. Проблема то в том, что из ресурсов в память я получаю как бы не картинку (я то знаю, что это картинка, но программа нет), а некий абстрактный ресурс. И его нельзя нарисовать напрямую, используя BitBlt и ей подобные. Мне нужно этот ресурс как-то преобразовать, получить хендл на изображение. Причем мне не нужна поддержка множества форматов, хватит и bmp. На данный я могу нарисовать эту же картинку с диска с помощью loadImage, так же могу считать ее в память из ресурсов с помощью loadResorce, но как нарисовать во втором случае не знаю.