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

news/2025/2/4 10:01:18/

;运行效果

;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                                                      


http://www.ppmy.cn/news/1569202.html

相关文章

LabVIEW 保存文件 生产者/消费者设计

LabVIEW 保存文件 生产者/消费者设计 简介生产消费模式设计结构 简介 主从模式的数据通信是利用全局变量、局域变量或共享变量实现的,由于这些变量的每次复制都是原始数据的一个副本,占据了大量的空间。实际上,只需要使用一部分缓冲区作为数…

政务行业审计文件大数据高速报送解决方案

随着信息技术的快速发展,电子政务迎来了新的升级浪潮。国家相继出台了一系列信息化发展战略规划,如《国家信息化发展战略纲要》、《“十三五”国家信息化规划》等,这些政策为政务信息化工作指明了方向。 然而,在实际操作中&#x…

学习ArkTS语言

文章目录 ArkTS初识ArkTS语言ArkTS语言介绍ArkTS编程规范从TypeScript到ArkTS的适配指导ArkTS高性能编程实践UI范式基本语法状态管理渲染控制 ArkTS ArkTS是HarmonyOS应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动…

分享10个实用的Python工具的源码,支持定制

1.音频处理工具 【免费】一个功能丰富的音频处理工具箱,支持音频格式转换、剪辑和音量调节等功能资源-CSDN文库 2.视频转换工具 【免费】一个简单易用的视频格式转换工具,支持多种常见视频格式之间的转换资源-CSDN文库 3.PDF工具箱 【免费】一个功能…

python leetcode 笔记

只为记录一些python相关的特殊写法 无穷大,无穷小,NAN float(inf), float(-inf), float(nan) 判断字符的类型 isdigit(x) isspace(x) 字符串拼接 /.join([a,b,c]) # a/b/c 格式转换,字符转整形 ord(a) # 97 chr(97) # a 进制转…

Ruby Dir 类和方法详解

Ruby Dir 类和方法详解 引言 在Ruby编程语言中,Dir类是一个非常有用的工具,它允许我们与文件系统进行交互,如列出目录内容、检查文件是否存在等。Dir类提供了多种方法,使得文件系统的操作变得简单且高效。本文将详细介绍Ruby中的…

Hive修复分区

Hive修复分区 简介 Hive的MSCK REPAIR TABLE命令用于修复(即添加丢失的)表分区。通常用于那些已在HDFS中存在,但尚未在Hive元数据中注册的分区。 当你在HDFS文件系统中手动添加或删除分区目录,Hive并不会自动识别这些更改。为同步…

强化学习、深度学习、深度强化学习的区别是什么?

前言 深度强化学习就是 深度学习 和 强化学习 的结合体。它让计算机程序(也就是智能体)在特定环境中不断尝试,从错误中学习,最终找到最优的行动策略。 深度学习是AlphaGo从棋谱里学习,强化学些Alphazero 学习规则&am…