欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > win32汇编环境,窗口程序中使用进度条控件

win32汇编环境,窗口程序中使用进度条控件

2025/2/6 4:44:03 来源:https://blog.csdn.net/iltokyo/article/details/145429385  浏览:    关键词:win32汇编环境,窗口程序中使用进度条控件

;运行效果

;win32汇编环境,窗口程序中使用进度条控件
;进度条控件主要涉及的是长度单位,每步步长,推进的时间。
;比如你的长度是1000,步长是100,每秒走1次,则10秒走完全程
;比如你的长度是1000,步长是10,每秒走1次,则100秒走完全程,但每格格子的长度与上面一样
;以下例子设置为2条进度条,通过比较,可以理解其原理。
;下面为asm文件,将代码复制进RadASM里面可以直接编译
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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 
szPGClassName       db "msctls_progress32",0                ;进度条类名        

.DATA?                                  
hInstance     HINSTANCE  ?                
CommandLine   LPSTR      ?  
hID_PG01      dd         ?     ;进度条控件句柄
hID_PG02      dd         ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                
; Equ 等值定义
IDC_PGL01          equ 101     ;进度条控件标识符
IDC_PGL02          equ 102

ID_TIMER1          equ   1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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,250,200, 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 szPGClassName,NULL, WS_CHILDWINDOW+WS_VISIBLE,20,40,192,30,hWnd,IDC_PGL01,NULL,NULL     ;创建进度条,192这个值是试出来的,大概刚刚好走完10格的样子
                mov hID_PG01,eax
                invoke CreateWindowEx,NULL,ADDR szPGClassName,NULL, WS_CHILDWINDOW+WS_VISIBLE,20,100,192,30,hWnd,IDC_PGL02,NULL,NULL     
                mov hID_PG02,eax

                invoke    SendDlgItemMessage,hWnd,IDC_PGL01,PBM_SETRANGE32,0,1000             ;设置进度条的最小值为0,最大值为100.这个值设置的大小与单位时间相关。
                invoke    SendDlgItemMessage,hWnd,IDC_PGL01,PBM_SETSTEP,100,0                 ;设置进度条每次步进的增量为10
                
                invoke    SendDlgItemMessage,hWnd,IDC_PGL02,PBM_SETBARCOLOR,0,16711935        ;设进度条格子颜色为绿色,16711935是红色。这个值是RGB的值转化为10进制后的。不设的话默认是蓝色  
                invoke    SendDlgItemMessage,hWnd,IDC_PGL02,PBM_SETRANGE32,0,1000      
                invoke    SendDlgItemMessage,hWnd,IDC_PGL02,PBM_SETSTEP,10,0  
                
                invoke    SetTimer,hWnd,ID_TIMER1,1000,NULL                                   ;设定时器,1000即1秒
        .elseif uMsg == WM_TIMER     ;处理定时器消息
                mov     eax,wParam
                .if     eax == ID_TIMER1
                        invoke    SendDlgItemMessage,hWnd,IDC_PGL01,PBM_STEPIT,0,0            ;每秒走1格
                        invoke    SendDlgItemMessage,hWnd,IDC_PGL02,PBM_STEPIT,0,0            ;10秒走1格,因为步长不一样 
                .endif           
        .elseif uMsg==WM_DESTROY                                           
                invoke PostQuitMessage,NULL                               
        .else 
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam             
        ret 
    .endif 
    xor eax,eax 
    ret 
WndProc endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start                                                      

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com