devxlogo

Create Automatic Hourglass Cursors

Create Automatic Hourglass Cursors

If you create an ActiveX control that uses a custom MousePointer property, place the control on a form, and at run time change the Screen.MousePointer property to an hourglass. You’ll see that the mouse pointer reverts to the ActiveX control’s custom cursor while over the control.

I discovered this when I created an ActiveX control that appeared as a hyperlink and could be placed on a VB form. I changed the MousePointer for the control to a pointing hand cursor, similar to the cursor in Internet Explorer. When I used the control in a project, the control’s Click event changed the screen’s MousePointer to an hourglass, but this had no effect while the mouse was over the ActiveX control.

To prevent this inconsistency, disable the form when you show the hourglass, but enable it when the hourglass is turned off. While the form is disabled, the MousePointer property of the ActiveX control no longer takes precedence over the Screen.MousePointer property. Use this generic clsHourglass class module to change the mouse pointer and disable the current window:

 Option Explicit	Private mintOldPointer As Integer	Private mlngHwnd As Long	Private Declare Function EnableWindow Lib "user32" _		(ByVal hWnd As Long, ByVal fEnable As Long) As Long	Private Sub Class_Initialize()		On Error Resume Next		'  Save current mouse pointer		mintOldPointer = Screen.MousePointer		'  Change to hourglass		Screen.MousePointer = vbHourglass		'  Save the window handle and disable the 		'  current window.		mlngHwnd = Screen.ActiveForm.hWnd		EnableWindow mlngHwnd, 0		DoEvents	End Sub	Private Sub Class_Terminate()		On Error Resume Next		'  Set pointer to old pointer		Screen.MousePointer = mintOldPointer		'  Enable the previously visible window		EnableWindow mlngHwnd, 1	End Sub

Now, instead of explicitly changing the mouse pointer to an hourglass and back and manually disabling and re-enabling forms, use this code at the beginning of your event procedures:

 	Dim objHourglass as clsHourglass	Set objHourglass = New clsHourglass

With this approach, the Initialize event changes the mouse pointer to an hourglass and disables the current form when the procedure creates the objHourglass. The hourglass can’t accidentally be left on because when the objHourglass variable loses scope, the Terminate event fires, which returns the mouse pointer to its original state and re-enables the form if it’s still loaded.

By using the EnableWindow API call, you can’t reload a form accidentally if it was unloaded during the time the objHourglass object had life. That could happen if you used the syntax “frmCurrent.Enabled = True”. Multiple instances of objHourglass won’t cause the mouse pointer to flicker, because the mouse pointer’s current state is checked and saved before setting it to an hourglass.

If the user keeps clicking on the form while the hourglass is shown, the extra clicks are discarded because the form isn’t enabled. And unlike earlier versions of VB, a form doesn’t deactivate when disabled, so the title bar doesn’t flicker.

devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist