我正在构建一个简单的表单,有一个简单的效果--当鼠标不在窗体上时,不透明度降低,当鼠标在窗体上时,窗体变得不透明。我目前遇到了几个困难:-
发布于 2012-09-23 14:11:10
MouseEnter/Leave事件太不可靠,无法做到这一点。最好的方法就是使用一个计时器来检查鼠标是否还在窗口内。在表单上放置一个计时器,使代码看起来如下:
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-23 13:46:31
我可能错了,但为什么要使用MouseHover事件?MouseHover检测鼠标何时停止在窗体上移动,并通常用于显示工具提示。
您要查找的事件是MouseEnter,它与MouseLeave正好相反,它检测鼠标何时进入窗口的客户端。
在“离开”事件中,只需检查光标位置是否位于窗口客户端rect中,以了解它是否确实离开了窗体,或者它是否位于子控件的顶部。
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;
}
}发布于 2016-04-08 00:25:17
添加计时器控件,然后在计时器的滴答事件中使用下面的控件。如果您的表单中有自定义/用户控件,上述答案将不起作用。所以必须使用ClientRectangle
this.Opacity = this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)) ? 0.99 : 0.20;https://stackoverflow.com/questions/12552809
复制相似问题