MouseHover和MouseLeave事件控制

vis*_*213 3 c# opacity

我正在构建一个简单的形式,只有一个简单的效果 - 当鼠标悬停在窗体上时,不透明度会降低,当鼠标悬停在窗体上时,窗体会变得不透明.我目前遇到了几个困难: -

  1. 首先,我这样做 -

     this.MouseHover += new EventHandler(Form1_MouseHover);
     this.MouseLeave += new EventHandler(Form1_MouseLeave);
    
    Run Code Online (Sandbox Code Playgroud)

    但是我在形式上也有1个richtextbox,当鼠标移过它时,表格再次失去了不透明度.我也必须加上这个: -

     richTextBox1.MouseHover+=new EventHandler(Form1_MouseHover);
     richTextBox1.MouseLeave+=new EventHandler(Form1_MouseLeave);
    
    Run Code Online (Sandbox Code Playgroud)

    想知道是否有更好的方法,因为richtextbox和表格边界之间仍然存在一些差距,当鼠标光标到达时,表格会失去不透明度.

  2. 如果鼠标不在表单上(最初假设),则表单不太透明.现在,我希望一旦鼠标移过它就会形成不透明的形状,但只有当鼠标在窗体上移动完全停止时才会发生.如果我继续在表单上移动鼠标,它就不会变得不透明.这是事件存储在消息队列中的方式的问题以及所有这些或将能够做什么,因为我已经看到了具有我想要实现的效果的应用程序.

Han*_*ant 7

MouseEnter/Leave事件太不可靠了.最好的办法就是使用一个Timer来检查鼠标是否仍在窗口内.在表单上删除一个Timer,使代码看起来像这样:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.Opacity = 0.99;
        timer1.Interval = 200;
        timer1.Enabled = true;
        timer1.Tick += timer1_Tick;
    }
    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);
        timer1_Tick(this, e);
    }
    private void timer1_Tick(object sender, EventArgs e) {
        this.Opacity = this.Bounds.Contains(this.PointToClient(Cursor.Position)) ? 0.99 : 0.20;
    }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句:避免将不透明度增加到1.0,这会强制重新创建本机窗口,并且可能会产生很多副作用.使用0.99是最好的.


Sam*_*ous 5

我可能错了,但是为什么要使用MouseHover事件?MouseHover检测鼠标何时停止在窗体上移动,通常用于显示工具提示。

您要查找的事件是MouseEnter,它与MouseLeave相反,它会检测鼠标何时进入窗口的客户端区域。

在Leave事件中,只需检查光标位置是否在窗口客户端区域中,即可知道它是否确实离开了窗体,或者它是否位于子控件的顶部。

如果您使用的是Ofc,则必须修改代码。

 private void Form1_MouseEnter(object sender, EventArgs e)
    {
        this.Opacity = 1;
    }

    private void Form1_MouseLeave(object sender, EventArgs e)
    {

        if (!this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)))
        {
            this.Opacity = 0.5;
        }
    }
Run Code Online (Sandbox Code Playgroud)