Мышь ввод / выход из формы и кнопки дочерних событий проблема - PullRequest
5 голосов
/ 22 сентября 2009

есть программа, которая исчезает при отпускании мыши.

, но проблема в том, что когда мышь переходит к дочернему элементу формы, подобному кнопке, она вызывает событие отпускания мыши. поэтому я настроил этот код.

private void Form1_MouseLeave(object sender, EventArgs e)
{
    if (this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)))
    {
        this.Opacity = 1.0;
    }
    else
    {
        int loopctr = 0;

        for (loopctr = 100; loopctr >= 5; loopctr -= 10)
        {
            this.Opacity = loopctr / 99.0;
            this.Refresh();
            Thread.Sleep(100);
        }
    }
}

но проблема сейчас в том, что форма часто не запускает событие отпускания мыши, похоже, потому что кнопки расположены так близко к краям формы, что никогда не регистрируются, что мышь покидает границы формы, возможно потому, что курсор мыши быстро и пропускает форму, когда она уходит.

какие-либо предложения о том, как разобраться с этим?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2009

Вот простой вспомогательный класс для этого, сначала используйте его в своей форме, например:

partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        new FadeForm(this, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(0.25), 0.05);
    }
}

Затем добавьте этот код в ваш проект:

class FadeForm
{
    readonly Form _top;
    readonly Timer _timer;
    readonly TimeSpan _delayToFade;
    readonly double _fadeAmount;

    Control _lastControl;
    DateTime _lastActivity;

    public FadeForm(Form ctrl, TimeSpan delayToFade, TimeSpan delaySpeed, double fadeAmount)
    {
        _top = ctrl;
        _delayToFade = delayToFade;
        _fadeAmount = fadeAmount;
        _lastActivity = DateTime.Now;

        WatchControl(_top);

        _timer = new Timer();
        _timer.Interval = (int)delaySpeed.TotalMilliseconds;
        _timer.Enabled = true;
        _timer.Tick += new EventHandler(Tick);
    }

    void  Tick(object sender, EventArgs e)
    {
        if (_lastControl != null || (DateTime.Now - _lastActivity) < _delayToFade)
        {
            if (_top.Opacity != 1)
                _top.Opacity = 1;
        }
        else
        {
            double newvalue = _top.Opacity -= _fadeAmount;
            if (newvalue > 0.0)
                _top.Opacity = newvalue;
            else
                _top.Close();
        }
    }

    void WatchControl(Control c)
    {
        c.MouseEnter += new EventHandler(MouseEnter);
        c.MouseLeave += new EventHandler(MouseLeave);
    }

    void MouseEnter(object sender, EventArgs e)
    {
        _lastControl = sender as Control;
    }

    void MouseLeave(object sender, EventArgs e)
    {
        _lastControl = null;
        _lastActivity = DateTime.Now;
    }
}
0 голосов
/ 23 сентября 2009

Попробуйте вместо этого деактивное событие формы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...