当前位置: 首页 > article >正文

win32汇编环境,窗口程序中使用滚动条控件的一般操作

;运行效果

;win32汇编环境,窗口程序中使用滚动条控件的一般操作
;展示窗口程序中如何设置水平滚动条与垂直滚动条,响应滚动条被点击,刻度即时变化等
;直接抄进RadAsm可编译运行。重点部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
include      windows.inc 
include      user32.inc 
includelib   user32.lib           
include      kernel32.inc 
includelib   kernel32.lib 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD       
                                                
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA                                   
ClassName           db "SimpleWinClass",0        
AppName             db "窗口程序的模版",0
szSBClassName       db "ScrollBar",0                ;滚动条类名        
szSTClassName       db "static",0                   ;静态控件类名
szSTCaption         db "0",0                   
.DATA?                                  
hInstance     HINSTANCE  ?                
CommandLine   LPSTR      ?  
hID_SCROLL01  dd         ?
hID_SCROLL02  dd         ? 
hID_VALUEC01  dd         ? 
hID_VALUEC02  dd         ? 
dwPos01       dd     ?
dwPos02       dd     ?                
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN     equ 1000    ;图标 
IDC_SCROLL01 equ 101
IDC_SCROLL02 equ 102
IDC_VALUE01  equ 201
IDC_VALUE02  equ 202 
.CODE                      

start:                      
invoke GetModuleHandle, NULL                                                    
mov hInstance,eax 
invoke GetCommandLine                                                                                       
mov CommandLine,eax 
invoke WinMain, hInstance,NULL,CommandLine, 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                     
        mov   wc.lpfnWndProc, OFFSET WndProc                        
        mov   wc.cbClsExtra,NULL 
        mov   wc.cbWndExtra,NULL 
        push  hInstance 
        pop   wc.hInstance 
        mov   wc.hbrBackground,COLOR_WINDOW+1 
        mov   wc.lpszMenuName,NULL 
        mov   wc.lpszClassName,OFFSET ClassName 
        invoke LoadIcon,NULL,IDI_APPLICATION                          
        mov   wc.hIcon,eax 
        mov   wc.hIconSm,eax 
        invoke LoadCursor,NULL,IDC_ARROW                              
        mov   wc.hCursor,eax 
        invoke RegisterClassEx, addr wc                              
        invoke CreateWindowEx,NULL, ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,100,100,320,380, 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 

        .if uMsg == WM_CREATE
                invoke CreateWindowEx,NULL,ADDR szSBClassName,NULL, WS_CHILDWINDOW+WS_VISIBLE+SBS_HORZ,20,20,250,20,hWnd,IDC_SCROLL01,NULL,NULL     ;创建水平滚动条                                                          
                mov hID_SCROLL01,eax 
                invoke CreateWindowEx,NULL,ADDR szSTClassName,ADDR szSTCaption, WS_CHILD + WS_VISIBLE,280, 20, 20, 20,hWnd,IDC_VALUE01,NULL,NULL    ;创建静态控件,用来显示刻度                                                             
                mov hID_VALUEC01,eax 
                
                invoke CreateWindowEx,NULL,ADDR szSBClassName,NULL, WS_CHILDWINDOW+WS_VISIBLE+SBS_VERT,130,60,20,250,hWnd,IDC_SCROLL02,NULL,NULL    ;创建垂直滚动条                                                              
                mov hID_SCROLL02,eax 
                invoke CreateWindowEx,NULL,ADDR szSTClassName,ADDR szSTCaption, WS_CHILD + WS_VISIBLE,135, 320, 20, 20,hWnd,IDC_VALUE02,NULL,NULL                                                               
                mov hID_VALUEC02,eax 
                
                invoke    SendDlgItemMessage,hWnd,IDC_SCROLL01,SBM_SETRANGE,0,100    ;初始化滚动条刻度为100个单位值
                invoke    SendDlgItemMessage,hWnd,IDC_SCROLL02,SBM_SETRANGE,0,100
    .elseif    uMsg ==    WM_HSCROLL                      ;水平滚动条被点击发生位置变化的消息发生了
            mov    eax,wParam
            .if    ax ==    SB_LINELEFT     ;向左滚动一个单位,即点一下箭头
                dec    dwPos01
            .elseif    ax ==    SB_LINERIGHT    ;向右滚动一个单位
                inc    dwPos01
            .elseif    ax ==    SB_PAGELEFT     ;按控件宽度向左滚动,即点一下空白处
                sub    dwPos01,10
            .elseif    ax ==    SB_PAGERIGHT    ;按控件宽度向右滚动
                add    dwPos01,10
            .elseif    ax ==    SB_THUMBPOSITION || ax == SB_THUMBTRACK    ;用户已拖动滚动框(拇指)并松开鼠标按钮或用户正在拖动滚动框
                mov    eax,wParam
                shr    eax,16          ;把eax右移16位,即去掉低16位,保留高16位的值。高16位的值是滚动框的当前位置值.因为如果低16位为SB_THUMBPOSITION 或 SB_THUMBTRACK时,高16位为当前位置值。但我们无法直接得到高16位,只能右移。右移后空出的位置是置0的。
                mov    dwPos01,eax
            .else
                mov    eax,TRUE
                ret
            .endif
            cmp    dwPos01,0       
            jge    @F                      ;当dwPos01大于或等于0时,@F,就是向下转移到最近的 @@ 处
            mov    dwPos01,0
            @@:
            cmp    dwPos01,100
            jle    @F                      ;当dwPos01小于或等于100时,则
            mov    dwPos01,100
            @@:
            invoke    SetDlgItemInt,hWnd,IDC_VALUE01,dwPos01,FALSE
            invoke    SendDlgItemMessage,hWnd,IDC_SCROLL01,SBM_SETPOS,dwPos01,TRUE 

            invoke  SetScrollPos,hID_SCROLL01,SB_HORZ,dwPos01,TRUE 
    .elseif    uMsg ==    WM_VSCROLL                     ;垂直滚动条被点击发生位置变化的消息发生了
            mov    eax,wParam
            .if    ax ==    SB_LINEUP
                dec    dwPos02
            .elseif    ax ==    SB_LINEDOWN
                inc    dwPos02
            .elseif    ax ==    SB_PAGEUP
                sub    dwPos02,10
            .elseif    ax ==    SB_PAGEDOWN
                add    dwPos02,10
            .elseif    ax ==    SB_THUMBPOSITION || ax == SB_THUMBTRACK
                mov    eax,wParam
                shr    eax,16
                mov    dwPos02,eax
            .else
                mov    eax,TRUE
                ret
            .endif
            cmp    dwPos02,0
            jge    @F
            mov    dwPos02,0
            @@:
            cmp    dwPos02,100
            jle    @F
            mov    dwPos02,100
            @@:
            invoke    SetDlgItemInt,hWnd,IDC_VALUE02,dwPos02,FALSE
            invoke    SendDlgItemMessage,hWnd,IDC_SCROLL02,SBM_SETPOS,dwPos02,TRUE 
        .elseif uMsg==WM_DESTROY                                           
                invoke PostQuitMessage,NULL                               
        .else 
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam             
        ret 
    .endif 
    xor eax,eax 
    ret 
