This compiles with no errors, but it isn't displaying the picture.
I modified some old code which didn't have the .rc file, I probably
messed it up.
Thanks.
This is in bitmap.rc
#define IDB_MAIN 801
IDB_MYBMP BITMAP "jakob.bmp"
Bat file that makes the .exe.
ml /c /coff /Cp jakob.asm
rc bitmap.rc
link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib jakob.obj bitmap.res
; jakob.asm
;
; ml /c /coff /Cp jakob.asm
; rc bitmap.rc
; link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib jakob.obj bitmap.res
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
IDB_MAIN equ 801
.data
ClassName db "SimpleWin32ASMBitmapClass",0
AppName db "Jakob at 2 yrs",0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hBitmap dd ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,0,0,1024,768,NULL,NULL,\
hInst,NULL
;INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
; WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
; CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
; hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.while TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.break .if (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL ps:PAINTSTRUCT
LOCAL hdc:HDC
LOCAL hMemDC:HDC
LOCAL rect:RECT
.if uMsg==WM_CREATE
invoke LoadBitmap,hInstance,IDB_MAIN
mov hBitmap,eax
.elseif uMsg==WM_PAINT
invoke BeginPaint,hWnd,addr ps
mov hdc,eax
invoke CreateCompatibleDC,hdc
mov hMemDC,eax
invoke SelectObject,hMemDC,hBitmap
invoke GetClientRect,hWnd,addr rect
invoke BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY
invoke DeleteDC,hMemDC
invoke EndPaint,hWnd,addr ps
.elseif uMsg==WM_DESTROY
invoke DeleteObject,hBitmap
invoke PostQuitMessage,NULL
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
CreateCompatibleDC..
CreateCompatibleBitmap, ps.hdc, _cx, _cy ; is missing
SelectObject..
CreateCompatibleBitmap, ps.hdc, _cx, _cy ; is missing
SelectObject..
Maybe you must change
> IDB_MYBMP BITMAP "jakob.bmp"
to
> IDB_MAIN BITMAP "jakob.bmp"
Maybe you must change
> IDB_MYBMP BITMAP "jakob.bmp"
to
> IDB_MAIN BITMAP "jakob.bmp"
Thanks, it's going OK now.
How hard would it be to modify this so it "self adjusts to the bitmap size" instead of manually having to do it.
I like the window to just show the pic without the white background.
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,0,0,781,300,NULL,NULL,\ ; 361 x 552
hInst,NULL
> How hard would it be to modify this so it "self adjusts to the bitmap size" instead of manually having to do it.
its trivial. First get your bitmap dimensions. For example with function GetDIBits() (or possibly GetObject, not sure about that). Second, calc the window size based on the required client size. This is done with AdjustWindowRect(). Then create your window.
its trivial. First get your bitmap dimensions. For example with function GetDIBits() (or possibly GetObject, not sure about that). Second, calc the window size based on the required client size. This is done with AdjustWindowRect(). Then create your window.
> How hard would it be to modify this so it "self adjusts to the bitmap size" instead of manually having to do it.
its trivial. First get your bitmap dimensions. For example with function GetDIBits() (or possibly GetObject, not sure about that). Second, calc the window size based on the required client size. This is done with AdjustWindowRect(). Then create your window.
The way I am doing it know is by using mspaint to get the dimensions and then plugging those values in.
Looking for a way that the program will figure it out automatically. It's really not that big a deal, just thought windows had some function already built in.
I looked thru some former posts and found where I was trying to embed a jpg but it didn't go real far.
Guess there isn't much incentive for MS to support non-BMP stuff. :-)