karthik
karthik

Reputation: 4735

Fading in and fading out for a form

i have a requirement in which my form is transparent,if my mouse enters into it the form should became visible,if my mouse leaves out of the form it becomes transparent, i have three different controls placed in my form , each controls mouse leave and mouse enter is the same that of the form . if my mouse enters into the form and enters into a control form_mouseleaveevent and control_mouseenterd gets fired so iam not able to achieve it,how to overcome this.

below is the piece of code for this:

  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(object sender, EventArgs e) { TransToOpac(); } private void OnMouseLeft(object sender, EventArgs e) { OpacToTrans(); }

Upvotes: 1

Views: 895

Answers (2)

Thorsten Dittmar
Thorsten Dittmar

Reputation: 56697

You could also check in Form_MouseLeave whether the mouse pointer is still within the form's bounds and in that case not fade out.

EDIT
There are several ways to find out whether the mouse is still within form's bounds. Easiest would be to use the Mouse.GetPosition method to find the current mouse position. The result is the location of the mouse pointer in screen coordinates. You can then check, whether the form's bounding rectangle contains the location.

Upvotes: 3

Hans Passant
Hans Passant

Reputation: 941218

You can't get this done with MouseEnter/Leave events. The smaller problem is that the form's Leave event may never fire if a control is close to the edge. The bigger problem is that it will fire when the cursor moves into the non-client area (border, caption), you don't want to fade the form when the user tries to close or resize the window.

The crude but effective solution is to use a timer to check where the mouse is located:

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;
}

Upvotes: 5

Related Questions