📄 tut18.html
字号:
hInstance,NULL</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov hwndProgress,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov eax,1000
; the lParam of PBM_SETRANGE message contains the range</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov CurrentStep,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
shl eax,16
; the high range is in the high word</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndProgress,PBM_SETRANGE,0,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndProgress,PBM_SETSTEP,10,0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke CreateStatusWindow,WS_CHILD+WS_VISIBLE,NULL,hWnd,IDC_STATUS</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov hwndStatus,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SetTimer,hWnd,IDC_TIMER,100,NULL
; create a timer</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov TimerID,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.elseif uMsg==WM_DESTROY</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke PostQuitMessage,NULL</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.if TimerID!=0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke KillTimer,hWnd,TimerID</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.endif</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.elseif uMsg==WM_TIMER ; when
a timer event occurs</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndProgress,PBM_STEPIT,0,0 ; step
up the progress in the progress bar</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
sub CurrentStep,10</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.if CurrentStep==0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke KillTimer,hWnd,TimerID</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov TimerID,0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndStatus,SB_SETTEXT,0,addr Message</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke MessageBox,hWnd,addr Message,addr AppName,MB_OK+MB_ICONINFORMATION</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndStatus,SB_SETTEXT,0,0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndProgress,PBM_SETPOS,0,0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.endif</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.else</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke DefWindowProc,hWnd,uMsg,wParam,lParam</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
ret</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.endif</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
xor eax,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
ret</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>WndProc
endp</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>end
start</font></font></font></b>
<h4>
<b><font face="Arial,Helvetica"><font color="#00CC00">Analysis:</font></font></b></h4>
<ul><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke ExitProcess,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke InitCommonControls</font></font></font></b></ul>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>I deliberately
put InitCommonControls after ExitProcess to demonstrate that InitCommonControls
is just there for putting a reference to comctl32.dll in the import section.
As you can see, the common controls work even if InitCommonControls doesn't
execute.</font></font></font>
<ul><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.if uMsg==WM_CREATE</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke CreateWindowEx,NULL,ADDR ProgressClass,NULL,\</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
WS_CHILD+WS_VISIBLE,100,\</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
200,300,20,hWnd,IDC_PROGRESS,\</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
hInstance,NULL</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov hwndProgress,eax</font></font></font></b></ul>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>Here is
where we create the common control. Note that this CreateWindowEx call
contains hWnd as the parent window handle. It also specifies a control
ID for identifying this control. However, since we have the control's window
handle, this ID is not used. All child window controls must have WS_CHILD
style.</font></font></font>
<ul><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov eax,1000</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov CurrentStep,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
shl eax,16</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndProgress,PBM_SETRANGE,0,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndProgress,PBM_SETSTEP,10,0</font></font></font></b></ul>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>After
the progress bar is created, we can set its range. The default range is
from 0 to 100. If you are not satisfied with it, you can specify your own
range with PBM_SETRANGE message. lParam of this message contains the range,
the maximum range is in the high word and the minimum one is in the low
word. You can specify how much a step takes by using PBM_SETSTEP message.
The example sets it to 10 which means that when you send a PBM_STEPIT message
to the progress bar, the progress indicator will rise by 10. You can also
set your own indicator level by sending PBM_SETPOS messages. This message
gives you tighter control over the progress bar.</font></font></font>
<ul><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke CreateStatusWindow,WS_CHILD+WS_VISIBLE,NULL,hWnd,IDC_STATUS</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov hwndStatus,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SetTimer,hWnd,IDC_TIMER,100,NULL
; create a timer</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov TimerID,eax</font></font></font></b></ul>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>Next,
we create a status bar by calling CreateStatusWindow. This call is easy
to understand so I'll not comment on it. After the status window is created,
we create a timer. In this example, we will update the progress bar at
a regular interval of 100 ms so we must create a timer control. Below is
the function prototype of SetTimer.</font></font></font>
<ul><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>SetTimer
PROTO hWnd:DWORD, TimerID:DWORD, TimeInterval:DWORD, lpTimerProc:DWORD</font></font></font></b></ul>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1><b>hWnd</b>
: Parent window handle</font></font></font>
<br><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1><b>TimerID</b>
: a nonzero timer identifier. You can create your own identifier.</font></font></font>
<br><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1><b>TimerInterval</b>
: the timer interval in milliseconds that must pass before the timer calls
the timer procedure or sends a WM_TIMER message</font></font></font>
<br><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1><b>lpTimerProc</b>
: the address of the timer function that will be called when the time interval
expires. If this parameter is NULL, the timer will send WM_TIMER message
to the parent window instead.</font></font></font><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1></font></font></font>
<p><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>If
this call is successful, it will return the TimerID. If it failed, it returns
0. This is why the timer identifer must be a nonzero value.</font></font></font>
<ul><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.elseif uMsg==WM_TIMER</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndProgress,PBM_STEPIT,0,0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
sub CurrentStep,10</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.if CurrentStep==0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke KillTimer,hWnd,TimerID</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
mov TimerID,0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndStatus,SB_SETTEXT,0,addr Message</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke MessageBox,hWnd,addr Message,addr AppName,MB_OK+MB_ICONINFORMATION</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndStatus,SB_SETTEXT,0,0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
invoke SendMessage,hwndProgress,PBM_SETPOS,0,0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>
.endif</font></font></font></b></ul>
<font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>When the
specified time interval expires, the timer sends a WM_TIMER message. You
will put your code that will be executed here. In this example, we update
the progress bar and then check if the maximum limit has been reached.
If it has, we kill the timer and then set the text in the status window
with SB_SETTEXT message. A message box is displayed and when the user clicks
OK, we clear the text in the status bar and the progress bar.</font></font></font>
<br>
<hr WIDTH="100%">
<center><b><font face="Arial,Helvetica"><font color="#FFFFFF"><font size=-1>[<a href="http://win32asm.cjb.net">Iczelion's
Win32 Assembly Homepage</a>]</font></font></font></b></center>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -