Здравствуйте! Чуть-чуть продвинулся в изучении асма, и снова грабли. Проблема в следующем. Пытаюсь вставить картинку в программу. При трансляции вылезает ошибка: 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): invoke CreateWindowEx, SS_BITMAP, ADDR szBitmap, NULL, WS_CHILD or WS_VISIBLE or WS_BORDER or ES_READONLY or ES_AUTOHSCROLL, BitmapL, BitmapT, BitmapW, BitmapH, hWnd, NULL, hInst, NULL mov Bitmap, eax Порылся в MSDN, нашел что вместо SS_BITMAP можно вроде использовать SS_METAPICT. Попробовал, результат точно такой же. Причем картинки пробовал разного формата .gif, .bmp, .jpg. Что это за формат такой? 3.00 format? Или lpClassName должно быть другим? И вообще, можно ли так отображать картинки? У Iczelion'а в туторах немного по-другому. Или совсем по-другому8)
Сделал как у Iczelion'а. Все получилось. Но все равно вопрос остался. Разве с помощью CreateWindowEx нельзя выводить картинки? В документации вроде как указывается, что можно? И опять же... gifки не рисуются. Транслятор снова ссылается на то, что bitmap file sturgeon.gif is not in 3.00 format
CreateWindow создает окна, а не выводит картинки. SS_BITMAP - это не класс окна, а его стиль (классом должен быть "static"). И в ресурсы можно вставить (как изображения, с которыми могут работать API) только ICO и BMP (вроде, без сжатия). GIF, JPG и т.п. - это не bitmap'ы
rmn Спасибо. Вроде немного прояснилась ситуация. Но получается, что какую-нибудь анимашку вставить не получиться ?
Хорошо. А как все-таки с помощью CreateWindowEx вывести картинку bmp? Я понимаю, что все кнопки, меню, диалоки и картинки это все окна с разными свойствами. Тогда спрошу так. Как с помощью CreateWindowEx создать окно класса STATIC, в которое будет картинкой? Так правильно? Я пишу следующее: Code (Text): szBitmap db "sturgeon.bmp", 0 ............. ............. ............. ............. invoke CreateWindowEx, WS_EX_LEFT, ADDR szStaticClass, ADDR szBitmap, SS_BITMAP or WS_VISIBLE or WS_CHILD or SS_LEFT, BitmapL, BitmapT, BitmapW, BitmapH, hWnd, NULL, hInst, NULL код нормально транслируется, но картинка не появляется. Я, наверное, неправильно передаю в функцию имя файла, который нужно отобразить? P.S. Извините за глупые вопросы и надоедливость Я изучаю асм самостоятельно, в основном по книжкам. А спросить мне больше не у кого. Так что спасибо всем, кто не жалеет своего времени, объясняя мне может быть элементарные вещи.
Sturgeon Нужно не имя файла передавать, а... В общем, есть 2 варианта: 1. В диалоговых окнах, можно передать статику ID ресурса, в котором картинка (нормальный BMP, а не гиф и т.д.) и всё. Этот метод работает на всех Win32. 2. Загрузить картинку самому, сконвертировать в HBITMAP и передать в статик через сообщение STM_SETIMAGE. Формат картинки тут уже не важен, т.к. обрабатывать его будет не статик, а Вы (или либа какая-нибудь).
Quantum Второй метод, это как у Iczelion'а? А можно подробнее? А как сконвертировать файл в HBITMAP? Просто включением в ресурсы: Sturgeon BITMAP "Sturgeon.bmp"?
Sturgeon Если картинка в ресурсах хранится, то можно использовать LoadBitmap или лучше LoadImage. Если картинка в файле, то LoadImage. Если нужно загрузить GIF/JPEG/PNG из ресурсов/файла/памяти, можно воспользоваться либой imagelib by Ernest Murphy, которая просто грузит эти картинки через OLE интерфейс IPicture, который есть в современных виндах. Для других форматов тоже есть соответствующие библиотеки.
В пятый раз прошерстил форум и сайт, кое что проясняется Вот про эту библиотеку речь? m32.lib: BitmapFromFile В принципе понятно написано, но это для диалогового окна. А есть что-нибудь такое же (в смысле с примерами и исходниками для простого окна)?
Sturgeon Да Аналогично работает с обычными окнами. После создания статика для отображения картинки, вызываем BitmapFrom*, хендл HBITMAP (то, что вернула эта функция) пересылаем статику через SendMessage.
Нет, блин Ничего не получается. Картинка в ресурсы включается, но не показывается Посмотрите, пожалуйста, в чем дело.
Sturgeon Оконная процедура написана так, что WM_PAINT не обрабатывается, надо так Code (Text): .if uMsg == WM_CREATE invoke BitmapFromResource, hInstance, 2000 mov hBmp, eax .endif .if uMsg == WM_COMMAND mov eax, lParam .if eax == Button1 call KeyGen .elseif eax == Button2 invoke PostQuitMessage,NULL return 0 .elseif wParam == IDM_ABOUT invoke MessageBox, hWnd, ADDR szAboutText, ADDR szAboutCapt, 0 .elseif eax == Edit1 .endif .elseif uMsg == WM_SYSCOLORCHANGE .elseif uMsg == WM_SIZE .elseif uMsg == WM_PAINT invoke Paint_Proc,hWin .elseif uMsg == WM_DESTROY invoke PostQuitMessage,NULL return 0 .endif invoke DefWindowProc,hWin,uMsg,wParam,lParam + в Paint_Proc Code (Text): ;; invoke SelectObject,hDC,hOld ;; исправить на invoke SelectObject,memDC,hOld
Отлично!! Все работает :lol:!! Вроде соображаю потихоньку. Моя оконная процедура была, мягко говоря, бредовым набором команд. А после того как ее упорядочили все заработало. Так? А почему ;; invoke SelectObject,hDC,hOld ;; исправить на invoke SelectObject,memDC,hOld?? В туторах к масму именно так и написано как у меня. По нему и делал. И в туторе все работает.
Sturgeon А после того как ее упорядочили все заработало. Так? Нельзя сказать что упорядочено _все_, для отображения рисунка достаточно. В данном случае функции работают парами создать/удалить выбрать/восстановить Code (Text): ... invoke CreateCompatibleDC,hDC ;; создать DC mov memDC, eax invoke SelectObject,memDC,hBmp ;; выбрать в нем BITMAP mov hOld, eax ;; сохранив предыдущий ... ;; поработать с DC invoke SelectObject,memDC,hOld ;; восстановить сохраненный BITMAP invoke DeleteDC,memDC ;; удалить DC ... в туторе все работает В туториале опечатка, а работает, потому что, наверное, не критично.