Win32 Api wyświetlanie pliku .BMP w okienku. POMOCY

plaster90

Użytkownik
Dołączył
Luty 2, 2013
Posty
13
Witam.
Od paru dni przeglądam wiele stron związanych z wyświetleniem bmp w okienku.
Najważniejsze to ze moj kompilator to FASM.
Mam gotowy program:
http://edu.i-lo.tarnow.pl/inf/prg/002_winasm/0026.php

i staram się go tak przerobić żeby fasm mi to skompilował.
wszystko ok.okienko się wyświetla tylko bez rysunku.

Oto mój kod i będę bardzo wdzięczny jeżeli ktoś poświeci trochę czasu żeby mi pomoc:


format PE GUI 4.0
entry start
include 'win32ax.inc'

section '.text' data readable executable
start:
invoke GetModuleHandle,0
mov [wc.hInstance],eax
mov [wc.hbrBackground],NULL
invoke RegisterClass,wc
test eax,eax
jz error
invoke CreateWindowEx,0,text,0,\
+WS_VISIBLE+WS_SYSMENU,1,1,230,280,\
NULL,NULL,[wc.hInstance],NULL
mov [hwnd],eax
test eax,eax
jz error
msg_loop:
invoke GetMessage,msg,NULL,0,0
cmp eax,1
jb end_loop
jne msg_loop
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop
error:
invoke MessageBox,NULL,blad,NULL,NULL,MB_OK
end_loop:
invoke ExitProcess,[msg.wParam]


proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam
cmp [wmsg],WM_CREATE
je _create
cmp[wmsg],WM_PAINT
je _paint
cmp [wmsg],WM_DESTROY
je _zniszcz
_defwndproc:
invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
jmp _finish
_create:
invoke LoadBitmap, [wc.hInstance], IDB_MAIN
mov [hBitmap], eax
jmp _defwndproc
_paint:
invoke BeginPaint, [hwnd],ps
mov [hdc], eax
invoke CreateCompatibleDC, hdc
mov [hMemDC], eax
invoke SelectObject, hMemDC, hBitmap
invoke GetClientRect, [hwnd],rect
invoke BitBlt, hdc, 0, 0, rect.right, rect.bottom,\
hMemDC, 0, 0, SRCCOPY
invoke DeleteDC, hMemDC
invoke EndPaint,[hwnd],ps
jmp _defwndproc
_zniszcz:
invoke DeleteObject, hBitmap
invoke PostQuitMessage, NULL

_finish:
ret
endp

section '.data' data readable writeable

hwnd dd ?
hBitmap dd 0
hdc dd 0
hMemDC dd 0
ps PAINTSTRUCT
rect RECT
text TCHAR 'Win32 Asembler K.G.',0
blad TCHAR 'Wystapil blad',0

wc WNDCLASS 0,WindowProc,0,0,0,0,0,1,NULL,text
msg MSG
IDB_MAIN db 'tweety78.bmp'

section '.idata' import data readable writeable
library ddraw,'DDRAW.DLL',kernel32,'KERNEL32.DLL',user32,'USER32.DLL',gdi32,'gdi32.dll',shell32.dll,'shell32.dll'
include 'api\kernel32.inc'
include 'api\user32.inc'
include 'api\gdi32.inc'
 

codex

Użytkownik
Dołączył
Październik 30, 2012
Posty
25
- U mnie w systemie nie ma pliku ' USER32.DLL' za to jest 'USER32.DLL' ( różnica w spacji na początku nazwy)
podobna sytuacja dotyczy nazwy 'shell32 .dll'.

- Formatowanie kodu. Nie jestem czepialski ale jeżeli chcesz żeby ktoś analizował twój kod to przynajmniej zrób co się da żeby go uczytelnić również ( a właściwie przede wszystkim ) dla siebie.

Do rzeczy:

Zobacz poniżej przerobiony swój kod który powinien ci zobrazować co się dzieje :

Kod:
format PE GUI 4.0
entry start
include     'win32ax.inc'
;include     'n\codehelp.inc'

