上文的实现方式是通过Panel的 MouseHover 与 MouseLeave事件绑定来实现鼠标 类似VM菜单的效果的。
但是这样实现有个缺点,就是如果Panel上面有控件,比如Button,当鼠标移到Button上时,那么就要响应Panel
的MouseLeave事件。。。
解决方法有两种,
1.通过重写鼠标绑定事件,将Panel及其上面所有的Control都添加同一个MouseHover和MouseLeave事件。这样实现是在是太麻烦了。否决。。。
2.通过一个Timer,不停地读取鼠标位置,判断是否在Panel上。。。这样会对效率有影响,不过效果还是差强人意。
代码如下:
//Panel上放了一个按钮 Button1
#region 鼠标控制标题栏显隐
//鼠标进入
private bool mEntered = false;
void timer1_Tick(object sender, EventArgs e)
{
Point pos2 = this.PointToClient(Cursor.Position);
Point pos = panel1.PointToClient(Cursor.Position);
bool entered = this.panel1.ClientRectangle.Contains(pos);
if (entered != mEntered)
{
mEntered = entered;
if (!entered)
{
//鼠标离开
Animation(false);
}
else
{
//鼠标悬停
if (!ismoving)
if (this.panel1.Location.Y <= 10 - this.panel1.Height)
Animation(true);
}
}
}
bool updown = true;
int adddistance = 3;
bool ismoving = false;
System.Windows.Forms.Timer timer = new Timer();
private void Form2_Load(object sender, EventArgs e)
{ //
panel1.Margin = new System.Windows.Forms.Padding(0, 0, 0, 0);
panel1.Location = new Point(panel1.Location.X, 10 - panel1.Height);
}
private void Animation(bool isdown)
{
updown = isdown;
if (isanimation)
{
ismoving = true;
timer = new Timer();
timer.Interval = 50;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
}
void timer_Tick(object sender, EventArgs e)
{
if (updown)//show
if (this.panel1.Location.Y < 0)
{
this.panel1.Location = new Point(this.panel1.Location.X,
Math.Min(0, this.panel1.Location.Y + adddistance));
}
else
{
//
ismoving = false;
timer.Dispose();
}
else//hide
{
if (this.panel1.Location.Y > 10 - panel1.Height)
this.panel1.Location = new Point(this.panel1.Location.X,
Math.Max(10 - panel1.Height, this.panel1.Location.Y - adddistance));
else
{
ismoving = false;
timer.Dispose();
}
}
}
bool isanimation = true;
private void button1_Click(object sender, EventArgs e)
{
isanimation = !isanimation;
}
#endregion