what visual net form eventos event down c# winforms user-controls mouse

c# - visual - what is mousedown event



Winform: determina si el mouse ha dejado el control del usuario (4)

Estoy luchando con algo que creo que debería ser fácil (ish). Tengo un formulario de Windows y un panel flowgridlayout en la parte inferior del formulario. Dentro de este formulario lo lleno dinámicamente con un número X de controles de usuario. Los controles son todos del mismo tipo.

El objetivo es cuando el usuario mueve el mouse sobre el control del usuario, abre otro formulario y lo coloca donde está el mouse. Cuando el mouse sale del formulario, la forma abierta desaparece.

Esto casi funciona genial. El problema es cuando el Control de usuario tiene algo así como una etiqueta o cuadro de texto dentro. Se considera que abandonó el CU por lo que la forma desaparece.

Mi pensamiento fue utilizar las X e Y para decir si está dentro de la UC, pero no puedo resolverlo.

Puedo preguntar:

1) ¿Cuál es el mejor enfoque para esto? 2) ¿Cómo puedo codificarlo, ya que las CU son dinámicas? No sé exactamente dónde estarán.

Gracias

EDITAR

Estoy tratando de descubrir los punteros del mouse pero no llegar allí. El código siguiente está dentro del evento UC SmallTagBox_MouseLeave:

Point loc = this.Location; Point p = this.PointToScreen(this.Location); Point p2 = this.PointToScreen(this.Parent.Location); Point ms = MousePosition; Rectangle screenBounds = new Rectangle(this.PointToScreen(this.Location), this.Size); if (!screenBounds.Contains(ms)) { thw.Close(); thw = null; }

  • loc {X = 275 Y = 3} System.Drawing.Point
  • p {X = 808 Y = 908} System.Drawing.Point
  • p {X = 808 Y = 908} System.Drawing.Point
  • p2 {X = 545 Y = 1542} System.Drawing.Point
  • ms {X = 574 Y = 914} System.Drawing.Point
  • screenBounds {X = 808 Y = 908 Ancho = 62 Altura = 29} System.Drawing.Rectangle

No entiendo cómo p2 (su padre) puede tener un mayor valor Y en relación con la pantalla.


Creo que debería agregar un controlador de eventos para MouseLeave para cada control que tenga y usar la propiedad Parent para encontrar el control de usuario que está buscando. Estoy de acuerdo, aunque será un poco doloroso.


Enganchar todos los controles MouseEnter y MouseLeave events, luego averiguar si todavía está dentro del formulario es bastante doloroso. Un temporizador simple también puede hacer el trabajo:

public partial class Form1 : Form { private Timer mTimer; public Form1() { InitializeComponent(); mTimer = new Timer(); mTimer.Interval = 200; mTimer.Tick += mTimer_Tick; mTimer.Enabled = true; } private void mTimer_Tick(object sender, EventArgs e) { if (!this.DesktopBounds.Contains(Cursor.Position)) this.Close(); } }


Idea 1) Cuando se MouseLeave evento MouseLeave , puede verificar las coordenadas del mouse (relativas a la pantalla) y verificar si todavía están dentro de los límites de su usercontrol. Si lo son, se debe suponer que el mouse debe pasar por el control para salir de los límites, y esta vez puede ignorar el evento de manera segura.

Idea 2) Adjuntar MouseEnter eventos MouseEnter a los controles secundarios. Luego, cuando el mouse ingrese uno, sabrá y puede ignorar el evento MouseLeave de MouseLeave . Luego, cuando se MouseLeave evento MouseLeave del niño, verifique nuevamente el MouseEnter del MouseEnter de MouseEnter .


También puede recorrer todos los controles secundarios (recursivos) en su control y adjuntar también un evento MouseEnter y MouseLeave.

Tienes que llevar la contabilidad si el mouse está bajo tu control, o algún control secundario.