首页 文章

淡出并淡出表格

提问于
浏览
1

我有一个要求,我的表格是透明的,如果我的鼠标进入它,表格应该变得可见,如果我的鼠标离开表格它变得透明,我有三个不同的控件放在我的表格,每个控制鼠标离开和鼠标输入与表单相同 . 如果我的鼠标进入窗体并进入控件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(object sender,EventArgs e){TransToOpac(); } private void OnMouseLeft(object sender,EventArgs e){OpacToTrans(); }

2 回答

  • 3

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

    原始但有效的解决方案是使用计时器来检查鼠标的位置:

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

    您还可以检查 Form_MouseLeave 鼠标指针是否仍在表单的边界内,在这种情况下不会淡出 .

    EDIT
    有几种方法可以确定鼠标是否仍在表单范围内 . 最简单的方法是使用 Mouse.GetPosition 方法查找当前鼠标位置 . 结果是鼠标指针在屏幕坐标中的位置 . 然后,您可以检查表单的边界矩形是否包含该位置 .

相关问题