Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Bitmap 
V
    Опции темы
gwest
Дата 8.11.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



Вобщем написал программу... но картинка не отображается...
include.inc
Код

;сообщения
WM_CREATE equ 1h
WM_PAINT equ 0Fh
WM_TIMER equ 113h
WM_DESTROY equ 2h

;константы стилей окна и других элементов
CS_GLOBALCLASS equ 4000h
CS_HREDRAW equ 2h
CS_VREDRAW equ 1h
WS_OVERLAPPED equ 0h
WS_THICKFRAME equ 40000h
WS_SYSMENU equ 80000h
WS_POPUP equ 80000000h
COLOR_WINDOW equ 17
SW_HIDE equ 0
SW_SHOWNORMAL equ 1
SRCCOPY equ 0CC0020h


;стили окна и других элементов
STYLE equ CS_VREDRAW + CS_HREDRAW + CS_GLOBALCLASS
WS_OVERLAPPEDWINDOW equ WS_OVERLAPPED + WS_THICKFRAME + WS_SYSMENU


;константы курсора и иконки
IDC_ARROW equ 32512
IDI_WINLOGO equ 32517


;функции
extern LoadBitmapA@8:near
extern BeginPaint@8:near
extern EndPaint@8:near
extern CreateCompatibleDC@4:near
extern SelectObject@8:near
extern BitBlt@36:near
extern DeleteDC@4:near
extern GetModuleHandleA@4:near
extern LoadIconA@8:near
extern LoadCursorA@8:near
extern RegisterClassA@4:near
extern CreateWindowExA@48:near
extern ExitProcess@4:near
extern ShowWindow@8:near
extern UpdateWindow@4:near
extern TranslateMessage@4:near
extern DispatchMessageA@4:near
extern PostQuitMessage@4:near
extern DefWindowProcA@16:near
extern GetMessageA@16:near
extern CreateRoundRectRgn@24:near
extern SetWindowRgn@12:near


;структуры
PAINTSTR STRUC
  Hdc DD ?
  fErase DD ?
  left DD ?
  top DD ?
  right DD ?
  bottom DD ?
  fRes DD ?
  fIncUp DD ?
  Reserv DB 32 dup (0)
PAINTSTR ENDS

MSGSTRUCT STRUC
  MSHWND DD ?
  MSMESSAGE DD ?
  MSWPARAM DD ?
  MSLPARAM DD ?
  MSTIME DD ?
  MSPT DD ?
MSGSTRUCT ENDS

WNDCLASS STRUC
  CLSSTYLE DD ?
  CLWNDPROC DD ?
  CLSCEXTRA DD ?
  CLWNDEXTRA DD ?
  CLSHINSTANCE DD ?
  CLSHICON DD ?
  CLSHCURSOR DD ?
  CLBKGROUND DD ?
  CLMENUNAME DD ?
  CLNAME DD ?
WNDCLASS ENDS


code.asm
Код

.586
.MODEL FLAT, stdcall

include include.inc
includelib ../lib/user32.lib
includelib ../lib/kernel32.lib
includelib ../lib/gdi32.lib


_data segment
  BitmapName  db "MyBitMap",0
  hinst dd 0
  hBitmap dd 0
  newhwnd dd 0
  hwnd dd 0
  hMemDC dd 0
  histDC dd 0
  titlename db 'заголовок',0
  classname db 'class32',0 
  msg MSGSTRUCT <?>
  wc WNDCLASS <?>
  pt PAINTSTR <?>
_data ends

_code segment
start:
  push 0
  call GetModuleHandleA@4
  mov [hinst],eax
  
  mov [wc.CLSSTYLE],STYLE
  mov [wc.CLWNDPROC],offset WNDPROC
  mov [wc.CLSCEXTRA],0
  mov [wc.CLWNDEXTRA],0
  mov eax,[hinst]
  mov [wc.CLSHINSTANCE],eax
  push IDI_WINLOGO
  push 0
  call LoadIconA@8
  mov [wc.CLSHICON],eax
  push IDC_ARROW
  push 0
  call LoadCursorA@8
  mov [wc.CLSHCURSOR],eax
  mov [wc.CLBKGROUND],COLOR_WINDOW
  mov [wc.CLMENUNAME],0
  mov [wc.CLNAME],offset classname
  
  push offset wc
  call RegisterClassA@4
  
  push 0
  push [hinst]
  push 0
  push 0
  push 500
  push 500
  push 0
  push 0
  push WS_POPUP
  push offset titlename
  push offset classname
  push 0
  call CreateWindowExA@48
  
  cmp eax,0
  jz _err
  mov [newhwnd],eax
  
  push SW_SHOWNORMAL
  push [newhwnd]
  call ShowWindow@8
  
  push [newhwnd]
  call UpdateWindow@4

msg_loop:

  push 0
  push 0
  push 0
  push offset msg
  call GetMessageA@16
  cmp eax,0
  jz _err
  push offset msg
  call TranslateMessage@4
  push offset msg
  call DispatchMessageA@4
  jmp msg_loop

