參考資訊:
http://www.winprog.org/tutorial/
http://winapi.freetechsecrets.com/win32/
https://github.com/gammasoft71/Examples_Win32
http://masm32.com/board/index.php?topic=3584.0
https://learn.microsoft.com/en-us/windows/win32/winmsg/window-styles
Windows的Timer中斷週期是基於早期系統架構,因此,最短的Timer時間間隔為15ms,因此,即使Timer設定為1ms,觸發時間依舊為15ms
main.s
.include "head.inc"
.text
WndProc:
push { r4, lr }
ldr r4, =WM_TIMER
cmp r1, r4
beq handle_timer
cmp r1, #WM_CLOSE
beq handle_close
cmp r1, #WM_DESTROY
beq handle_destroy
b handle_default
handle_timer:
push { r0 }
ldr r0, =dwCnt
ldr r2, [r0]
add r2, #1
str r2, [r0]
ldr r1, =FMT_TIMER
ldr r0, =pBuf
bl sprintf
ldr r1, =pBuf
pop { r0 }
bl SetWindowTextA
eor r0, r0
b finish
handle_close:
bl DestroyWindow
eor r0, r0
b finish
handle_destroy:
mov r1, #1
bl KillTimer
ldr r0, =0
bl PostQuitMessage
eor r0, r0
b finish
handle_default:
push { r3 }
mov r3, r2
mov r2, r1
mov r1, r0
ldr r0, =pDefWndProc
ldr r0, [r0]
bl CallWindowProcA
add sp, sp, #4
b finish
finish:
pop { r4, pc }
WinMain:
push { lr }
ldr r3, =0
ldr r2, =0
ldr r1, =0
ldr r0, =0
push { r0, r1, r2, r3 }
ldr r3, =300
ldr r2, =300
ldr r1, =0
ldr r0, =0
push { r0, r1, r2, r3 }
ldr r3, =WS_OVERLAPPEDWINDOW | WS_VISIBLE
ldr r2, =szAppName
ldr r1, =WC_DIALOG
ldr r0, =WS_EX_LEFT
bl CreateWindowExA
add sp, sp, #32
ldr r1, =hWin
str r0, [r1]
ldr r2, =WndProc
ldr r1, =GWL_WNDPROC
bl SetWindowLongA
ldr r1, =pDefWndProc
str r0, [r1]
mov r3, #0
mov r2, #1000
mov r1, #1
ldr r0, =hWin
ldr r0, [r0]
bl SetTimer
loop:
ldr r3, =0
ldr r2, =0
ldr r1, =0
ldr r0, =szMsg
bl GetMessageA
cmp r0, #0
beq exit
ldr r0, =szMsg
bl DispatchMessageA
b loop
exit:
mov r0, #0
bl ExitProcess
pop { pc }
Line 15~27:累加數值並且顯示在視窗標題
Line 37~38:不使用Timer,記得關閉Timer
Line 87~92:設定Timer為每秒(1000ms)觸發一次,ID=1
編譯、執行
$ winegcc main.s -o main $ wine ./main.exe