; ----------------------------------------------------------------------------
; -       COMMENT : We want to write a text into a window using GDI          -
; ----------------------------------------------------------------------------

format PE GUI 4.0
entry start

include 'win32w.inc'         ; Incluímos definiciones de estructuras y constantes

cdXPos      EQU  28          ; Constante double X-Posición de la ventana(esq sup izqda)
cdYPos      EQU  100         ; Constante double Y-Posición de la ventana(esq sup izqda)
cdXSize     EQU  620         ; Constante double X-tamaño de la ventana
cdYSize     EQU  400         ; Constante double Y-tamaño de la ventana
cdColFondo  EQU  COLOR_BTNFACE + 1  ; Color de fondo de la ventana: gris de un botón de comando
cdVIcono    EQU  IDI_APPLICATION ; Icono de la ventana, véase Resource.H
cdVCursor   EQU  IDC_ARROW   ; Cursor para la ventana
; Tipo de ventana (Barra de cabecera)
; cdVBarTipo  EQU  WS_EX_TOOLWINDOW                     ; Tipo de barra de Cabecera: delgado, sin icono, sin reflejo en la barra de tareas
cdVBarTipo  EQU  NULL                     ; Normal, con icono
cdVBtnTipo  EQU  WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU    ; Normal sólo con botón cerrar
; cdVBtnTipo     EQU  WS_OVERLAPPEDWINDOW                ; Normal sólo con los tres botones
; Constantes para el texto
cdFXPos1     EQU  50
cdFYPos1     EQU  10
cdFSize      EQU  20                      ; Tamaño del texto

      
section '.text' code readable executable
  start:
    invoke    GetModuleHandle, NULL
    mov       [wc.hInstance], eax
    mov       [wc.lpfnWndProc], WndProc
    mov       [wc.lpszClassName], NombreClase
    mov       [wc.hbrBackground], COLOR_BTNFACE+1
    stdcall   WinMain, [wc.hInstance], NULL, NULL, SW_SHOWNORMAL
    invoke    ExitProcess, [wMsg.wParam]

proc WinMain uses ebx esi edi, hInst, hPrevInst, CmdLine, CmdShow
    ;  Propósito: Inicializamos la ventana principal de la aplicación y captura errores, si los hubiere
    ;  Entrada  : hInst, hPrevInst, CmdLine, CmdShow
    ;  Salida   : Ninguna
    ;  Destruye : Ninguna
    invoke    LoadIcon,0,cdVIcono
    mov       edx, eax
    mov       eax, [hInst]
    mov       ebx, NombreClase
    mov       ecx, WndProc
    mov       [wc.hInstance], eax
    mov       [wc.lpszClassName], ebx
    mov       [wc.lpfnWndProc], ecx
    mov       [wc.hIcon], edx

    invoke    LoadCursor,0,cdVCursor
    mov       [wc.hCursor],eax
    
    invoke    RegisterClass,wc
    test      eax,eax
    jz        error

    invoke    CreateWindowEx,cdVBarTipo,NombreClase,MsgCabecera,\
              cdVBtnTipo,cdXPos, cdYPos, cdXSize, cdYSize,\
              NULL,NULL,[wc.hInstance],NULL
    mov       [wHMain],eax
    test      eax,eax
    jz        error

    mov       [hWnd], eax

    invoke    ShowWindow, dword hWnd, dword SW_SHOWNORMAL
    invoke    UpdateWindow, dword hWnd

  msg_loop:
    invoke    GetMessage,wMsg,NULL,0,0
    cmp       eax,1
    jb        end_loop
    jne       msg_loop
    invoke    TranslateMessage,wMsg
    invoke    DispatchMessage,wMsg
  jmp       msg_loop

  error:
    invoke    MessageBox,NULL,MsgError,NULL,MB_ICONERROR+MB_OK

  end_loop:
    mov       eax, [wMsg.wParam]
    ret
endp

proc WndProc,hWnd,uMsg,wParam,lParam
    push      ebx esi edi   
    .wm_paint:
        cmp       [uMsg], WM_PAINT
        jnz       .wm_destroy
        invoke    BeginPaint,[hWnd], ps
        mov       [hdc], eax
        ; Aquí dibujamos el texto horizontal en verdana
        invoke    CreateFont, cdFSize,0,0,0, FW_NORMAL, FALSE,FALSE,FALSE, \
                  ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, \
                  DEFAULT_QUALITY, 34, szVerdana
        mov       [hNFont], eax
        invoke    SelectObject, [hdc], [hNFont]
        mov       [hOFont], eax
        invoke    lstrlen, MsgTexto1
        invoke    TextOut, [hdc], cdFXPos1,cdFYPos1, MsgTexto1, eax
        invoke    DeleteObject, [hOFont]
        ; Aquí terminamos
        invoke    EndPaint,[hWnd],ps
        jmp       .wm_default
    .wm_destroy:
        cmp       [uMsg], WM_DESTROY
        jnz       .wm_default
        invoke    PostQuitMessage,0
    .wm_default:
        invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    pop      edi esi ebx
    ret
endp

section '.data' data readable writeable
  wHMain       rd    1
  hWnd         rd    1

  MsgCabecera  db    'Hello there!',0
  NombreClase  db    'EXP01',0

  MsgError     db    'Initial loading fails',0
  expDc        rd    1
  MsgTexto1    db    "What's up?",0
             
  wMsg          MSG
  wc            WNDCLASS

  expPs         PAINTSTRUCT
  expRect       RECT
  hdc           rd    1
  ps            PAINTSTRUCT
  hNFont        rd    1
  hOFont        rd    1
  
  szTNRoman     DB    "Times New Roman",0
  szVerdana     DB    "Verdana",0
  szArial       DB    "Arial",0
  szCourierNew  DB    "Courier New",0

section '.idata' import data readable writable 
  library kernel32,'KERNEL32.DLL',\    ; Importamos las bibliotecas para que el enlazador pueda trabajar
          user32,  'USER32.DLL',\      ; Importamos las bibliotecas para que el enlazador pueda trabajar
          gdi32,   'GDI32.DLL'         ; Importamos las bibliotecas para que el enlazador pueda trabajar

  include 'api\kernel32.inc'           ; KERNEL32 API calls
  include 'api\user32.inc'             ; USER32 API calls
  include 'api\gdi32.inc'              ; USER32 API calls

    import    GDI32,\
      CreateFont,      'CreateFontA',\
      SelectObject,     'SelectObjectA',\
      DeleteObject,      'DeleteObjectA'