end_loop:
  push [msg.MSWPARAM]
  call ExitProcess@4
_err:
  jmp end_loop

;[ebp+014h]-lpar
;[ebp+10h]-wpar
;[ebp+0ch]-mes
;[ebp+8h]-hwnd
WNDPROC proc
  push ebp
  mov ebp,esp
  push ebx
  push esi
  push edi
  cmp dword ptr [ebp+0ch],WM_DESTROY
  je wmdestroy
  cmp dword ptr [ebp+0ch],WM_CREATE
  je wmcreate
  cmp dword ptr [ebp+0ch],WM_PAINT
  je wmpaint
  jmp defwndproc
wmcreate:
  push offset BitmapName
  push dword ptr [ebp+8h]
  call LoadBitmapA@8
  mov hBitmap,eax
  ;push 200
  ;push 200
  ;push 200
  ;push 200
  ;push 0
  ;push 0
  ;call CreateRoundRectRgn@24
  ;push 0                       ; FALSE
  ;push eax                     ; Handle региона
  ;push dword ptr [ebp+08h]     ; Handle окна
  ;call SetWindowRgn@12         ; Устанавливаем 

регион
  mov eax,0
  jmp finish
wmpaint:
  push offset pt
  push dword ptr [ebp+8h]
  call BeginPaint@8
  mov histDC,eax
  push eax
  call CreateCompatibleDC@4
  mov hMemDC,eax
  push offset BitmapName
  push hMemDC
  call SelectObject@8
  push SRCCOPY
  push 0
  push 0
  push hMemDC
  push 200
  push 200
  push 10
  push 10
  push histDC
  call BitBlt@36
  push hMemDC
  call DeleteDC@4
  push offset pt
  push dword ptr [ebp+8h]
  call EndPaint@8
  mov eax,0
  jmp finish
defwndproc:
  push dword ptr [ebp+014h]
  push dword ptr [ebp+10h]
  push dword ptr [ebp+0ch]
  push dword ptr [ebp+8h]
  call DefWindowProcA@16
  jmp finish
wmdestroy:
  push 0
  call PostQuitMessage@4
  mov eax,0
finish:
  pop edi
  pop esi
  pop ebx
  pop ebp
  ret 16
WNDPROC endp 
_code ends 
end start


при компиляции ошибки не возникает...

файл ресурсов
Код

MyBitMap  BITMAP "1.bmp"

PM MAIL   Вверх
gwest
Дата 8.11.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



в code.asm 
в 143 строке я допустил ошибку:
вместо   
Код

push offset BitmapName

надо заменить на 
Код

push hBitmap

но в результате картинка всеравно не выводится smile 
PM MAIL   Вверх
anwe
Дата 8.11.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Ты знаешь, у меня тоже была такая проблема. Не знаю почему так и я сделал по второму варианту LoadBitmap:
Код

IDB_MAIN   equ 1
...
  push IDB_MAIN
  push dword ptr [ebp+8h]
  call LoadBitmapA@8

а IDB_MAIN пропиши в файле ресурсов:
Код

IDB_MAIN    BITMAP  "MyBitMap.bmp"

PM MAIL   Вверх
gwest
Дата 8.11.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



вобщем попробовал вторым способом... тоже не отобразилась... smile 
после выгрузки поспробовал послать сообщение перерисоваться....   
Код

push [newhwnd]
call UpdateWindow@4

хм...так ничего и не получилось smile 
PM MAIL   Вверх
anwe
Дата 8.11.2006, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



А тебя файл bmp (и путь к нему) существует?
PM MAIL   Вверх
gwest
Дата 8.11.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



ясно дело существует....
 smile и ниче не решено... не решен вопрос еще... надо думать дальше

2 anwe:
спасибо конечно за совет, но я его тоже пробовал прежде чем тему создать...даже после твоего поста еще раз все перепробовал... но ток результата, то нет... и понятия в чем проблема тоже нет... было бы все так просо вопрос бы небыл задан...
или утя все норм работеет если так то не поленись скинь полностью рабочий код

Это сообщение отредактировал(а) gwest - 8.11.2006, 21:53
PM MAIL   Вверх
anwe
Дата 8.11.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Лови в прикрепленном файле!
Только там masm32, но суть, конечно, та же.
И еще. У тебя не полное восстановление стекового кадра. У тебя идет просто
Код

pop ebp

а надо:
Код

mov esp,ebp
pop ebp


Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Bitmap.rar 4,11 Kb
PM MAIL   Вверх
gwest
Дата 9.11.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 8.11.2005

Репутация: нет
Всего: нет



2 anwe:
спасибо за пример из wasma  smile 
и с востановлением стекового кадра все впорядке ты просто не внимательно посмотрел что я передал в стек...

ошибка была в етом месте:
Код

  push IDB_MAIN
  push dword ptr [ebp+8h] ;hinst
  call LoadBitmapA@8


в качестве первого пораметра нужно передавать дескриптор приложения, а не окна

вот:
Код

  push IDB_MYBITMAP
  push [hinst]
  call LoadBitmapA@8

вот теперь тему можно закрыть smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.1057 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.