Pregunta

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

El objetivo es cuando el usuario coloca el mouse sobre el control del usuario, abre otra forma y lo coloca donde está el mouse. Cuando el ratón abandona el formulario, desaparece el formulario abierto.

Esto casi funciona muy bien. El problema es cuando el Control de usuario tiene algo como una etiqueta o un cuadro de texto dentro de él. Se considera que ha dejado la UC, por lo que el formulario desaparece.

Mi pensamiento fue entonces usar la X y la Y para saber si está dentro de la UC pero no puedo resolver esto.

Puedo preguntar:

1) ¿Cuál es el mejor enfoque para esto? 2) ¿Cómo puedo codificarlo, ya que los UC son dinámicos? No puedo saber exactamente dónde estarán.

Gracias

EDIT

Estoy tratando de averiguar los punteros del mouse pero no estoy llegando. El siguiente código 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 valor de Y mayor en relación con la pantalla.

¿Fue útil?

Solución

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

  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();
    }
  }

Otros consejos

Idea 1) Cuando se dispara el 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 control de usuario. Si lo están, se debe asumir que el mouse debe pasar por el control para salir de los límites, y esta vez puede ignorar el evento de forma segura.

Idea 2) Adjunte los controladores de eventos MouseEnter a los controles secundarios. Luego, cuando el mouse ingrese en uno, sabrá y podrá ignorar el evento MouseLeave del usercontrol. Luego, cuando se activa el evento MouseLeave del niño, verifique de nuevo el MouseEnter del usuario.

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

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

Tienes que hacer algo de contabilidad si el mouse está bajo tu control, o algún control infantil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top