⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scroll.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 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 + -