曾經遇到過不使用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的方法,就會只窗體跟着鼠標移動啦。