Использование рисунко в программе

Discussion in 'WASM.BEGINNERS' started by Sturgeon, Oct 28, 2006.

  1. Sturgeon

    Sturgeon New Member

    Blog Posts:
    0
    Joined:
    Oct 17, 2006
    Messages:
    111
    Здравствуйте!
    Чуть-чуть продвинулся в изучении асма, и снова грабли.

    Проблема в следующем. Пытаюсь вставить картинку в программу. При трансляции вылезает ошибка:

    Writing GROUP_ICON:500, lang:0x409, size 34.Sturgeon.rc (3): error RC2170 : bitmap file sturgeon.gif is not in 3.00 format

    Пользую MASM32 9.0, в качестве IDE RadAsm.

    Код для создания картинки выглядит следующим образом:

    Code (Text):
    1.       invoke CreateWindowEx, SS_BITMAP,
    2.                  ADDR szBitmap, NULL,
    3.                  WS_CHILD or WS_VISIBLE or WS_BORDER or ES_READONLY or ES_AUTOHSCROLL,
    4.                          BitmapL, BitmapT, BitmapW, BitmapH,
    5.                  hWnd, NULL, hInst, NULL
    6.       mov    Bitmap, eax
    Порылся в MSDN, нашел что вместо SS_BITMAP можно вроде использовать SS_METAPICT. Попробовал, результат точно такой же. Причем картинки пробовал разного формата .gif, .bmp, .jpg.
    Что это за формат такой? 3.00 format? Или lpClassName должно быть другим?

    И вообще, можно ли так отображать картинки? У Iczelion'а в туторах немного по-другому. Или совсем по-другому8)
     
  2. Quantum

    Quantum Паладин дзена

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    Вот именно
     
  3. Sturgeon

    Sturgeon New Member

    Blog Posts:
    0
    Joined:
    Oct 17, 2006
    Messages:
    111
    Сделал как у Iczelion'а. Все получилось.
    Но все равно вопрос остался. Разве с помощью CreateWindowEx нельзя выводить картинки? В документации вроде как указывается, что можно?
    И опять же... gifки не рисуются. Транслятор снова ссылается на то, что bitmap file sturgeon.gif is not in 3.00 format
     
  4. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Joined:
    Nov 23, 2004
    Messages:
    2,347
    CreateWindow создает окна, а не выводит картинки. SS_BITMAP - это не класс окна, а его стиль (классом должен быть "static"). И в ресурсы можно вставить (как изображения, с которыми могут работать API) только ICO и BMP (вроде, без сжатия).

    GIF, JPG и т.п. - это не bitmap'ы
     
  5. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Joined:
    Nov 23, 2004
    Messages:
    2,347
    :) не доглядел. Но все равно, это обычный стиль, а не расширенный.
     
  6. Sturgeon

    Sturgeon New Member

    Blog Posts:
    0
    Joined:
    Oct 17, 2006
    Messages:
    111
    rmn
    Спасибо. Вроде немного прояснилась ситуация. Но получается, что какую-нибудь анимашку вставить не получиться :dntknw:?
     
  7. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Joined:
    Nov 23, 2004
    Messages:
    2,347
    AVI можно вставить :) (контрол Animate)
     
  8. Sturgeon

    Sturgeon New Member

    Blog Posts:
    0
    Joined:
    Oct 17, 2006
    Messages:
    111
    Хорошо. А как все-таки с помощью CreateWindowEx вывести картинку bmp? Я понимаю, что все кнопки, меню, диалоки и картинки это все окна с разными свойствами. Тогда спрошу так. Как с помощью CreateWindowEx создать окно класса STATIC, в которое будет картинкой? Так правильно?

    Я пишу следующее:

    Code (Text):
    1. szBitmap db "sturgeon.bmp", 0
    2.  
    3. .............
    4. .............
    5. .............
    6. .............
    7.     invoke CreateWindowEx, WS_EX_LEFT,
    8.          ADDR szStaticClass, ADDR szBitmap,
    9.         SS_BITMAP or WS_VISIBLE or WS_CHILD or SS_LEFT,
    10.                   BitmapL, BitmapT, BitmapW, BitmapH,
    11.             hWnd, NULL, hInst, NULL
    код нормально транслируется, но картинка не появляется. Я, наверное, неправильно передаю в функцию имя файла, который нужно отобразить?

    P.S. Извините за глупые вопросы и надоедливость:dntknw: Я изучаю асм самостоятельно, в основном по книжкам. А спросить мне больше не у кого. Так что спасибо всем, кто не жалеет своего времени, объясняя мне может быть элементарные вещи.
     
  9. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
     
  10. Quantum

    Quantum Паладин дзена

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    Sturgeon
    Нужно не имя файла передавать, а... В общем, есть 2 варианта:
    1. В диалоговых окнах, можно передать статику ID ресурса, в котором картинка (нормальный BMP, а не гиф и т.д.) и всё. Этот метод работает на всех Win32.

    2. Загрузить картинку самому, сконвертировать в HBITMAP и передать в статик через сообщение STM_SETIMAGE. Формат картинки тут уже не важен, т.к. обрабатывать его будет не статик, а Вы (или либа какая-нибудь).
     
  11. Sturgeon

    Sturgeon New Member

    Blog Posts:
    0
    Joined:
    Oct 17, 2006
    Messages:
    111
    Quantum
    Второй метод, это как у Iczelion'а? А можно подробнее? А как сконвертировать файл в HBITMAP? Просто включением в ресурсы: Sturgeon BITMAP "Sturgeon.bmp"?
     
  12. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    Это 1ый способ.
     
  13. Quantum

    Quantum Паладин дзена

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    Sturgeon
    Если картинка в ресурсах хранится, то можно использовать LoadBitmap или лучше LoadImage. Если картинка в файле, то LoadImage. Если нужно загрузить GIF/JPEG/PNG из ресурсов/файла/памяти, можно воспользоваться либой imagelib by Ernest Murphy, которая просто грузит эти картинки через OLE интерфейс IPicture, который есть в современных виндах. Для других форматов тоже есть соответствующие библиотеки.
     
  14. Sturgeon

    Sturgeon New Member

    Blog Posts:
    0
    Joined:
    Oct 17, 2006
    Messages:
    111
    В пятый раз прошерстил форум и сайт, кое что проясняется

    Вот про эту библиотеку речь? m32.lib: BitmapFromFile

    В принципе понятно написано, но это для диалогового окна. А есть что-нибудь такое же (в смысле с примерами и исходниками для простого окна)?
     
  15. Quantum

    Quantum Паладин дзена

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    Sturgeon
    Да

    Аналогично работает с обычными окнами. После создания статика для отображения картинки, вызываем BitmapFrom*, хендл HBITMAP (то, что вернула эта функция) пересылаем статику через SendMessage.
     
  16. Sturgeon

    Sturgeon New Member

    Blog Posts:
    0
    Joined:
    Oct 17, 2006
    Messages:
    111
    Вроде немножко разрулил. Спасибо!
    Если что, я опять буду спрашивать:) Вы уж не серчайте.
     
  17. Sturgeon

    Sturgeon New Member

    Blog Posts:
    0
    Joined:
    Oct 17, 2006
    Messages:
    111
    Нет, блин:dntknw: Ничего не получается.

    Картинка в ресурсы включается, но не показывается:dntknw:

    Посмотрите, пожалуйста, в чем дело.
     
  18. q_q

    q_q New Member

    Blog Posts:
    0
    Joined:
    Oct 5, 2003
    Messages:
    1,706
    Sturgeon
    Оконная процедура написана так, что WM_PAINT не обрабатывается, надо так
    Code (Text):
    1.   .if uMsg == WM_CREATE
    2.     invoke BitmapFromResource, hInstance, 2000
    3.     mov hBmp, eax
    4.   .endif
    5.  
    6.   .if uMsg == WM_COMMAND
    7.     mov eax, lParam
    8.        
    9.     .if eax == Button1
    10.       call KeyGen
    11.     .elseif eax == Button2
    12.       invoke PostQuitMessage,NULL
    13.       return 0
    14.  
    15.     .elseif wParam == IDM_ABOUT
    16.       invoke  MessageBox, hWnd, ADDR szAboutText, ADDR szAboutCapt, 0
    17.     .elseif eax == Edit1
    18.     .endif
    19.  
    20.   .elseif uMsg == WM_SYSCOLORCHANGE
    21.  
    22.   .elseif uMsg == WM_SIZE
    23.    
    24.   .elseif uMsg == WM_PAINT
    25.     invoke Paint_Proc,hWin
    26.   .elseif uMsg == WM_DESTROY
    27.     invoke PostQuitMessage,NULL
    28.     return 0
    29.   .endif
    30.  
    31.   invoke DefWindowProc,hWin,uMsg,wParam,lParam
    + в Paint_Proc
    Code (Text):
    1. ;; invoke SelectObject,hDC,hOld
    2. ;; исправить на
    3.  invoke SelectObject,memDC,hOld
     
  19. Sturgeon

    Sturgeon New Member

    Blog Posts:
    0
    Joined:
    Oct 17, 2006
    Messages:
    111
    Отлично!! Все работает :lol:!!
    Вроде соображаю потихоньку. Моя оконная процедура была, мягко говоря, бредовым набором команд. А после того как ее упорядочили все заработало. Так?

    А почему
    ;; invoke SelectObject,hDC,hOld
    ;; исправить на
    invoke SelectObject,memDC,hOld??
    В туторах к масму именно так и написано как у меня. По нему и делал. И в туторе все работает.
     
  20. q_q

    q_q New Member

    Blog Posts:
    0
    Joined:
    Oct 5, 2003
    Messages:
    1,706
    Sturgeon
    А после того как ее упорядочили все заработало. Так?
    Нельзя сказать что упорядочено _все_, для отображения рисунка достаточно.

    В данном случае функции работают парами создать/удалить выбрать/восстановить
    Code (Text):
    1. ...
    2.   invoke CreateCompatibleDC,hDC    ;; создать DC
    3.   mov memDC, eax
    4.    
    5.   invoke SelectObject,memDC,hBmp   ;; выбрать в нем BITMAP
    6.   mov hOld, eax                    ;;  сохранив предыдущий
    7.  
    8. ...                                ;; поработать с DC
    9.  
    10.   invoke SelectObject,memDC,hOld   ;; восстановить сохраненный BITMAP
    11.   invoke DeleteDC,memDC            ;; удалить DC
    12. ...
    в туторе все работает
    В туториале опечатка, а работает, потому что, наверное, не критично.