2011-03-01 19 views

Respuesta

4

Vas a tener que controlar el evento KeyDown y KeyUp con el fin de determinar si o no Ctrl clave está siendo presionado. Este valor debe almacenarse a nivel de clase porque será utilizado por otras subrutinas además de los eventos KeyDown y KeyUp.

Luego, escribe el código para manejar el evento MouseWheel del formulario. Desplazarse hacia abajo (hacia usted) causa un valor negativo para la propiedad Delta del MouseEventArgs. Desplazarse hacia arriba es, obviamente, al revés. El valor de la propiedad Delta siempre es actualmente motivo 120.

de Microsoft para este valor es el siguiente:

Actualmente, un valor de 120 es el estándar para un fiador. Si se introducen ratones de mayor resolución, la definición de WHEEL_DELTA podría reducirse. La mayoría de las aplicaciones deben verificar un valor positivo o negativo en lugar de un total agregado.

En su contexto, solo comprobará la señal del Delta y realizará una acción.

Aquí hay un código de ejemplo la implementación básica 'zoom' funcionalidad:

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 

leer en el siguiente para obtener más información acerca de su pregunta:

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

¡Muchas gracias por su respuesta detallada! ¡Esto tiene todo lo que estaba buscando! – AZhu

+0

@zhuanyi: My Pleasure ... –

+0

Solo un problema ... por alguna razón mi código parece ser capaz de capturar los movimientos del mouse pero no la tecla abajo y la parte de la tecla a menos que use el mouse para hacer clic en el formulario primero ... ¿eso es lo esperado o simplemente estoy haciendo algo tonto? – AZhu

4

sospecho que puede simplemente prueba:

(VB.NET):

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

(C#):

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

permite comprobar si la clave es el control abajo.

Cuestiones relacionadas