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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值