; Mouse.asm Iczelion's example FASMW version
format PE GUI 4.0
entry start
include '%include%\win32a.inc'
;---------------------------------------------
section '.data' data readable writeable
_title db 'Mouse Click Demo',0
_class db 'SimpleWinClass',0
mainhwnd dd ?
hinstance dd ?
msg MSG
wc WNDCLASS
_hdc dd 0
_ps PAINTSTRUCT
_keychar dd 0
_hitpoint POINT
_MouseClick dd 0
;---------------------------------------------
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_LBUTTONDOWN
je wmlbuttondown
cmp [wmsg],WM_PAINT
je wmpaint
defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp finish
wmlbuttondown:
mov eax, [lparam]
and eax, 0ffffh
mov [_hitpoint.x], eax
mov eax,[lparam]
shr eax, 16
mov [_hitpoint.y], eax
mov [_MouseClick], TRUE
invoke InvalidateRect, [hwnd], NULL, TRUE
jmp finish
wmpaint:
invoke BeginPaint, [hwnd], _ps
mov [_hdc], eax
mov eax, [_MouseClick]
cmp eax, TRUE
jne done
invoke lstrlen, _title
invoke TextOut, [_hdc], [_hitpoint.x],[_hitpoint.y], _title, eax
invoke EndPaint, [hwnd], _ps
done: 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',\
gdi, 'GDI32.DLL',\
user,'USER32.DLL'
import kernel,\
GetModuleHandle,'GetModuleHandleA',\
ExitProcess,'ExitProcess',\
lstrlen, 'lstrlen'
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',\
EndPaint, 'EndPaint',\
InvalidateRect, 'InvalidateRect'
import gdi,\
TextOut, 'TextOutA'
;=============================================