WndProc endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start                                                      


http://www.kler.cn/a/526756.html

相关文章:

  • AI 模型优化与性能调优
  • 芯片AI深度实战:进阶篇之vim内verilog实时基于AST的自定义检视
  • springboot集成钉钉,发送钉钉日报
  • 【Block总结】高效多尺度注意力EMA,超越SE、CBAM、SA、CA等注意力|即插即用
  • RK3568 opencv播放视频
  • 第23节课:前端调试技巧—掌握浏览器开发者工具与性能优化
  • 理解PLT表和GOT表
  • 新春登蛇山:告别岁月,启航未来
  • LeetCode 0219.存在重复元素 II:哈希表
  • 【Leetcode刷题记录】166. 分数到小数
  • [EAI-022] FuSe,在VLA模型基础上,融合触觉和语音等异构模态信息
  • 动态规划两个数组dp问题系列一>最长公共子序列
  • 网站快速收录:利用RSS订阅提升效率
  • fpga系列 硬件:FPGA VITIS PS端HELLO WORLD在 ZYNQ EBAZ4203板上实现
  • ADC 精度 第二部分:总的未调整误差解析
  • 33333333333
  • Autogen_core 测试代码:test_cancellation.py
  • Electron工具Electron Fiddle
  • 【TypeScript】TypeScript 运算符
  • AI 的安全性与合规性:实践中的最佳安全策略