c# - 淡入淡出表格

标签 c# .net-2.0

我有一个要求我的表格是透明的,如果我的鼠标进入表格
应该变得可见,如果我的鼠标离开表单它变得透明,我在表单中放置了三个不同的控件,每个控件鼠标离开和鼠标进入与表单相同。如果我的鼠标进入表单并进入控件
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)无效 OnMouseEntered(对象发送者,EventArgs e)
{
TransToOpac();
}
私有(private)无效 OnMouseLeft(对象发送者,EventArgs e)
{
OpacToTrans();
}

最佳答案

您无法使用 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;
}

关于c# - 淡入淡出表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2927955/

相关文章:

c# - 如果网站与数据库位于同一台服务器上,如何构建数据库连接字符串?

c# - 如何在对话框打开时禁用拖放

c# - 在 UI 线程上报告后台线程进度

c# - 如何使用 Entity Framework 代码优先从数据库中删除所有相关实体

c# - 我可以在 .NET 2.0 或 3.0 中使用扩展方法和 LINQ 吗?

c# - 适用于 Windows CE 5.0 和 .NET 2.0 的蓝牙与 C#

c# - AES - c# 加密和 objective-c 解密不起作用

c# - 如何使陷入无限循环的测试失败?

c# - 更改 DataGridView 单元格中按钮的颜色

c# - XSD类生成嵌套表问题