; ========================================================================================
align 16
export Window_Startup:
sub rsp, 78h
mov [rsp+60h], rsi
mov [rsp+68h], rdi
mov [rsp+70h], rbx
; ----- Enter -----
; ----------------------------
; clear WNDCLASSEXA stucture
; ----------------------------
lea edi, win ; win = address of the structure
mov ecx, 10 ; ecx: loop limit = # of bytes / 8
xor eax, eax ; eax: fillvalue = 0
dec ecx ; ecx: loop counter - 1
; loop
: mov [edi+ecx*8], rax ; use indexed*8 addressing
dec ecx
jns < ; until loop counter = loop limit
; --------------------------------------
; fill the WNDCLASSEXA structure
; --------------------------------------
mov D[win.cbSize], sizeof(WNDCLASSEXA) ; (50h) structure size in bytes
mov rax, [hInstance] ; get program's instance handle
mov [win.hInstance], rax ; store handle in the window structure
lea ebx, ClassName
lea eax, WndProc
mov [win.lpszClassName], ebx ; ptr to window class name
mov [win.lpfnWndProc], eax ; ptr to window procedure
; win.hbrBackground = CreateSolidBrush(RGB(color));
mov ecx, 0 ;AlmostBlack ; p1: COLORREF crColor (brush color)
mov [GUISkinColor], ecx ; save a copy for gui updates
; convert the color to Windows: bgr = rgb
bswap ecx ; flip the alpha channel into bits 0-7
shr ecx, 8 ; get rid of bits 0-7
call CreateSolidBrush ; returns: handle of a logical brush for LoadCursor
test rax, rax
jz >> wcError
mov [win.hbrBackground], rax ; store the handle
; ----------------------------
; load the hand cursor
; ----------------------------
xor ecx, ecx ; p1: NULL
mov edx, IDC_HAND ; p2: const for the hand
call LoadCursorA
test rax, rax
jz >> wcError
mov [win.hCursor], rax ; = hand cursor
; ----------------------------
; register the window
; ----------------------------
lea ecx, win ; p1: &win
call RegisterClassExA ; register the window
test eax, eax
jz >> wcError
; --------------------------------------
; create a centered 1920x1080 window
; --------------------------------------
xor ecx, ecx ; p1: DWORD dwExStyle (0)
lea edx, ClassName ; p2: LPCTSTR lpClassName
lea r8d, WindowTitle ; p3: LPCTSTR lpWindowName
mov r9d, WS_POPUP+WS_VISIBLE ; p4: DWORD dwStyle
mov [rsp+20h], ecx ; p5: int x (x=0)
mov [rsp+28h], ecx ; p6: int y (y=0)
mov eax, [monitor_w]
mov ebx, [monitor_h]
mov [rsp+30h], eax ; p7: int nWidth (monitor width)
mov [rsp+38h], ebx ; p8: int nHeight (monitor height)
mov [rsp+40h], rcx ; p9: HWND hWndParent (0 = top level)
mov [rsp+48h], rcx ; p10: HMENU hMenu (0 = no menu)
mov rax, [hInstance]
mov [rsp+50h], rax ; p11: HINSTANCE hInstance
mov [rsp+58h], rcx ; p12: LPVOID lpParam (0)
; ------------------
; create the window
; ------------------
call CreateWindowExA
test rax, rax
jz >> wcError
mov [hWindow], rax ; store the window handle
; ---------------
; hide the cursor
; ---------------
mov ecx, 0
call ShowCursor
; ----- REPORT SUCCESS -----
mov eax, TRUE ; 1 signals success
; ----- EXIT -----
; if eax = 0, then an error occurred
wcError:
mov rsi, [rsp+60h]
mov rdi, [rsp+68h]
mov rbx, [rsp+70h]
add rsp, 78h
ret
; ========================================================================================
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