visual eventos evento winforms visual-studio-2008

winforms - eventos - evento mousemove en visual basic



¿Cómo detectar cuando el mouse deja el formulario? (4)

Al mirar la respuesta de aygunes.myopenid.com, hice esta versión en Vb.Net que recursiva agregando MouseLeaveHandlers a todos los controles en el formulario y luego uso el agradable Clientrectangle.Contains (pt) para verificar si mousecursor está activado o no. Trabajando como un encanto. Cred va a aygunes.myopenid.com.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load AddMouseLeaveHandlers() End Sub Sub AddMouseLeaveHandlers() For Each c As Control In Me.Controls HookItUp(c) Next AddHandler Me.MouseLeave, AddressOf CheckMouseLeave End Sub Sub HookItUp(ByVal c As Control) AddHandler c.MouseLeave, AddressOf CheckMouseLeave If c.HasChildren Then For Each f As Control In c.Controls HookItUp(f) Next End If End Sub Private Sub CheckMouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Dim pt As Point = PointToClient(Cursor.Position) If ClientRectangle.Contains(pt) = False Then MsgBox("Mouse left form") End If End Sub

Tengo un formulario con muchos controles sobre él. ¿Cómo puedo detectar cuándo el mouse deja el formulario? Intenté conectar un evento MouseLeave para cada control y formulario, pero eso no funciona porque esos eventos se disparan todo el tiempo cuando el mouse pasa sobre los controles. ¿Hay alguna manera de que realmente funcione?


La única forma confiable que conozco es un temporizador. Aquí hay un código de muestra que ajusta la opacidad en una renovación:

public partial class Form1 : Form { Timer timer1 = new Timer(); public Form1() { InitializeComponent(); this.Opacity = 0.10; timer1.Tick += new EventHandler(timer1_Tick); timer1.Interval = 200; timer1.Enabled = true; } void timer1_Tick(object sender, EventArgs e) { Point pos = Control.MousePosition; bool inForm = pos.X >= Left && pos.Y >= Top && pos.X < Right && pos.Y < Bottom; this.Opacity = inForm ? 0.99 : 0.10; } }


Deberías escuchar:

  • MouseDeje eventos de todos los controles del formulario
  • Evento MouseLeave del formulario

Simplemente enlace a sus oyentes con una función que verifique si el cursor está en los formularios cliente o no.

Prueba esto:

protected override void OnControlAdded(ControlEventArgs e) { SubscribeEvents(e.Control); base.OnControlAdded(e); } protected override void OnControlRemoved(ControlEventArgs e) { UnsubscribeEvents(e.Control); base.OnControlRemoved(e); } private void SubscribeEvents(Control control) { control.MouseLeave += new EventHandler(control_MouseLeave); control.ControlAdded += new ControlEventHandler(control_ControlAdded); control.ControlRemoved += new ControlEventHandler(control_ControlRemoved); foreach (Control innerControl in control.Controls) { SubscribeEvents(innerControl); } } private void UnsubscribeEvents(Control control) { control.MouseLeave -= new EventHandler(control_MouseLeave); control.ControlAdded -= new ControlEventHandler(control_ControlAdded); control.ControlRemoved -= new ControlEventHandler(control_ControlRemoved); foreach (Control innerControl in control.Controls) { UnsubscribeEvents(innerControl); } } private void control_ControlAdded(object sender, ControlEventArgs e) { SubscribeEvents(e.Control); } private void control_ControlRemoved(object sender, ControlEventArgs e) { UnsubscribeEvents(e.Control); } protected override void OnMouseLeave(EventArgs e) { CheckMouseLeave(); base.OnMouseLeave(e); } private void control_MouseLeave(object sender, EventArgs e) { CheckMouseLeave(); } private void CheckMouseLeave() { Point pt = PointToClient(Cursor.Position); if (ClientRectangle.Contains(pt) == false) { OnMouseLeftFrom(); } } private void OnMouseLeftFrom() { Console.WriteLine("Mouse left the form"); }


Pon esto en el cronómetro:

Si PointToClient (MousePosition) .X <Me.Size.Width YAdemás PointToClient (MousePosition) .X> -1 YAdemás PointToClient (MousePosition) .Y <Me.Size.Height AndAlso PointToClient (MousePosition) .Y> -1 Then

''El mouse está dentro del formulario

Más

''El mouse está fuera de la forma

Terminara si

- Por SNK