`

VB 纯代码实现Timer控件的功能

    博客分类:
  • vb
阅读更多

本博客有一篇类似的文章《VB 中运用 TimeSetEvent 代替 Timer 控件》与这篇不同。
本篇展示了另外两种方法,具体如下文所示。

方法1:
  用这个类可以替代VB自带的Timer控件,这样就不用在无窗体的项目中仅为了使用Timer而多加一个窗体了。我一般用在ActiveX exe中用来分离系统控制权,用Timer的好处是避免控制权死锁,这样也就模拟出了多线程(实际上是多进程),能给用户更好的体验。代码如下:
标准模块(mTimer.bas)

Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Public TimerColl As New VBA.Collection

Public Sub TimeProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
Dim Timer As Timer, lpTimer As Long
lpTimer = TimerColl("ID:" & idEvent)
CopyMemory Timer, lpTimer,
4&
Timer.PulseTimer
CopyMemory Timer,
0&, 4&
End Sub


类模块(Timer.bas)

Option Explicit

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

Private
m_TimerID As Long
Private
m_Interval As Long
Private
m_Enabled As Boolean

Public
Tag As Variant
Public Event
Timer()

Public Property Get Interval() As Long
Interval = m_Interval
End Property

Public Property Let
Interval(ByVal Value As Long)
m_Interval = Value
Enabled = m_Enabled
End Property

Public Property Get
Enabled() As Boolean
Interval = m_Enabled
End Property

Public Property Let
Enabled(ByVal Value As Boolean)
If Value Then
m_Enabled = StartTimer
Else
Call
StopTimer
End If
End Property

Private Function
StartTimer() As Boolean
If
m_TimerID = 0 Then
If
m_Interval > 0 Then
m_TimerID = SetTimer(0, 0, m_Interval, AddressOf TimeProc)
If m_TimerID <> 0 Then
TimerColl.Add ObjPtr(Me), "ID:" & m_TimerID
StartTimer =
True
End If
Else
m_Enabled = True
End If
End If
End Function

Friend Sub
PulseTimer()
RaiseEvent Timer
End Sub

Private Sub
StopTimer()
If m_TimerID <> 0 Then
KillTimer 0, m_TimerID
TimerColl.Remove
"ID:" & m_TimerID
m_TimerID =
0
m_Enabled = False
End If
End Sub

Private Sub
Class_Terminate()
Call StopTimer
End Sub

使用方法:
Private WithEvents Timer1 As Timer
Private Sub Form_Load()
Set Timer1 = New TimerLib.Timer
Timer1.Interval =
1000
Timer1.Enabled = True
End Sub
Private Sub
Timer1_Timer()
Debug.Print Now
End Sub


方法2:
用SetTimer函数定义一个ID,并标志一个触发时间(以MS为单位)和回调函数地址.
当指定的触发时间到了,系统就会调用那个指定的回调函数,并以你在SetTimer时定义的ID为参数,这样就可以区别多个定时器了.
当不需要使用某个定时器时,就使用KillTimer函数把指定ID的定时器干掉就可以了.
窗体代码:

Option Explicit

Const GWL_WNDPROC = (-4)

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) 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

Private Sub
Form_Load()
glngFuncAdd = SetWindowLong(hWnd, GWL_WNDPROC,
AddressOf WndProc_TimerTest)
Call SetTimer(hWnd, TIMERID, 500, 0&)
End Sub

Private Sub
Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If glngFuncAdd > 0 Then Call SetWindowLong(hWnd, GWL_WNDPROC, glngFuncAdd)
Call KillTimer(hWnd, TIMERID)
End Sub


模块代码:

Option Explicit

Const WM_TIMER = &H113

Public Const TIMERID = &H100 '自定义Timer的ID号

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public
glngFuncAdd As Long

Public Function
WndProc_TimerTest(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If
wMsg = WM_TIMER Then
If
wParam = TIMERID Then
Debug.Print Timer
End If
End If

WndProc_TimerTest = CallWindowProc(glngFuncAdd, hWnd, wMsg, wParam, lParam)
End Function

 

分享到:
评论

相关推荐

    vb时钟代码制做代码控件

    首先,VB中的时钟功能主要依赖于Timer控件。Timer控件在设定的间隔(如1秒)内触发事件,我们可以利用这个事件来更新时钟的显示。在VB中,创建一个时钟控件的基本步骤如下: 1. **添加Timer控件**:打开VB项目,在...

    vb6_高精度Timer控件

    总的来说,"vb6_高精度Timer控件"是VB6开发者在处理高精度计时任务时的一个强大工具,通过API调用来克服内置Timer控件的精度限制,为应用程序带来了更精准的定时功能。在实际项目中,合理运用此控件,能够提升程序的...

    VBA中的timer控件

    VBA中大家都在被需要定时器的困扰,这个控件是从VB6中的timer控件输出的,可以在EXCEL里定时啦

    vb不用timer控件定时模块

    在VB(Visual Basic)编程中,我们经常使用Timer控件来实现定时功能,但有时由于特定的需求或环境限制,可能需要避免使用Timer控件。本模块介绍了一种方法,即如何在VB中创建一个自定义的定时器,不依赖于Timer控件...

    異步Timer Timer

    我们将深入探讨异步编程、VB(Visual Basic)中的Timer控件以及它们如何协同工作。 首先,异步编程是现代应用程序开发的核心,尤其是在多任务和UI(用户界面)响应性方面。在传统的同步编程中,代码会按顺序执行,...

    vb6.0实现定时器功能源代码

    这个“vb6.0实现定时器功能源代码”应该包含了一个简单的VB6程序,演示了如何利用Timer控件来实现定时触发的事件。 首先,我们需要了解VB6中的Timer控件。Timer控件并不像其他控件那样在用户界面上可见,它是一个...

    timer类代替VB自带控件

    在VB(Visual Basic)编程中,常常...VB自带的Timer控件简单易用,但对于复杂的定时任务,使用Timer类或API则能提供更强大的功能和更高的灵活性。在实际开发中,我们需要根据项目的需求来选择最适合的定时器实现方式。

    VB编写的小游戏,窗体透明、动态窗体显示、Timer控件应用等源代码

    【VB编写的小游戏,窗体透明、动态窗体显示、Timer控件应用等源代码】 在VB(Visual Basic)编程环境中,开发小游戏是一项常见的实践,它可以帮助初学者掌握基础编程概念,同时也能让有经验的开发者尝试实现更复杂...

    vb6.0用户自定义控件

    3. **动画效果**:为了增加交互性,可能会有按钮按下、释放时的动画效果,这需要控制定时器(Timer控件)并在每个时间间隔内更新控件的状态。 4. **属性和方法**:用户自定义控件通常会包含一些特殊的属性,如菜单...

    VB编写的利用控件的left和top属性实现控件上下左右移动的代码

    在VB(Visual Basic)编程环境中,控件的`Left`和`Top`属性是用于设置控件相对其容器(如Form或Panel)左边缘和上边缘的距离,通过改变这两个属性值,可以实现控件在界面上的位置变化。本篇文章将深入探讨如何利用`...

    用VB编写的小游戏代码(原创),有窗体透明、动态窗体显示、Timer控件应用等源代码

    3. **Timer控件应用**:Timer控件是VB中的一个重要组件,用于在指定的时间间隔内执行特定的代码块。在小游戏开发中,Timer控件通常用于控制游戏的帧率,更新游戏状态,或者处理定时事件,如计时器结束、角色移动等。...

    vb控件使用大全

    9. Timer控件:实现定时任务,例如每隔一定时间执行某个事件。 10. ActiveX控件:来自第三方的组件,如Flash Player,提供更丰富的功能。 在VB编程中,理解每个控件的属性是至关重要的。属性决定了控件的行为和外观...

    VB源码(TaskBar)控件停靠

    VB源码在这个上下文中意味着包含了实现该功能的具体代码,这可能包括类模块、标准模块或者窗体模块中的函数和过程。代码可能包含以下关键部分: 1. **控件创建**:定义一个自定义控件,继承自标准的VB控件,比如...

    timer控制的动画字幕程序,VB6.0源代码

    在VB6.0(Visual Basic 6.0)中,Timer控件是一个非常重要的工具,它可以在指定的时间间隔内触发事件,以此来实现一系列连续的动作,比如在屏幕上滚动文字、闪烁图像或播放动画等。这种技术广泛应用于多媒体软件、...

    VB设计,实现简单钟表功能

    以上就是使用VB6.0的Timer控件和Line控件数组实现简单钟表功能的详细过程。通过这样的实践,不仅可以加深对VB6.0控件的理解,还能锻炼到时间和角度计算的逻辑思维能力。在实际开发中,这样的技巧还可以应用到其他...

    VB单类模块Timer源码,可异步执行演示.rar

    使用方法和 vb 的Timer控件一样,只是增加了一个 AsynExecute 属性,当设置此属性 = true 的时候, Timer 是以异步的方式运行的, 比如,第 1 次timer事件代码未运行完,第2次就开始了,那么第1次事件代码将暂停,第 3 次.....

    WPF VB.net时钟,timer

    在VB.NET代码中,我们需要使用`System.Windows.Threading.DispatcherTimer`来实现计时功能。创建一个`DispatcherTimer`实例,设置间隔时间,然后设置事件处理程序更新UI。 ```vbnet Dim timer As New ...

    VB中在窗体中的控件各种移动方法

    4. **使用Timer控件实现动画效果** 如果希望平滑地移动控件,可以结合使用`Timer`控件和递增的偏移量。 源代码示例: ```vb Private moveOffset As Integer = 0 Private Sub MoveControl_Click() Timer1....

Global site tag (gtag.js) - Google Analytics