📄 scroll.asm
字号:
include .\head.inc
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
.data
ClassName db "ScrollClass",0
TitleName db "滚动条控件子窗口",0
ScrollBarClassName db "SCROLLBAR",0
CurrentPos UINT 0
StartValue UINT 1
EndValue UINT 255
dwLine UINT 1
dwPage UINT 10
Prompt db "现在位置是:",0
.data?
hInstance HINSTANCE ?
hwndScrollBar HWND ?
temp db 3 dup(' ')
.const
ID_SCROLLBAR equ 1
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, NULL,NULL,NULL, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
mov eax, hInstance
mov wc.hInstance,eax
invoke GetStockObject,WHITE_BRUSH
mov wc.hbrBackground,eax
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_ASTERISK
mov wc.hIcon,eax
mov wc.hIconSm,0
invoke LoadCursor,NULL,IDC_HAND
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_APPWINDOW,addr ClassName,\
addr TitleName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,300,\
NULL,NULL,hInst,NULL
mov hwnd,eax
invoke ShowWindow,hwnd,CmdShow
invoke UpdateWindow,hwnd
.while TRUE
invoke GetMessage, addr msg,NULL,0,0
.BREAK .if (!eax)
invoke TranslateMessage,addr msg
invoke DispatchMessage, addr msg
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
.if uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg==WM_CREATE
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR ScrollBarClassName,addr TitleName,\
WS_VISIBLE or WS_CHILD or WS_EX_WINDOWEDGE or SBS_HORZ ,\
100,40,200,25,hWnd,ID_SCROLLBAR,hInstance,NULL
mov hwndScrollBar,eax
invoke SetScrollRange,hwndScrollBar,SB_CTL,StartValue,EndValue,TRUE
.elseif uMsg==WM_KEYDOWN
mov eax,wParam
.if ax==VK_PGDN
invoke SendMessage,hWnd,WM_HSCROLL,SB_PAGERIGHT,hwndScrollBar
.elseif ax==VK_PGUP
invoke SendMessage,hWnd,WM_HSCROLL,SB_PAGELEFT,hwndScrollBar
.elseif ax==VK_LEFT
invoke SendMessage,hWnd,WM_HSCROLL,SB_LINELEFT,hwndScrollBar
.elseif ax==VK_RIGHT
invoke SendMessage,hWnd,WM_HSCROLL,SB_LINERIGHT,hwndScrollBar
.endif
.elseif uMsg==WM_HSCROLL
mov eax,hwndScrollBar
.if lParam==eax
mov eax,wParam
.if ax==SB_LINERIGHT
mov eax,dwLine
add CurrentPos,eax
.elseif ax==SB_LINELEFT
mov eax,dwLine
sub CurrentPos,eax
.elseif ax==SB_PAGELEFT
mov eax,dwPage
sub CurrentPos,eax
.if SIGN?
push StartValue
pop CurrentPos
.endif
.elseif ax==SB_PAGERIGHT
mov eax,dwPage
add CurrentPos,eax
.elseif ax==SB_THUMBTRACK
mov eax,wParam
shr eax,16
movzx eax,ax
mov CurrentPos, eax
.endif
mov eax,CurrentPos
.if eax>EndValue
push EndValue
pop CurrentPos
.endif
.if eax<StartValue
push StartValue
pop CurrentPos
.endif
invoke SetScrollPos,hwndScrollBar,SB_CTL,CurrentPos,TRUE
.endif
invoke dwtoa,CurrentPos,addr temp
invoke InvalidateRect,hWnd,NULL,TRUE
.elseif uMsg==WM_PAINT
invoke BeginPaint,hWnd,addr ps
mov hdc,eax
invoke lstrlen,addr Prompt
invoke TextOut,hdc,150,80,addr Prompt,eax
invoke lstrlen,addr temp
invoke TextOut,hdc,230,80,addr temp,eax
invoke EndPaint ,hWnd,addr ps
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -