Tengo un formulario que contiene un Panel.
En un principio, este Panel es invisible y se vuelve visible cuando el mouse ingresa a su Área de Cliente.
El código que uso funciona siempre que no cambie el tamaño del formulario.
Al cambiar el tamaño del formulario, este código ya no funciona.
Probé este código:
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove Label1.Text = e.Location.ToString If e.Location.Y > 441 Then Panel1.Visible = True Else Panel1.Visible = False End If End SubDado que parece que este Panel está anclado en la parte inferior de su Formulario, puede considerar los Límites del Panel (el rectángulo que describe el área que ocupa un Control dentro de su contenedor) para determinar si la posición del Ratón está dentro de su Área de Cliente.
El método Rectangle.Contains(Point) devuelve True o False si un Point está contenido dentro de los límites del Rectangle especificado.
A continuación, puede utilizar el resultado booleano para establecer también la visibilidad del Panel:
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove Panel1.Visible = Panel1.Bounds.Contains(e.Location) End Sub adicional :
Cómo manejar otros casos comunes:
No puede agregar controladores de eventos a todos los controles en el formulario que puedan , en algún momento, estar involucrados en estas acciones. Los controles se pueden agregar, eliminar o mover en el diseñador. No factible.
En estos y otros casos similares, resulta útil implementar IMessageFilter .
Puede usar los métodos Application.AddMessageFilter / Application.RemoveMessageFilter para monitorear los mensajes dirigidos a cualquier Control antes de que se envíen al destino.
También puede evitar que los mensajes lleguen al destino, si es necesario, devolviendo True en el método IMessageFilter.PreFilterMessage() .
Aquí, la clase Form implementa IMessageFilter directamente. Por supuesto, puede crear una clase auxiliar reutilizable para hacer lo mismo.
Public Class SomeForm Implements IMessageFilter Private Const WM_MOUSEMOVE As Integer = &H200 Public Sub New() InitializeComponent() Application.AddMessageFilter(Me) End Sub Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs) Application.RemoveMessageFilter(Me) MyBase.OnFormClosed(e) End Sub Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage If m.Msg = WM_MOUSEMOVE Then Panel1.Visible = Panel1.RectangleToScreen(Panel1.ClientRectangle).Contains(MousePosition) End If Return False End Function End ClassPrueba esto:
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove Label1.Text = e.Location.ToString If eX > Panel1.Left And eX < Panel1.Left + Panel1.Width And eY > Panel1.Top And eY < Panel1.Top + Panel1.Height Then Panel1.Visible = True Else Panel1.Visible = False End If End Sub