3

我正在构建一个简单的表单,具有一个简单的效果——当鼠标不在表单上时,不透明度会降低,当鼠标在表单上时,表单会变得不透明。我目前遇到了几个困难:-

  1. 首先,我这样做了——

     this.MouseHover += new EventHandler(Form1_MouseHover);
     this.MouseLeave += new EventHandler(Form1_MouseLeave);
    

    但是我的表单中也有 1 个richtextbox,当鼠标移过它时,表单再次失去了不透明度。我也必须添加这个:-

     richTextBox1.MouseHover+=new EventHandler(Form1_MouseHover);
     richTextBox1.MouseLeave+=new EventHandler(Form1_MouseLeave);
    

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

  2. 如果鼠标不在表单上(假设最初),则表单不透明。现在,我希望一旦鼠标移过它,表单就会变得不透明,但只有当鼠标在表单上移动完全停止时才会发生这种情况。如果我继续将鼠标移到表单上,它不会变得不透明。这是事件存储在消息队列中的方式的问题吗?或者我能做些什么,因为我已经看到了我正在尝试实现的效果的应用程序。

4

4 回答 4

8

MouseEnter/Leave 事件太不可靠,无法执行此操作。最好的办法是使用一个计时器来检查鼠标是否仍在窗口内。在表单上放置一个 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;
    }
}

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

于 2012-09-23T14:11:10.557 回答
6

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

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

在离开事件中,只需检查光标位置是否在窗口客户端矩形中,以了解它是否确实离开了表单,或者它是否只是在子控件的顶部。

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;
        }
    }
于 2012-09-23T13:46:31.247 回答
1

添加一个计时器控件,然后在计时器的滴答事件中使用下面。如果您的表单中有自定义/用户控件,上述答案将不起作用。所以必须使用ClientRectangle

this.Opacity = this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)) ? 0.99 : 0.20;
于 2016-04-08T00:25:17.000 回答
0
private void Form1_MouseEnter(object sender, EventArgs e)
{
    this.Opacity = 1.0;
}

private void Form1_MouseLeave(object sender, EventArgs e)
{ 
    this.Opacity = 0.8;
}
于 2012-09-23T13:54:13.357 回答