类似VM菜单的简单实现 (二)

来源:互联网 发布:淘宝服装街拍 编辑:程序博客网 时间:2024/06/13 01:32

上文的实现方式是通过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
      

原创粉丝点击