淡入淡出形式 [英] Fading in and fading out for a form

查看:132
本文介绍了淡入淡出形式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个要求我的窗体是透明的,如果我的鼠标进入窗体
应该是可见的,如果我的鼠标离开它变成透明的窗体,则我要放置三个不同的控件窗体,每个控件的鼠标离开和鼠标输入都与窗体相同。如果我的鼠标进入表单并进入控件
,则form_mouseleaveevent和control_mouseenterd被触发,因此我无法实现,该如何克服。

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.

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

私有无效OnMouseEntered(对象发送者,EventArgs e)
{
TransToOpac();
}
私人无效OnMouseLeft(对象发送者,EventArgs e)
{
OpacToTrans();
}

private void OnMouseEntered(object sender, EventArgs e) { TransToOpac(); } private void OnMouseLeft(object sender, EventArgs e) { OpacToTrans(); }

推荐答案

使用MouseEnter / Leave事件无法完成此操作。较小的问题是,如果控件靠近边缘,则窗体的Leave事件可能永远不会触发。更大的问题是,当光标移到非工作区(边框,标题)时,它将触发,您不想在用户尝试关闭或调整窗口大小时淡化窗体。

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

这篇关于淡入淡出形式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