section '.data' data readable writeable

        hwnd            dd ?
        hBitmap         dd 0
        hdc             dd 0
        hMemDC          dd 0
        ps              PAINTSTRUCT
        rect            RECT
        text            TCHAR 'Win32 Asembler K.G.',0
        blad            TCHAR 'Wystapil blad',0

        wc              WNDCLASSA 0,WindowProc,0,0,0,0,0,1,NULL,text
        msg             MSG
        IDB_MAIN        db    'the_star_main.bmp'


section '.text' data readable executable
start:
        invoke      GetModuleHandle,0
        mov         [wc.hInstance],eax
        mov         [wc.hbrBackground],NULL
        invoke      RegisterClass,wc
        test        eax,eax
        jz          error

        invoke      CreateWindowEx, 0, text, 0, WS_VISIBLE+WS_SYSMENU, 100, 100, 800, 600, NULL, NULL, [wc.hInstance], NULL
        mov         [hwnd],eax
        test        eax,eax
        jz          error

msg_loop:
        invoke GetMessage,msg,NULL,0,0
        cmp eax,1
        jb end_loop
        jne msg_loop
        invoke TranslateMessage,msg
        invoke DispatchMessage,msg
        jmp msg_loop
error:
        invoke MessageBox,NULL,blad,NULL,NULL,MB_OK
end_loop:
        invoke ExitProcess,[msg.wParam]


proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam

         cmp     [wmsg],WM_CREATE
         je      _create
         cmp     [wmsg],WM_PAINT
         je      _paint
         cmp     [wmsg],WM_DESTROY
         je      _zniszcz

_defwndproc:
        invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
        ret
_create:
        invoke      LoadBitmap, [wc.hInstance], IDB_MAIN
        test        eax, eax
        jnz         @f
                    invoke      MessageBox, 0, 'wywolanie funkcji LoadBitmap zakonczone bledem','ERROR', MB_OK
                    ret
        @@:
        mov         [hBitmap], eax
        ret
_paint:
        invoke      BeginPaint, [hwnd], ps
        mov         [hdc], eax
        invoke      CreateCompatibleDC, [hdc]
        mov         [hMemDC], eax
        invoke      SelectObject, [hMemDC], [hBitmap]
        invoke      GetClientRect, [hwnd], rect
        invoke      BitBlt, [hdc], 0, 0, [rect.right], [rect.bottom],\
                    [hMemDC], 0, 0, SRCCOPY
        invoke      DeleteDC, [hMemDC]
        invoke      EndPaint, [hwnd], ps
        ret
_zniszcz:
        invoke      DeleteObject, [hBitmap]
        invoke      PostQuitMessage, NULL
        ret
endp



section '.idata' import data readable writeable
        library ddraw,'DDRAW.DLL',\
        kernel32,'KERNEL32.DLL',\
        user32,'USER32.DLL',\
        gdi32,'gdi32.dll',\
        shell32.dll,'shell32.dll'

include 'api\kernel32.inc'
include 'api\user32.inc'
include 'api\gdi32.inc'

Oczywiście masz poprawione w funkcji WindowProc błędy typu:
hMemDC zmienione na [hMemDC]
hdc zmienione na [hdc]

To jest różnica w odwołaniu do pamięci między składnią MASM oraz FASM .
Jednak poza samymi błędami składniowymi które poprawiłem masz błąd zasadniczy który powinien zobrazować ci powyższy program. Mam nadzieję, że "zaskoczysz".
 
Ostatnia edycja:

plaster90

Użytkownik
Dołączył
Luty 2, 2013
Posty
13
Dziekuje za pomoc i poczenia.

Jednak cały twój kod który mi przesłałeś również nie działa. Wywala błąd ''wywolanie funkcji LoadBitmap zakonczone bledem''
i pokazuje przezroczyste tło. Za to wszystko jest ok kiedy zamiast użyć funkcji LoadBitmap użyłe LoadImage:)
 
Do góry Bottom