Domanda

Ho sottoclasse form con gestori per MouseHover e MouseLeave. Quando il puntatore si trova sullo sfondo della finestra, gli eventi funzionano bene, ma quando il puntatore entra in un controllo di all'interno della finestra, che provoca un evento MouseLeave.

Esiste un modo per avere un evento che copre l'intera finestra.

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

È stato utile?

Soluzione

Quando l'evento congedo mouse viene licenziato una possibilità è quella di verificare la posizione corrente del puntatore e vedere se all'interno dell'area di modulo. Io non sono sicuro se una migliore opzione è disponibile.

Modifica: Abbiamo una domanda simile che potrebbe essere di vostro interesse. Come rilevare se il mouse si trova all'interno delle intere controlli di modulo e bambino in C #?

Altri suggerimenti

Override l'evento MouseLeave di non innescare fino a quando il mouse entra un controllo figlio

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

Non v'è alcun buon modo per fare MouseLeave affidabile per un controllo contenitore. Punt questo problema con un timer:

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
                //...
            }
        }
    }
}

Il controllo utente creare un evento MouseHover per il controllo di questo tipo, (o altro tipo di evento) come questo

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

Sul vostro WinForm che ospita l'UserControl ha questo per l'UserControl per gestire il MouseOver in modo da mettere questo nel tuo Designer.cs

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

che chiama questo metodo sul vostro WinForm

private void ThumbnailMouseHover(object sender, EventArgs e)
{

    ThumbImage thumb = (ThumbImage) sender;

}

Dove ThumbImage è il tipo di UserControl

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top