參考資訊:
https://masm32.com/board/index.php
https://www.nasm.us/xdoc/2.13rc9/html/nasmdoc0.html
當視窗的可視區域(如:300x300像素)小於顯示圖片大小(如:640x480像素)時,這時可以使用Windows視窗元件Scrollbar,用來做顯示位置調整的動作,Scrollbar元件有垂直和水平兩種方向並且提供視窗事件回報機制(WM_VSCROLL、WM_HSCROLL),因此,這裡的Scrollbar元件並不能夠自動幫忙做顯示位置調整的動作,取而代之的是,在收到WM_VSCROLL、WM_HSCROLL事件時,使用者必須自己決定哪些東西要顯示在視窗的可視區域上
main.asm
%include "head.asm"
segment .text
WndProc:
push ebp
mov ebp, esp
cmp dword [ebp + ARG2], WM_VSCROLL
je .handle_vscroll
cmp dword [ebp + ARG2], WM_CLOSE
je .handle_close
cmp dword [ebp + ARG2], WM_DESTROY
je .handle_destroy
jmp .handle_default
.handle_vscroll:
cmp word [ebp + ARG3], SB_LINEUP
je .handle_sb_line_up
cmp word [ebp + ARG3], SB_LINEDOWN
je .handle_sb_line_down
cmp word [ebp + ARG3], SB_PAGEUP
je .handle_sb_page_up
cmp word [ebp + ARG3], SB_PAGEDOWN
je .handle_sb_page_down
jmp .finish
.handle_sb_line_up:
push SLUP
push dword [ebp + ARG1]
call SetWindowText
jmp .finish
.handle_sb_line_down:
push SLDN
push dword [ebp + ARG1]
call SetWindowText
jmp .finish
.handle_sb_page_up:
push SPUP
push dword [ebp + ARG1]
call SetWindowText
jmp .finish
.handle_sb_page_down:
push SPDN
push dword [ebp + ARG1]
call SetWindowText
jmp .finish
.handle_close:
push dword [ebp + ARG1]
call DestroyWindow
xor eax, eax
jmp .finish
.handle_destroy:
push 0
call PostQuitMessage
xor eax, eax
jmp .finish
.handle_default:
push dword [ebp + ARG4]
push dword [ebp + ARG3]
push dword [ebp + ARG2]
push dword [ebp + ARG1]
push dword [pDefWndProc]
call CallWindowProc
.finish:
leave
ret 16
WinMain:
push ebp
mov ebp, esp
push 0
push 0
push 0
push 0
push 300
push 300
push 0
push 0
push WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_VSCROLL
push szAppName
push WC_DIALOG
push WS_EX_LEFT
call CreateWindowEx
mov [hWin], eax
push WndProc
push GWL_WNDPROC
push dword [hWin]
call SetWindowLong
mov [pDefWndProc], eax
push 0
push 100
push 0
push SB_VERT
push dword [hWin]
call SetScrollRange
push 1
push 50
push SB_VERT
push dword [hWin]
call SetScrollPos
.loop:
push 0
push 0
push 0
push msg
call GetMessage
cmp eax, 0
je .exit
push msg
call DispatchMessage
jmp .loop
.exit:
mov eax, [msg + MSG.wParam]
leave
ret 16
_start:
push 0
call GetModuleHandle
mov [hInstance], eax
call GetCommandLine
mov [pCommand], eax
push SW_SHOWNORMAL
push dword [pCommand]
push 0
push dword [hInstance]
call WinMain
push eax
call ExitProcess
Line 27~55:處理Scrollbar訊息並且顯示在視窗標題
Line 87:WS_VSCROLL是垂直的Scrollbar,WS_HSCROLL則是水平的Scrollbar
Line 100~105:設定Scrollbar最大的範圍
Line 107~111:設定Scrollbar目前的位置
完成