Pergunta

Eu estou lutando com algo que eu acho que deve ser facilmente (ish). Eu tenho um formulário janelas e um painel flowgridlayout na parte inferior do formulário. Dentro desta forma eu preenchê-lo dinamicamente com um número X de User Controls. Os controles são todos do mesmo tipo.

O objetivo é quando o usuário Hoovers o mouse sobre o controle de usuário abre uma outra forma e posições de TI onde o mouse é. Quando as folhas do rato o formulário a forma aberta desaparece.

Esta quase funciona muito bem. O problema é quando o User Control tem nada parecido com uma caixa de rótulo ou texto dentro dele. Considera-se ter deixado a UC para que o formulário desaparece.

O meu pensamento foi, em seguida, usar o X e Y de dizer se ele está dentro da UC, mas não consigo descobrir isso.

Posso perguntar:

1) Qual é a melhor abordagem para isso? 2) Como posso código, como os da UC são dinâmicas posso não saber exatamente onde eles serão.

Graças

Editar

Eu estou tentando descobrir os ponteiros de mouse, mas não chegar lá. O código abaixo é dentro do 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 = Y = 808 908 Largura Altura = 62 = 29} System.Drawing.Rectangle

Eu não entendo como p2 (seu pai) pode ter um maior Y valor em relação à tela.

Foi útil?

Solução

eventos

Hooking todos os controles MouseEnter e MouseLeave, em seguida, descobrir se ele ainda está dentro do formulário é muito doloroso. Um simples temporizador pode começar o trabalho feito demasiado:

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

Outras dicas

Idea 1) Quando o evento MouseLeave, você pode verificar as coordenadas do mouse (em relação à tela) e verificar se eles ainda estão dentro dos limites do seu usercontrol. Se eles forem, deve-se presumir que o rato tem que passar de volta através do controle para obter fora dos limites, e você pode ignorar com segurança o evento este tempo.

Idea 2) Anexar manipuladores de eventos MouseEnter para os controles filho. Então, quando o mouse entra um, você vai saber e pode ignorar evento MouseLeave do usercontrol. Então, quando fogos de eventos MouseLeave da criança, cheque de MouseEnter do usercontrol novamente.

Eu acho que eu iria adicionar um manipulador de eventos para MouseLeave para cada controle que você tem e usar a propriedade Parent para encontrar o Controle do Usuário que são depois. Concordo, ele vai ser um pouco embora doloroso.

Você também pode percorrer todos os controles filho (recursivo) em seu controle, e anexar um evento MouseEnter e MouseLeave para eles também.

Você tem que fazer alguma contabilidade se o mouse está em seu controle, ou algum controle filho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top