Winform - determinar se o mouse tem o controle de usuário esquerda
-
05-07-2019 - |
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.
Solução
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.