Pergunta

Eu tenho Form subclasse com manipuladores para MouseHover e MouseLeave. Quando o ponteiro está no fundo da janela, a multa eventos trabalho, mas quando o ponteiro se move para um controle dentro a janela, que provoca um evento MouseLeave.

Existe uma maneira de ter um evento cobrindo toda a janela.

(. NET 2.0, o Visual Studio 2005, Windows XP).

Foi útil?

Solução

Quando o evento licença do mouse é acionado uma opção é para verificar se a posição atual do ponteiro e ver se dentro da área de formulário. Não tenho a certeza se a melhor opção é disponível.

Edit: Nós temos uma pergunta semelhante que pode ser do seu interesse. como detectar se o mouse está dentro de todo os controles de formulário e criança em C #?

Outras dicas

Substituir o evento MouseOver não desencadear desde que o mouse entra um controle filho

    protected override void OnMouseLeave(EventArgs e)
    {
        if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
            return;
        else
        {
            base.OnMouseLeave(e);
        }
    }

Não há nenhuma boa maneira de fazer MouseLeave confiável para um controle de recipiente. Punt este problema com um temporizador:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        timer1.Interval = 200;
        timer1.Tick += new EventHandler(timer1_Tick);
        timer1.Enabled = true;
    }

    private bool mEntered;

    void timer1_Tick(object sender, EventArgs e) {
        Point pos = this.PointToClient(Cursor.Position);
        bool entered = this.ClientRectangle.Contains(pos);
        if (entered != mEntered) {
            mEntered = entered;
            if (!entered) {
                // Do your leave stuff
                //...
            }
        }
    }
}

Em seu controle de usuário criar um evento MouseHover para o seu controle como este, (ou outro tipo de evento) como este

private void picBoxThumb_MouseHover(object sender, EventArgs e)
{
    // Call Parent OnMouseHover Event
    OnMouseHover(EventArgs.Empty);
}

Em seu WinForm que hospeda o UserControl tem isso para o UserControl para lidar com o MouseOver assim colocar isto em seu Designer.cs

this.thumbImage1.MouseHover += new System.EventHandler(this.ThumbnailMouseHover);

O que chama esse método em seu WinForm

private void ThumbnailMouseHover(object sender, EventArgs e)
{

    ThumbImage thumb = (ThumbImage) sender;

}

Onde ThumbImage é o tipo de usercontrol

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