WinForm无边框窗体实现双击缩放及拖动

有时候要实现无边框的winform窗体,由于没有边框了,所以缩放功能没有了,同时也不能拖动窗体。在实际应用中,我们经常会有一个窗体的头部来显示Title,需要在这个头部左键双击实现缩放以及左键按住实现拖动。
缩放时,应该首先设置窗体的默认长、宽及与屏幕的左边距和上边距。
拖动时,根据鼠标位置移动窗体位置。
两个操作都是根据MouseDown事件来操作的,所以要理清思路。
双击缩放,在第一次点击时,设置过期时间,若在过期时间内在此点击,则改变窗体大小。
拖动时,需要MouseDown、MouseUp、MouseMove同时配合,在MouseDown是第一次触发时,记录当前鼠标位置,并设置属性左键按下标记leftFlag为true。若leftFlag为true移动鼠标,则在MouseMove事件下开始移动窗体,MouseUp事件中改变左键按下标记leftFlag为false。

过期时间:
        Timer timer = new Timer();
点击次数:
        clickTime=0;
左键按下标志:
        leftFlag=false
窗体初始化时设置过期时间:
        timer.Interval = 300;
        timer.Tick += (s, e1) => { timer.Stop();clickTime = 0; };
MouseMove事件:
        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if(leftFlag)
            {
                    PointmouseSet = Control.MousePosition;
                    mouseSet.Offset(mPoint.X,mPoint.Y);  //设置移动后的位置
                    Location = mouseSet;
            }
        }
MouseUp事件:
        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
        leftFlag = false;
        }
MouseDown事件:
        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
        clickTime++;
            timer.Start();
            if (clickTime % 2 == 0)
            {
            this.WindowState = this.WindowState == FormWindowState.Maximized ?FormWindowState.Normal : FormWindowState.Maximized;
                    clickTime = 0;
        }
            else
            {
                    if(!leftFlag)
                    {
                mPoint.X = -e.X;
                        mPoint.Y = -e.Y;
                        leftFlag = true;
            }
                    else
                    {
                leftFlag = false;
                    }
            }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值