在VB.NET中使用鼠标滚轮和Ctrl控制WinForms的缩放级别

问题描述:

如果我有一个winform,我可以知道如何控制应用程序中字体的缩放级别(以及显然的应用程序窗口本身)通过使用Ctrl +鼠标滚轮?我发现滚轮事件中有一个Delta,但不知道这是如何工作的。有没有我可以查看的代码示例?在VB.NET中使用鼠标滚轮和Ctrl控制WinForms的缩放级别

非常感谢所有的帮助!

您必须处理KeyDownKeyUp事件,以确定是否按住Ctrl键。此值应存储在类级别,因为除了KeyDownKeyUp事件之外,其他子例程都会使用此值。

然后您编写代码来处理表单的MouseWheel事件。向下滚动(朝向您)导致MouseEventArgsDelta属性为负值。向上滚动显然是相反的。三角洲属性的值始终是目前120

微软的原因值如下:

目前,120的值是一个制动器的标准。如果引入更高分辨率的鼠标,WHEEL_DELTA的定义可能会变小。大多数应用程序应检查积极或消极的价值,而不是总数。

在您的情况下,您只需检查Delta的符号并执行操作。

这是实现基本的 '缩放' 功能的示例代码:对

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 

阅读下列关于你的问题的更多信息:

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

非常感谢这样详细的答案!这就是我一直在寻找的一切! – AZhu 2011-03-02 14:46:33

+0

@ zhuanyi:我的快乐... – 2011-03-02 16:12:57

+0

只是一个问题,虽然...由于某种原因,我的代码似乎能够捕获鼠标移动,但没有按键和键部分,除非我使用鼠标点击表单第一......是预期的还是我只是在做一些愚蠢的事情? – AZhu 2011-03-02 19:27:24

我怀疑,你可以测试:

(VB.NET):

If (ModifierKeys And Keys.Control) = Keys.Control Then 

(C#):

if((ModifierKeys & Keys.Control) == Keys.Control) 

检查,如果控制键是下。