📄 winproc.asm
字号:
WndProc proto :HWND, :UINT, :WPARAM, :LPARAM
WndProc proc uses edx edi esi hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local hdc: HDC
local ps: PAINTSTRUCT
local rect: RECT
local count: BYTE
.IF uMsg == WM_DESTROY
invoke DeleteObject, hBufferBitmap
invoke DeleteObject, hFillBrush
invoke DeleteObject, hBackBrush
invoke DeleteObject, hMoveShapeBrush
invoke DeleteObject, hStopShapeBrush
invoke DeleteObject, hShapePen
invoke KillTimer, hWnd, ID_TIMER
invoke PostQuitMessage, NULL
.ELSEIF uMsg == WM_CREATE
mov GameStatus, IS_STOP
invoke SetTimer, hWnd, ID_TIMER, 1, NULL
invoke LoadAccelerators, hInstance, IDA_MAIN
mov hAccelerator, eax
call SetMenuStatus
.ELSEIF uMsg == WM_TIMER
.IF GameStatus == IS_START
invoke GetTickCount
mov edx, 9
sub edx, gLevel
shl edx, 6
sub eax, dwStart
.IF eax > edx
inc NextKind
and NextKind, 3
invoke GetTickCount
mov dwStart, eax
invoke PostMessage, hWnd, WM_COMMAND, IDM_DOWN, 0
.ENDIF
.ENDIF
.ELSEIF uMsg == WM_PAINT
invoke BeginPaint, hWnd, ADDR ps
mov hdc, eax
invoke GetClientRect, hWnd, ADDR rect
invoke DrawBlockFrame, hdc, rect
invoke EndPaint,hWnd, ADDR ps
.ELSEIF uMsg == WM_COMMAND
mov eax, wParam
.IF ax == IDM_START
.IF GameStatus != IS_PAUSE
mov ShapeX, 6
mov ShapeY, 1
invoke GetTickCount
and eax, 7
mov SelectShape, al
inc al
and al, 7
mov NextShape, al
mov SelectKind, 0
mov NextKind, 0
mov gLevel, 1
mov gGrade, 0
xor edi, edi
.WHILE edi < 24*2
mov [BlockBoard+edi], IC_BOARDBORDER
add edi, 2
.ENDW
mov [BlockBoard+edi], IC_BOARDBOTTOM
mov [BlockBoard+edi+2], IC_BOARDBOTTOM
.ENDIF
mov GameStatus, IS_START
invoke GetTickCount
mov dwStart, eax
call SetMenuStatus
invoke InvalidateRect, hWnd, NULL, 0
.ELSEIF ax == IDM_STOP
mov GameStatus, IS_STOP
call SetMenuStatus
.ELSEIF ax == IDM_PAUSE
mov GameStatus, IS_PAUSE
call SetMenuStatus
.ELSEIF ax == IDM_LEFT
.IF GameStatus == IS_START
inc ShapeX
call CheckMovable
.IF eax == 0
dec ShapeX
.ENDIF
invoke InvalidateRect, hWnd, NULL, 0
.ENDIF
.ELSEIF ax == IDM_RIGHT
.IF ShapeX > 0 && GameStatus == IS_START
dec ShapeX
call CheckMovable
.IF eax == 0
inc ShapeX
.ENDIF
invoke InvalidateRect, hWnd, NULL, 0
.ENDIF
.ELSEIF ax == IDM_DOWN
.IF GameStatus == IS_START
inc ShapeY
call CheckMovable
.IF eax == 0
dec ShapeY
.IF ShapeY <= 4
mov GameStatus, IS_STOP
call SetMenuStatus
invoke MessageBox, hWnd, addr lpGameOver, addr szCaptionMain, MB_OK
.ELSE
call StepMoveEnd
.ENDIF
.ENDIF
invoke InvalidateRect, hWnd, NULL, 0
.ENDIF
.ELSEIF ax == IDM_TURN
.IF GameStatus == IS_START
inc SelectKind
and SelectKind, 3
call CheckMovable
.IF eax == 0
dec SelectKind
.IF SIGN?
mov SelectKind, 3
.ENDIF
.ENDIF
invoke InvalidateRect, hWnd, NULL, 0
.ENDIF
.ELSEIF ax == IDM_EXIT
invoke DestroyWindow, hWnd
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -