format PE GUI 4.0
entry start

include '%fasminc%\win32a.inc'

section '.code' code readable executable

  start:
;        int3
        mov     dword [hWndMain], 00
        invoke  LoadLibrary, RichEditDllName
	invoke	GetModuleHandle,0
	mov	[wc.hInstance],eax
	invoke	RegisterClass,wc
        invoke  InitCommonControls
        invoke  CreateWindowEx, WS_EX_CLIENTEDGE, myClass, myTitle, WS_VISIBLE+WS_OVERLAPPEDWINDOW-WS_MAXIMIZEBOX-WS_THICKFRAME, CW_USEDEFAULT, CW_USEDEFAULT, 600, 400, NULL, NULL, [wc.hInstance], NULL
        mov     [hWndMain], eax
        invoke  GetCurrentProcess
        mov     [hProcess], eax
  msg_loop:
	invoke	GetMessage,msg,NULL,0,0
	or	eax,eax
	jz	end_loop
        invoke  TranslateAccelerator, [hWndMain], [hAccel], msg
        or      eax, eax
        jnz     msg_loop
        invoke  IsDialogMessage, [hWndMain], msg
        or      eax, eax
        jnz     msg_loop
	invoke	TranslateMessage,msg
	invoke	DispatchMessage,msg
	jmp	msg_loop
  end_loop:
	invoke	ExitProcess,[msg.wParam]

ShowError:
        pushad
        invoke  GetLastError
        invoke  FormatMessage,FORMAT_MESSAGE_FROM_SYSTEM+FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,eax,LANG_NEUTRAL,ErrStrBuff,0,NULL
        invoke  MessageBox,HWND_DESKTOP,[ErrStrBuff],NULL,MB_ICONERROR+MB_OK
        popad
        ret

proc wndProc hwnd,wmsg,wparam,lparam
	push	ebx esi edi
        cmp     [wmsg], WM_DESTROY
        je      .wmDESTROY
        cmp     [wmsg], WM_CREATE
        je      .wmCREATE
        cmp     [wmsg], WM_COMMAND
        je      .wmCOMMAND
    .wmDEFAULT:
	invoke	DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
        jmp     .wmBYE
    .wmCREATE:
        invoke  GetClientRect, [hwnd], rcClient
        invoke  CreateWindowEx, 0, RichEditClass, NULL, WS_HSCROLL+WS_VSCROLL+WS_VISIBLE+WS_CHILD+ES_MULTILINE+ES_READONLY, 0, 0, [rcClient.right], [rcClient.bottom], [hwnd], NULL, [wc.hInstance], NULL
        mov     [EhWnd], eax
        jmp     .wmBYE
    .wmDESTROY:
	invoke	PostQuitMessage,0
	xor	eax,eax
    .wmCOMMAND:
        mov     eax, [wparam]
        and     eax, 0FFFFh
        cmp     eax, MI_EXIT
        je      .miEXIT
        cmp     eax, MI_10
        jne     @f
        mov     [FontSize], 10
        jmp     .showFont
    @@:
        cmp     eax, MI_12
        jne     @f
        mov     [FontSize], 12
        jmp     .showFont
    @@:
        cmp     eax, MI_14
        jne     @f
        mov     [FontSize], 14
        jmp     .showFont
    @@:
        cmp     eax, MI_16
        jne     @f
        mov     [FontSize], 16
        jmp     .showFont
    @@:
        cmp     eax, MI_18
        jne     @f
        mov     [FontSize], 18
        jmp     .showFont
    @@:
        jmp     .wmDEFAULT
    .miEXIT:
        invoke  PostQuitMessage, 0
        xor     eax, eax
        jmp     .wmBYE
    .showFont:
        call    ShowFont
        jmp     .wmBYE
    .wmBYE:
	pop	edi esi ebx
	ret
endp

ShowFont:
        invoke  CreateFont,[FontSize],0,0,0,0,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_RASTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH+FF_SWISS,FontName
        mov     [FontHnd], eax
        invoke  GetDC, [EhWnd]
        mov     [hDC], eax
        invoke  SelectObject, [hDC], [FontHnd]
        invoke  GetTextMetrics, [hDC], tm
        invoke  ReleaseDC, [EhWnd], [hDC]
        invoke  SendMessage, [EhWnd], WM_SETFONT, [FontHnd], FALSE
        mov     edi, tmHeight
        mov     esi, tm
        mov     ecx, 11
    @@:
        xor     eax, eax
        lodsd
        call    word2asc        ;convert word in ax to 5 byte str in dl, ebx
        add     edi, 23
        mov     [edi], dl
        mov     [edi+01], ebx
        add     edi, 7
        loop    @b
        mov     ecx, 9
    @@:
        lodsb
        aam
        xchg    ah, al
        add     ax, 0x3030
        add     edi, 23
        stosw
        add     edi, 2
        loop    @b
        invoke  SetWindowText, [EhWnd], TMstr
        ret
word2asc:
        push    ecx
        mov     ebx, 10
        mov     ecx, 5
    @@:
        xor     edx, edx
        div     ebx
        add     dl, 0x30
        push    edx
        loop    @b
        pop     edx
        mov     ecx, 4
        xor     ebx, ebx
    @@:
        pop     eax
        shl     eax, 24                 ; 00000030 -> 30000000
        shr     ebx, 8                  ;ebx = 00300000
        add     ebx, eax                ; ebx = 30000000
        loop    @b
        pop     ecx
        ret
section '.data' data readable writeable
  hWndMain              dd ?
  hProcess              dd ?
  hAccel                dd ?
  myTitle               db 'Title',0
  myClass               db 'MyClass',0
  ErrStrBuff            dd ?
  wc                    WNDCLASS 0,wndProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,M_MAIN,myClass
  msg                   MSG
  rcClient              RECT
  FontName              db 'Arial', 0
  FontSize              dd ?
  FontHnd               dd ?
  FontSizeStr           db 'Font size is '
  FontSizeNum           dw 2 dup 0
  RectHeightStr         db 'Height of text rect from GetTextExtentPoint32 is '
  RectHeightNum         dw 2 dup 0
  hDC                   dd ?
TMstr                   db 'Info from TEXTMETRICS...', 0x0D, 0x0A, 0x0D, 0x0A
tmHeight                db 'tmHeight               ', 5 dup ?, 0x0D, 0x0A
tmAscent                db 'tmAscent               ', 5 dup ?, 0x0D, 0x0A
tmDescent               db 'tmDescent              ', 5 dup ?, 0x0D, 0x0A
tmInternalLeading       db 'tmInternalLeading      ', 5 dup ?, 0x0D, 0x0A
tmExternalLeading       db 'tmExternalLeading      ', 5 dup ?, 0x0D, 0x0A
tmAveCharWidth          db 'tmAveCharWidth         ', 5 dup ?, 0x0D, 0x0A
tmMaxCharWidth          db 'tmMaxCharWidth         ', 5 dup ?, 0x0D, 0x0A
tmWeight                db 'tmWeight               ', 5 dup ?, 0x0D, 0x0A
tmOverhang              db 'tmOverhang             ', 5 dup ?, 0x0D, 0x0A
tmDigitizedAspectX      db 'tmDigitizedAspectX     ', 5 dup ?, 0x0D, 0x0A
tmDigitizedAspectY      db 'tmDigitizedAspectY     ', 5 dup ?, 0x0D, 0x0A
tmFirstChar             db 'tmFirstChar            ', 2 dup ?, 0x0D, 0x0A
tmLastChar              db 'tmLastChar             ', 2 dup ?, 0x0D, 0x0A
tmDefaultChar           db 'tmDefaultChar          ', 2 dup ?, 0x0D, 0x0A
tmBreakChar             db 'tmBreakChar            ', 2 dup ?, 0x0D, 0x0A
tmItalic                db 'tmItalic               ', 2 dup ?, 0x0D, 0x0A
tmUnderlined            db 'tmUnderlined           ', 2 dup ?, 0x0D, 0x0A
tmStruckOut             db 'tmStruckOut            ', 2 dup ?, 0x0D, 0x0A
tmPitchAndFamily        db 'tmPitchAndFamily       ', 2 dup ?, 0x0D, 0x0A
tmCharSet               db 'tmCharSet              ', 2 dup ?, 0x0D, 0x0A
tmEnd                   db 0
tm                      TEXTMETRIC
RichEditClass           db 'RICHEDIT20A', 0
RichEditDllName         db 'riched20.DLL', 0
EhWnd                   dd ?
M_MAIN                  = 2000
MI_EXIT                 = 3000
MI_10                   = 4010
MI_12                   = 4012
MI_14                   = 4014
MI_16                   = 4016
MI_18                   = 4018

section '.rsrc' resource data readable
directory \
        RT_MENU, menus

resource menus,\
        M_MAIN, LANG_ENGLISH + SUBLANG_DEFAULT, main_menu

menu main_menu
     menuitem  '&File', 0, MFR_POPUP
     menuitem           'E&xit', MI_EXIT, MFR_END
     menuitem  '&Font', 0, MFR_POPUP+MFR_END
     menuitem           '1&0', MI_10
     menuitem           '1&2', MI_12
     menuitem           '1&4', MI_14
     menuitem           '1&6', MI_16
     menuitem           '1&8', MI_18, MFR_END

section '.idata' import data readable writeable

library kernel32,'KERNEL32.DLL',\
        user32,  'USER32.DLL',\
        gdi32,   'GDI32.DLL',\
        comctl32,'COMCTL32.DLL'

include '%fasminc%\apia\Kernel32.inc'
include '%fasminc%\apia\User32.inc'
include '%fasminc%\apia\Gdi32.inc'
include '%fasminc%\apia\Comctl32.inc'
