首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MouseHover和MouseLeave事件控制

MouseHover和MouseLeave事件控制
EN

Stack Overflow用户
提问于 2012-09-23 13:40:47
回答 4查看 34.4K关注 0票数 3

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

  1. 首先,我做了这个- this.MouseHover += new EventHandler(Form1_MouseHover);this.MouseLeave += new EventHandler(Form1_MouseLeave); 但是我也有一个丰富的文本框,当鼠标经过它的时候,表单又失去了不透明度。我还得加上这个:- richTextBox1.MouseHover+=new EventHandler(Form1_MouseHover);richTextBox1.MouseLeave+=new EventHandler(Form1_MouseLeave); 想知道是否有更好的方法,因为richtextbox和form边界之间仍然存在一些空白,而且当鼠标光标移到那里时,form正在失去透明度。
  2. 如果鼠标不在窗体上(假设最初是这样),则窗体不那么不透明。现在,我希望当鼠标经过它时,表单变得不透明,但是只有当鼠标在窗体上的移动完全停止时,它才会发生。如果我一直在窗体上移动鼠标,它不会变得不透明。这是事件存储在消息队列中的方式以及所有这些的问题,还是我将能够做一些事情,因为我已经看到了具有我试图实现的效果的应用程序。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-23 14:11:10

MouseEnter/Leave事件太不可靠,无法做到这一点。最好的方法就是使用一个计时器来检查鼠标是否还在窗口内。在表单上放置一个计时器,使代码看起来如下:

代码语言:javascript
复制
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是最好的。

票数 8
EN

Stack Overflow用户

发布于 2012-09-23 13:46:31

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

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

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

Ofc如果使用区域,则必须修改代码。

代码语言:javascript
复制
 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;
        }
    }
票数 6
EN

Stack Overflow用户

发布于 2016-04-08 00:25:17

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

代码语言:javascript
复制
this.Opacity = this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)) ? 0.99 : 0.20;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12552809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档