曾经遇到过不使用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的方法,就会只窗体跟着鼠标移动啦。