;运行效果
;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