Как вытащить BMP из ресурсов

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Как вытащить BMP из ресурсов

Сообщение 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)
может кто сталкивался?
legionary
Прохожий
Сообщения: 2
Зарегистрирован: 05 Октябрь 2009, 16:35

Re: Как вытащить BMP из ресурсов

Сообщение legionary »

попробуйте так
hBitmapBak = LoadImage(SYSTEM{PROP:AppInstance},ADDRESS(szBitmap), IMAGE_BITMAP, 0, 0, LR_SHARED)
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение 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')

на всякий случай проверил, не помогло :(
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение Дед Пахом »

GetLastError() что возвращает?
С уважением, ДП
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение ru_alex »

GetLastError() возвращает 1813
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение 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), хотя это только догадки...
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение Дед Пахом »

ERROR_RESOURCE_TYPE_NOT_FOUND, значит тип чего-то там не тот...
С уважением, ДП
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение 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
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение ru_alex »

Вобщем сам допустил ошибку, просто описался а определении прототипа функции SizeofResource, а точнее атрибута Name. Таким образом сейчас могу, считать из памяти кусок данных, сохранить их файл на диск. Получяется тот же самый bmp файл, что и добавил в ресурсы. Теперь его можно с помошью LoadImage загрузить и потом отобразить. Но естественно хотелось бы избежать сохранения на диск. То есть он уже есть в памяти. Теперь встал вопрос как его нарисовать.
Может есть у кого мысли?
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение StillZero »

Все сайты закрыты...
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

Re: Как вытащить BMP из ресурсов

Сообщение gromov »

А что тебе мешает использовать ImagEx ?
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение ru_alex »

Срочно переключился на другие дела, пока руки не доходят доделать.
gromov писал(а):А что тебе мешает использовать ImagEx ?
Библиотека прикольная, использую ее в другом месте проекта, но тут мне она не подойдет, потому как дело там не только в рисовании. Хотя может и подойдет. но переписывать чсе на нее я точно не буду сейчас.
Видимо то что нужно, как руки дойдут, обязательно отпишучь что и как. Спасибо!
gromov
Старожил
Сообщения: 263
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа
Поблагодарили: 3 раза

Re: Как вытащить BMP из ресурсов

Сообщение gromov »

Если я правильно понял, тебе надо из памяти нарисовать картинку. Это легко делается в ImagEx. Тебе от них будет нужен Viewer. У меня в базе хранятся изображения, я их достаю (работаю с MAV) и вывожу на экран. Через сохранение работает дольше, понятное дело ...
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение ru_alex »

gromov писал(а):Если я правильно понял, тебе надо из памяти нарисовать картинку. Это легко делается в ImagEx. Тебе от них будет нужен Viewer. У меня в базе хранятся изображения, я их достаю (работаю с MAV) и вывожу на экран. Через сохранение работает дольше, понятное дело ...
Есть шаблон - PowerToolbar, основан на классе POTolbarClass и еще нескольких вспомогательных. В нем чистое рисование через GDI, и подключены функции обраного вызова для взаимодействия с пользователем. Я его использую, к тому же перелопатил уже достаточно серьезно, добавлял свои кнопки, стили и еще кое какие примочки. Сейчас понадобилось "подложить" под кнопки картинку, и вот столкнулся с проблемой. Не спорю, что рисование намного более удобно с помощью ImageEx, более того я его использую и знаком с функционалом их классов. Но она не предназначена для взаимодествия с пользователем, хотя там есть что-то типа OnMouseDown и другие, но боюсь, что этого не достаточно. К тому же, если бы он даже идеально подходил под эту задачу, я не стану переписывать килобайты кода просто ради перехода на другую, тем более закрытую библиотеку.
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Re: Как вытащить BMP из ресурсов

Сообщение ru_alex »

StillZero писал(а):http://www.clarionlife.net/content/view/77/29/

Видимо то что нужно, как руки дойдут, обязательно отпишучь что и как. Спасибо!
На самом деле не сильно помогло, меня смутило наличие изображения в примере :)
А так там впринципе тоже самое, что у меня уже работает. Проблема то в том, что из ресурсов в память я получаю как бы не картинку (я то знаю, что это картинка, но программа нет), а некий абстрактный ресурс. И его нельзя нарисовать напрямую, используя BitBlt и ей подобные. Мне нужно этот ресурс как-то преобразовать, получить хендл на изображение. Причем мне не нужна поддержка множества форматов, хватит и bmp. На данный я могу нарисовать эту же картинку с диска с помощью loadImage, так же могу считать ее в память из ресурсов с помощью loadResorce, но как нарисовать во втором случае не знаю.
Ответить