我正在使用一个简单的效果构建一个简单的表单 - 当鼠标悬停在表单上时,不透明度会降低,当鼠标悬停在表单上时,表单会变得不透明。我目前遇到了几个困难: -
首先,我这样做了 -
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和表格边界之间仍然存在一些差距,并且当鼠标光标到达时,表格会失去不透明度。
如果鼠标不在表单上(最初假设),表单不透明。现在,我希望一旦鼠标移过它就会变成不透明的形状,但只有当鼠标在窗体上移动完全停止时才会发生。如果我继续在表单上移动鼠标,它就不会变得不透明。这是事件存储在消息队列中的方式的问题,以及我能够做的所有事情,因为我已经看到了具有我想要实现的效果的应用程序。
答案 0 :(得分: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;
}
}
顺便说一句:避免将不透明度增加到1.0,这会强制重新创建本机窗口,并且可能会产生很多副作用。使用0.99是最好的。
答案 1 :(得分:4)
我可能错了,但为什么要使用MouseHover事件? MouseHover检测鼠标何时停止在表单上移动,通常用于显示工具提示。
您要查找的事件是MouseEnter,它与MouseLeave相反,并检测鼠标何时进入窗口的客户端矩形。
在Leave事件中,只需检查光标位置是否在窗口client rect中,以确定它是否确实离开了表单,或者它是否只是在子控件之上。
如果您使用某个地区,则必须调整代码。
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;
}
}
答案 2 :(得分:1)
添加一个计时器控件,然后在计时器的刻度事件中使用以下内容。如果您的表单中有自定义/用户控件,则上述答案将无法使用。所以必须使用ClientRectangle
this.Opacity = this.ClientRectangle.Contains(this.PointToClient(Cursor.Position)) ? 0.99 : 0.20;
答案 3 :(得分: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;
}