WPF (2).非常奇怪的移动无边框窗体

曾经遇到过不使用API的移动无边框窗体的代码,非常简洁,如下

 Point _downpoint;

bool _move = false;

private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            _downpoint.X = e.X;
            _downpoint.Y = e.Y;
            _down = true;


        }

 private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (_move)
            {
                this.Top += e.Y - _downpoint.Y;
                this.Left += e.X - _downpoint.X;
               
            }
        }

private void Form1_MouseUp(object sender, MouseEventArgs e)
         {
             _move = false;
         }

虽然代码非常短,但是我一直搞不懂move的过程。我做了个测试

 private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (_move)
            {
                int y = e.Y - _downpoint.Y;
                int x = e.X - _downpoint.X;
                label1.Text = string.Format("x:{0};y:{1};top:{2},left:{3};chax:{4},chay:{5}", e.X, e.Y, this.Top, this.Left, x, y);
                this.Top += y;
                this.Left += x;
              }
        }


移动的坐标 - 点下的坐标一直为0,但是top却在一直变化。我认为这个move的过程可能不止一个线程,实在是搞不清楚啊。

既然是写WPF ,移动无边框的windsow就非常简单啦

只需加入this.DragMove(),  就可以。

如果在xp上移动窗体的话,你就会发现,在移动过程中,一直在动的是虚线框,窗体还在点击位置,只有松开鼠标后,窗体才会出现在当前移动位置。 this.DragMove(), 也是这种效果。

但是 使用第一种递增top left的方法,就会只窗体跟着鼠标移动啦。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值