Search code examples
vb.netwinformsscrollzoomingctrl

Control zoom level of WinForms using mouse scroll wheel and Ctrl in VB.NET


If I have a winform, may I know how can I control the zoom level of the font in the application (as well as the application window itself obviously) by using Ctrl + Mouse Scroll Wheel? I see there is a Delta in the Scroll Wheel event, but not sure how that works. Is there any code sample that I can look into?


Solution

  • You'll have to handle the KeyDown and KeyUp event in order to determine whether or not Ctrl key is being held down. This value should be stored at class-level because it will be used by other subroutines besides the KeyDown and KeyUp events.

    You then write code to handle the form's MouseWheel event. Scrolling downwards (towards you) causes a negative value for the Delta property of the MouseEventArgs. Scrolling upwards is obviously the reverse. The value of the Delta property is always currently 120.

    Microsoft's reason for this value is as follows:

    Currently, a value of 120 is the standard for one detent. If higher resolution mice are introduced, the definition of WHEEL_DELTA might become smaller. Most applications should check for a positive or negative value rather than an aggregate total.

    In your context you'll just check for the sign of the Delta and perform an action.

    Here is a sample code implementing basic 'zoom' functionality:

    Public Class Form1
        Enum ZoomDirection
            None
            Up
            Down
        End Enum
    
        Dim CtrlIsDown As Boolean
        Dim ZoomValue As Integer
    
        Sub New()
    
            ' This call is required by the designer.
            InitializeComponent()
    
            ' Add any initialization after the InitializeComponent() call.
            ZoomValue = 100
        End Sub
    
        Private Sub Form1_KeyDown_KeyUp(ByVal sender As Object, _
                                        ByVal e As KeyEventArgs) _
                    Handles Me.KeyDown, Me.KeyUp
    
            CtrlIsDown = e.Control
        End Sub
    
        Private Sub Form1_MouseWheel(ByVal sender As Object, 
                                     ByVal e As MouseEventArgs) _
                    Handles Me.MouseWheel
    
            'check if control is being held down
            If CtrlIsDown Then
                'evaluate the delta's sign and call the appropriate zoom command
                Select Case Math.Sign(e.Delta)
                    Case Is < 0
                        Zoom(ZoomDirection.Down)
                    Case Is > 0
                        Zoom(ZoomDirection.Up)
                    Case Else
                        Zoom(ZoomDirection.None)
                End Select
            End If
        End Sub
    
        Private Sub Zoom(ByVal direction As ZoomDirection)
            'change the zoom value based on the direction passed
    
            Select Case direction
                Case ZoomDirection.Up
                    ZoomValue += 1
                Case ZoomDirection.Down
                    ZoomValue -= 1
                Case Else
                    'do nothing
            End Select
    
            Me.Text = ZoomValue.ToString()
        End Sub
    End Class
    

    Read on the following for more information about your question:

    1. MSDN: Control.KeyDown Event
    2. MSDN: Control.KeyUp Event
    3. MSDN: Control.MouseWheel Event
    4. MSDN: MouseEventArgs Class