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
Posted on 2006-01-17 10:34:50 by skywalker
CreateCompatibleDC..
CreateCompatibleBitmap, ps.hdc, _cx, _cy ; is missing
SelectObject..
Posted on 2006-01-17 11:13:51 by ramguru

Maybe you must change

> IDB_MYBMP BITMAP "jakob.bmp"

to

> IDB_MAIN BITMAP "jakob.bmp"
Posted on 2006-01-17 11:15:23 by japheth


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
Posted on 2006-01-17 14:08:54 by skywalker
> 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.
Posted on 2006-01-17 16:20:27 by japheth

> 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. :-)

Posted on 2006-01-17 17:24:30 by skywalker