【问题标题】:Control zoom level of WinForms using mouse scroll wheel and Ctrl in VB.NET在 VB.NET 中使用鼠标滚轮和 Ctrl 控制 WinForms 的缩放级别
【发布时间】:2011-07-06 04:50:01
【问题描述】:

如果我有一个 winform,我可以知道如何使用 Ctrl + 鼠标滚轮来控制应用程序中字体的缩放级别(当然还有应用程序窗口本身)?我看到 Scroll Wheel 事件中有一个 Delta,但不确定它是如何工作的。有没有我可以查看的代码示例?

【问题讨论】:

    标签: vb.net winforms scroll zooming ctrl


    【解决方案1】:

    对于 CrystalReportViewer1

    只要放 CrystalReportViewer1.Zoom(ZoomValue) 而不是 Sub Zoom 中的 Me.Text = ZoomValue.ToString() 行

    【讨论】:

    • OP 的问题与 CrystalReport 无关。也许这是一个很好的答案,但不是这个问题。
    【解决方案2】:

    我怀疑你可以测试一下:

    (VB.NET):

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

    (C#):

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

    检查控制键是否按下。

    【讨论】:

    【解决方案3】:

    您必须处理KeyDownKeyUp 事件才能确定Ctrl 键是否被按住。该值应存储在类级别,因为除了KeyDownKeyUp 事件之外的其他子例程将使用它。

    然后您编写代码来处理表单的MouseWheel 事件。向下滚动(朝向您)会导致MouseEventArgsDelta 属性为负值。向上滚动显然是相反的。 Delta 属性的值当前始终为 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

    【讨论】:

    • 非常感谢您提供如此详细的回答!这里有我想要的一切!
    • 只是一个问题...由于某种原因,我的代码似乎能够捕获鼠标移动,但不能捕获键向下和向上键部分,除非我首先使用鼠标单击表单。 ..这是预期的还是我只是在做一些愚蠢的事情?
    • 顺便说一句,对不起,我还没有足够的声誉来投票这个答案,如果可以的话,我会这样做!
    • @zhuanyi:对不起,我完全忘记了。只需将表单的KeyPreview 属性设置为True
    • 就在 CtrlIsDown = e.Control 之前?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2016-04-20
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多