📄 grid.asm
字号:
; ####################################################
; William F. Cravener 8/10/2003
; Grid a 32x32 pixel bitmap example
; ####################################################
.486
.model flat,stdcall
option casemap:none ; case sensitive
; ####################################################
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
; --------------------------------------------------------
ID_GRIDON equ 100
ID_GRIDOFF equ 200
ID_ZOOMIN equ 300
ID_ZOOMOUT equ 400
; --------------------------------------------------------
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY PROTO :DWORD,:DWORD
ZoomAdjust PROTO
; --------------------------------------------------------
.data
hInstance dd 0
hWnd dd 0
hBmp dd 0
hMenu dd 0
count dd 0
memDC1 dd 0
memDC2 dd 0
xyZoomFactor dd 8
xWorkSpace dd 0
yWorkSpace dd 0
xImage dd 32
yImage dd 32
GridOffOnFlag dd 0
szClassName db "GridClass",0
szDisplayName db "Grid a 32x32 pixel bitmap",0
; ###############################################################
.code
start:
invoke GetModuleHandle,0
mov hInstance,eax
invoke WinMain,hInstance,0,0,SW_SHOWDEFAULT
invoke ExitProcess,eax
; #########################################################################
WinMain proc hInst:DWORD, hPrevInst:DWORD, CmdLine:DWORD, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL Wwd:DWORD
LOCAL Wht:DWORD
LOCAL Wtx:DWORD
LOCAL Wty:DWORD
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,0
mov wc.cbWndExtra,0
mov eax,hInst
mov wc.hInstance,eax
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,0
mov wc.lpszClassName,OFFSET szClassName
invoke LoadIcon,hInst,500
mov wc.hIcon,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
mov wc.hIconSm,0
invoke RegisterClassEx,ADDR wc
mov Wwd,450
mov Wht,450
invoke GetSystemMetrics,SM_CXSCREEN
invoke TopXY,Wwd,eax
mov Wtx,eax
invoke GetSystemMetrics,SM_CYSCREEN
invoke TopXY,Wht,eax
mov Wty,eax
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax
invoke LoadMenu,hInstance,300
mov hMenu,eax
invoke SetMenu,hWnd,hMenu
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax,0
je ExitLoop
invoke TranslateMessage,ADDR msg
invoke DispatchMessage,ADDR msg
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
WinMain endp
; #########################################################################
WndProc proc hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
LOCAL hDC:DWORD
LOCAL memBmp:DWORD
LOCAL OldObj:DWORD
LOCAL rct:RECT
LOCAL ps:PAINTSTRUCT
.if uMsg == WM_COMMAND
.if wParam == ID_GRIDON
mov GridOffOnFlag,0
invoke InvalidateRect,hWin,0,FALSE
.elseif wParam == ID_GRIDOFF
mov GridOffOnFlag,1
invoke InvalidateRect,hWin,0,FALSE
.elseif wParam == ID_ZOOMIN
.if xyZoomFactor < 12
add xyZoomFactor,2
invoke ZoomAdjust
invoke GetClientRect,hWin,ADDR rct
invoke InvalidateRect,hWin,ADDR rct,TRUE
.endif
.elseif wParam == ID_ZOOMOUT
.if xyZoomFactor > 4
sub xyZoomFactor,2
invoke ZoomAdjust
invoke GetClientRect,hWin,ADDR rct
invoke InvalidateRect,hWin,ADDR rct,TRUE
.endif
.endif
.elseif uMsg == WM_CREATE
;--------------------------------------
;--------------------------------------
; Setup the bitmap resource for testing
;--------------------------------------
invoke LoadBitmap,hInstance,800
mov hBmp,eax
invoke GetDC,hWin
mov hDC,eax
invoke CreateCompatibleDC,hDC
mov memDC2,eax
invoke SelectObject,memDC2,hBmp
invoke ReleaseDC,hWin,hDC
invoke ZoomAdjust
.elseif uMsg == WM_PAINT
invoke BeginPaint,hWin,ADDR ps
mov hDC,eax
.if GridOffOnFlag == 0
;----------------------------------------
;----------------------------------------
; StretchBlt our bitmap to a workspace DC
;----------------------------------------
invoke CreateCompatibleDC,hDC
mov memDC1,eax
invoke CreateCompatibleBitmap,hDC,xWorkSpace,yWorkSpace
mov memBmp,eax
invoke SelectObject,memDC1,memBmp
mov OldObj,eax
invoke StretchBlt,memDC1,0,0,xWorkSpace,yWorkSpace,memDC2,0,0,xImage,yImage,SRCCOPY
;--------------------------------------------
;--------------------------------------------
; Now draw the grid lines on our workspace DC
; Do both vertical and horizontal grid lines
;--------------------------------------------
; We do vertical grid lines first
;--------------------------------
mov count,0
next1:
invoke PatBlt,memDC1,count,0,1,yWorkSpace,BLACKNESS
mov eax,xyZoomFactor
add count,eax
mov eax,xWorkSpace
cmp count,eax
jng next1
;---------------------------------
; Now do the horizontal grid lines
;---------------------------------
mov count,0
next2:
invoke PatBlt,memDC1,0,count,xWorkSpace,1,BLACKNESS
mov eax,xyZoomFactor
add count,eax
mov eax,xWorkSpace
cmp count,eax
jng next2
;----------------------------------
;----------------------------------
; Copy the results to our window DC
;----------------------------------
invoke BitBlt,hDC,0,0,xWorkSpace,yWorkSpace,memDC1,0,0,SRCCOPY
;------------------------
;------------------------
; Clean up before leaving
;------------------------
invoke SelectObject,memDC1,OldObj
invoke DeleteObject,memBmp
invoke DeleteDC,memDC1
.else
;------------------------------------
;------------------------------------
; Show the scaled bitmap without grid
;------------------------------------
invoke StretchBlt,hDC,0,0,xWorkSpace,yWorkSpace,memDC2,0,0,xImage,yImage,SRCCOPY
.endif
invoke EndPaint,hWin,ADDR ps
xor eax,eax
ret
.elseif uMsg == WM_CLOSE
.elseif uMsg == WM_DESTROY
invoke DeleteDC,memDC2
invoke PostQuitMessage,NULL
xor eax,eax
ret
.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
; ########################################################################
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim,1
shr wDim,1
mov eax,wDim
sub sDim,eax
mov eax,sDim
ret
TopXY endp
; ########################################################################
ZoomAdjust proc
push eax
push ecx
push edx
mov eax,xImage
mov ecx,xyZoomFactor
xor edx,edx
mul ecx
inc eax
mov xWorkSpace,eax
mov yWorkSpace,eax
pop edx
pop ecx
pop eax
ret
ZoomAdjust endp
; ########################################################################
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -