flat assembler
Message board for the users of flat assembler.

Index > Windows > For Newbies: Paint.asm Iczelion's example FASMW version

Author
Thread Post new topic Reply to topic
imagineer



Joined: 09 Aug 2003
Posts: 14
imagineer 15 Aug 2003, 06:01
Code:

; Paint.asm Iczelion's example FASMW version

format PE GUI 4.0
entry start


include '%include%\win32a.inc'

;------------------------------------------------------------------------------------
section '.data' data readable writeable

  _title db 'Our First Window',0
  _class db 'SimpleWinClass',0
  _OurText  db 'Win32 assembly is great and easy!',0
  mainhwnd dd ?
  hinstance dd ?
  msg MSG
  wc WNDCLASS
  _hdc dd 0
  _rect RECT
  _ps PAINTSTRUCT

;------------------------------------------------------------------------------------
section '.code' code readable executable

  start:

        invoke  GetModuleHandle,0
        mov     [hinstance],eax
        invoke  LoadIcon,0,IDI_APPLICATION
        mov     [wc.hIcon],eax
        invoke  LoadCursor,0,IDC_ARROW
        mov     [wc.hCursor],eax
        mov     [wc.style],0
        mov     [wc.lpfnWndProc],WindowProc
        mov     [wc.cbClsExtra],0
        mov     [wc.cbWndExtra],0
        mov     eax,[hinstance]
        mov     [wc.hInstance],eax
        mov     [wc.hbrBackground],COLOR_WINDOW+1
        mov     [wc.lpszMenuName],0
        mov     [wc.lpszClassName],_class
        invoke  RegisterClass,wc

        invoke  CreateWindowEx,0,_class,_title,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT , CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, [hinstance], NULL
        mov     [mainhwnd],eax
        invoke  ShowWindow, [mainhwnd], SW_SHOWNORMAL
        invoke  UpdateWindow, [mainhwnd]

  msg_loop:
        invoke  GetMessage,msg,NULL,0,0
        or      eax,eax
        jz      end_loop
        invoke  TranslateMessage,msg
        invoke  DispatchMessage,msg
        jmp     msg_loop

  end_loop:
        invoke  ExitProcess,[msg.wParam]
;------------------------------------------------------------------------------------
proc WindowProc, hwnd,wmsg,wparam,lparam
        enter
        push    ebx esi edi
        cmp     [wmsg],WM_DESTROY
        je      wmdestroy
        cmp     [wmsg],WM_PAINT
        je      wmpaint
  defwndproc:
        invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
        jmp     finish
  wmpaint:
        invoke  BeginPaint, [hwnd], _ps
        mov     [_hdc], eax
        invoke  GetClientRect, [hwnd], _rect
        invoke  DrawText, [_hdc], _OurText, -1, _rect, DT_SINGLELINE+DT_CENTER+DT_VCENTER
        invoke  EndPaint, [hwnd], _ps
        jmp     finish
  wmdestroy:
        invoke  PostQuitMessage,0
        xor     eax,eax
  finish:
        pop     edi esi ebx
        return
;------------------------------------------------------------------------------------
section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL'

  import kernel,\
         GetModuleHandle,'GetModuleHandleA',\
         ExitProcess,'ExitProcess'

  import user,\
         RegisterClass,'RegisterClassA',\
         CreateWindowEx,'CreateWindowExA',\
         DefWindowProc,'DefWindowProcA',\
         GetMessage,'GetMessageA',\
         TranslateMessage,'TranslateMessage',\
         DispatchMessage,'DispatchMessageA',\
         LoadCursor,'LoadCursorA',\
         LoadIcon,'LoadIconA',\
         PostQuitMessage,'PostQuitMessage',\
         ShowWindow,'ShowWindow',\
         UpdateWindow, 'UpdateWindow',\
         BeginPaint, 'BeginPaint',\
         GetClientRect, 'GetClientRect',\
         DrawText, 'DrawTextA',\
         EndPaint, 'EndPaint',\
         GetWindowLong, 'GetWindowLongA'
;==================================================
    


Cheers,

The I
Post 15 Aug 2003, 06:01
View user's profile Send private message Reply with quote
vbVeryBeginner



Joined: 15 Aug 2004
Posts: 884
Location: \\world\asia\malaysia
vbVeryBeginner 26 Aug 2004, 05:27
same tutorial but with a different style... ye :p

Code:
format PE GUI 4.0
entry start

include '%fasminc%\win32a.inc'

section '.data' data readable writeable
     wHMain         dd   ?
     wHInstance     dd   ?
     
     wTitle         db   'FASM - Experiment 01',0
     wClsName       db   'EXP01',0

     wMsg      MSG
     wCls      WNDCLASS

     expDc     dd   ?
     expTxt    db   'Win32 assembly with FASM is great and easy!',0
     expPs     PAINTSTRUCT
     expRect   RECT
     
     
section '.code' code readable executable
     start:
          ; +------------------------------+
          ; | registering the window class |
          ; +------------------------------+
          invoke    GetModuleHandle,NULL
                    mov  [wHInstance],eax
                    mov  [wCls.hInstance],eax
                    mov  [wCls.lpfnWndProc],window_procedure
                    mov  [wCls.lpszClassName],wClsName
                    mov  [wCls.hbrBackground],COLOR_BTNFACE+1
          invoke    LoadIcon,0,IDI_APPLICATION
                    mov  [wCls.hIcon],eax
          invoke    LoadCursor,0,IDC_ARROW
                    mov  [wCls.hCursor],eax
          invoke    RegisterClass,wCls
          
          ; +--------------------------+
          ; | creating the main window |
          ; +--------------------------+
          invoke    CreateWindowEx,\
                         0,\
                         wClsName,\
                         wTitle,\
                         WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,\
                         128,\
                         128,\
                         512,\
                         128,\
                         0,\
                         0,\
                         [wHInstance],\
                         0
                    mov  [wHMain],eax

          ; +---------------------------+
          ; | entering the message loop |
          ; +---------------------------+
          window_message_loop_start:
               invoke    GetMessage,wMsg,NULL,0,0
                         or   eax,eax
                         je   window_message_loop_end
               invoke    TranslateMessage,wMsg
               invoke    DispatchMessage,wMsg
                         jmp  window_message_loop_start
          
          window_message_loop_end:
               invoke    ExitProcess,0

          ; +----------------------+
          ; | the window procedure |
          ; +----------------------+
          proc window_procedure,hWnd,uMsg,wParam,lParam
               push ebx esi edi    ;even the API would preserved, but play safe :p
               cmp  [uMsg],WM_DESTROY
               je   wmDESTROY
               cmp  [uMsg],WM_PAINT
               je   wmPAINT
               
               wmDEFAULT:
                    invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
                              jmp  wmBYE
               wmPAINT:
                    invoke    BeginPaint,[hWnd],expPs
                              mov  [expDc],eax
                    invoke    GetClientRect,[hWnd],expRect
                    invoke    DrawText,\
                                   [expDc],\
                                   expTxt,\
                                   -1,\
                                   expRect,\
                                   DT_CENTER or DT_VCENTER or DT_SINGLELINE
                    invoke    EndPaint,[hWnd],expPs
                              jmp  wmBYE
               
               wmDESTROY:
                    invoke    PostQuitMessage,0
               wmBYE:
                    pop  edi esi ebx
                    return
          endp


section '.idata' import data readable writable
     library   KERNEL32, 'KERNEL32.DLL',\
               USER32,   'USER32.DLL'
     
     import    KERNEL32,\
               GetModuleHandle,    'GetModuleHandleA',\
               ExitProcess,        'ExitProcess'
     
     import    USER32,\
               RegisterClass,      'RegisterClassA',\
               CreateWindowEx,     'CreateWindowExA',\
               DefWindowProc,      'DefWindowProcA',\
               LoadCursor,         'LoadCursorA',\
               LoadIcon,           'LoadIconA',\
               GetMessage,         'GetMessageA',\
               TranslateMessage,   'TranslateMessage',\
               DispatchMessage,    'DispatchMessageA',\
               BeginPaint,         'BeginPaint',\
               GetClientRect,      'GetClientRect',\
               DrawText,           'DrawTextA',\
               EndPaint,           'EndPaint',\
               PostQuitMessage,    'PostQuitMessage'
    


sincerely,
vbVeryBeginner,
http://sulaiman.thefreebizhost.com
Post 26 Aug 2004, 05:27
View user's profile Send private message Visit poster's website Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.

Website powered by rwasa.