Появление и исчезновение для формы - PullRequest
1 голос
/ 28 мая 2010

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

ниже приведен фрагмент кода для этого:

  private void TransToOpac()
    {  
        if (!isTransparent)
            return;

       if (TtoOON == false )
        {
            TtoOON = true;
            for (i = this.Opacity; i <= 1; i = i + 0.02)
            {
                this.Opacity = i;
                Thread.Sleep(50);
            }
            isTransparent = false;
            TtoOON = false;
        }
    }
    private void OpacToTrans()
    {
        if (isTransparent)
            return;

        if (OtoTON == false )
        {
            OtoTON = true;
            for (i = this.Opacity; i >= 0.5; i = i - 0.02)
            {
                this.Opacity = i;
                Thread.Sleep(50);
            }
            isTransparent = true;
            OtoTON = false;
        }
    }

private void OnMouseEntered (отправитель объекта, EventArgs e) { TransToOpac (); } private void OnMouseLeft (отправитель объекта, EventArgs e) { OpacToTrans (); }

Ответы [ 2 ]

5 голосов
/ 28 мая 2010

Вы не можете сделать это с помощью MouseEnter / Leave. Меньшая проблема заключается в том, что событие Leave формы может никогда не сработать, если элемент управления находится близко к краю. Большая проблема заключается в том, что он будет срабатывать при перемещении курсора в область, не являющуюся клиентом (границы, заголовки), вы не хотите затенять форму, когда пользователь пытается закрыть или изменить размер окна.

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

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.Opacity = 0.99;        // Avoid flicker
        mFadeTimer.Interval = 15;
        mFadeTimer.Tick += new EventHandler(mFadeTimer_Tick);
        mMouseTimer.Interval = 200;
        mMouseTimer.Tick += new EventHandler(mMouseTimer_Tick);
        mMouseTimer.Enabled = true;
    }
    void mMouseTimer_Tick(object sender, EventArgs e) {
        if (this.Bounds.Contains(Control.MousePosition)) {
            if (mFade <= 0) { mFade = 1; mFadeTimer.Enabled = true; }
        }
        else {
            if (mFade >= 0) { mFade = -1; mFadeTimer.Enabled = true; }
        }
    }
    void mFadeTimer_Tick(object sender, EventArgs e) {
        double opaq = this.Opacity + mFade * 0.05;
        if (opaq >= 0.99) { opaq = 0.99; mFadeTimer.Enabled = false; }
        if (opaq <= 0.15) { opaq = 0.15; mFadeTimer.Enabled = false; }
        this.Opacity = opaq;
    }
    private Timer mFadeTimer = new Timer();
    private Timer mMouseTimer = new Timer();
    private int mFade = 0;
}
3 голосов
/ 28 мая 2010

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

EDIT
Есть несколько способов узнать, находится ли мышь по-прежнему в пределах формы. Проще всего было бы использовать метод Mouse.GetPosition, чтобы найти текущее положение мыши. Результатом является расположение указателя мыши в экранных координатах. Затем вы можете проверить, содержит ли ограничивающий прямоугольник формы местоположение.

...