Other Tips All Tips By Date By Subject
API (33) Bit Manipulation (3) Clipboard (3) Combo Box (5) Desktop (3) GDI (13) Graphics (13) Internet (2) Interprocess Comms (3) Keyboard (2) Mouse (1) Shell (1) Sprites (1) Subclassing (3) Text Box (2) Windows (11) Windows Controls (10)
Submit
|
This tip shows you how to ensure a cursor remains within a certain rectangle on the screen.
Note that if the user uses Alt-Tab to switch to another application, the clipping cursor is
cleared.
Start a new project in VB. Add a new module, and add the following code:
' API Declarations:
Private Type POINTAPI
    X As Long
    Y As Long
End Type
Private Type RECT
    eft As Long
    op As Long
    ight As Long
    ottom As Long
End Type
Private Declare Sub ClipCursorRect Lib "user32" Alias "ClipCursor" (lpRect As RECT)
Private Declare Sub ClipCursorClear Lib "user32" Alias "ClipCursor" (ByVal lpRect As Long)
Private Declare Function ClientToScreen Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
Public Sub RestrictCursor( _
        ByVal lLeft As Long, _
        ByVal lTop As Long, _
        ByVal lWidth As Long, _
        ByVal lHeight As Long, _
        Optional ByRef oPositionTo As Object = Nothing _
    )
Dim tR As RECT
Dim tP As POINTAPI
   
   
' Convert positions into a rectangle in pixels:
    tR.Left = lLeft \ Screen.TwipsPerPixelX
    tR.Top = lTop \ Screen.TwipsPerPixelY
    tR.Right = (lLeft + lWidth) \ Screen.TwipsPerPixelX
    tR.Bottom = (lLeft + lHeight) \ Screen.TwipsPerPixelY
   
   
' Validate optional parameter:
    If oPositionTo Is Nothing Then Set oPositionTo = Screen
   
' If positions refer to an form or control, then
   
' convert the coordinates to the screen position:
    If Not oPositionTo Is Screen Then
        tP.X = tR.Left
        tP.Y = tR.Top
        ClientToScreen oPositionTo.hWnd, tP
        tR.Left = tP.X
        tR.Top = tP.Y
        tP.X = tR.Right
        tP.Y = tR.Bottom
        ClientToScreen oPositionTo.hWnd, tP
        tR.Right = tP.X
        tR.Bottom = tP.Y
    End If
   
   
' Set the cursor clipping rectangle:
    ClipCursorRect tR
   
End Sub
Public Sub ClearRestrictCursor()
    ClipCursorClear 0
End Sub
Now you can create a test project. Add a Picture Box to the form in your project, and
draw a Check Box inside the Picture Box (note: you must put the check box inside the
picture otherwise you won't be able to get at it whilst the cursor is being restricted!).
Add the following code to the Check box click event:
Private Sub Check1_Click()
    If (Check1.Value = Checked) Then
       
' Restrict the cursor so it can't move
       
' out of the picture:
        RestrictCursor 0, 0, Picture1.Width, Picture1.Height, Picture1
    Else
       
' Stop restricting the cursor:
        ClearRestrictCursor
    End If
End Sub
Run the project. You will find that when you click the Check Box you can't move the mouse pointer
outside the Picture Box.
|