742
社区成员
发帖
与我相关
我的任务
分享
Option Explicit
'* ******************************************** *
'* 模块名称:Timer.cls
'* 功能:在VB类模块中使用计时器
'* 作者:lyserver
'* ******************************************** *
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, _
Source As Any, ByVal Length As Long)
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Dim m_idTimer As Long
Dim m_Enabled As Boolean
Dim m_Interval As Long
Private Sub Class_Initialize()
m_Interval = 0
End Sub
Private Sub Class_Terminate()
If m_idTimer <> 0 Then KillTimer 0, m_idTimer
End Sub
Public Property Get Interval() As Long
Interval = m_Interval
End Property
Public Property Let Interval(ByVal New_Value As Long)
If New_Value >= 0 Then m_Interval = New_Value
End Property
Public Property Get Enabled() As Boolean
Enabled = m_Enabled
End Property
Public Property Let Enabled(ByVal New_Value As Boolean)
m_Enabled = New_Value
If m_idTimer <> 0 Then KillTimer 0, m_idTimer
If New_Value And m_Interval > 0 Then
m_idTimer = SetTimer(0, 0, m_Interval, GetFuncAddr(8))
End If
End Property
Private Function GetFuncAddr(ByVal IndexOfFunc As Long) As Long
Static AsmCode(33) As Byte
Dim pThis As Long, pVtbl As Long, pFunc As Long
pThis = ObjPtr(Me)
CopyMemory pVtbl, ByVal pThis, 4
CopyMemory pFunc, ByVal pVtbl + (6 + IndexOfFunc) * 4, 4
AsmCode(0) = &H55
AsmCode(1) = &H8B: AsmCode(2) = &HEC
CopyMemory AsmCode(3), &H1475FF, 3
CopyMemory AsmCode(6), &H1075FF, 3
CopyMemory AsmCode(9), &HC75FF, 3
CopyMemory AsmCode(12), &H875FF, 3
AsmCode(15) = &HB9
CopyMemory AsmCode(16), pThis, 4
AsmCode(20) = &H51
AsmCode(21) = &HE8
CopyMemory AsmCode(22), pFunc - VarPtr(AsmCode(21)) - 5, 4
AsmCode(26) = &H8B: AsmCode(27) = &HE5
AsmCode(28) = &H5D
AsmCode(29) = &HC2
CopyMemory AsmCode(30), 16, 4
GetFuncAddr = VarPtr(AsmCode(0))
End Function
Private Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
Debug.Print "类模板中的计时器:", uMsg, idEvent, dwTime
End Sub
Dim m_tm As Timer
Private Sub Form_Load()
Set m_tm = New Timer
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set m_tm = Nothing
End Sub
Private Sub Command1_Click()
m_tm.Interval = 1000
m_tm.Enabled = True
End Sub
Private Sub Command2_Click()
m_tm.Enabled = False
End Sub
Dim m_tm As Timer
Private Sub Form_Load()
Set m_tm = New Timer
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set m_tm = Nothing
End Sub
Private Sub Command1_Click()
m_tm.Interval = 1000
m_tm.Enabled = True
End Sub
Private Sub Command2_Click()
m_tm.Enabled = False
End Sub