先说一下实现原理。以下图一个文件夹为例,蓝点是按住了某个控件时的鼠标位置,开始的时候先计算这个鼠标坐标与文件夹(窗体)的偏移量,就是文件夹(窗体)的坐标X-鼠标坐标X和文件夹(窗体)的坐标Y-鼠标坐标Y。
当鼠标移动到目标点(可以时下图中的红点或者绿点)将文件夹(窗体)的坐标设置为以松开鼠标的坐标加上上面获取的偏移量即可。
下面直接上代码,控件为DataGridView
////// 是否按下鼠标 /// bool isMouseDown = false; ////// 按下鼠标时,Form与按下鼠标坐标的偏移量 /// Point mouseOffset; private void dataGridView1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Control control = sender as Control; // 通过PointToScreen获取当前点击点的相对于屏幕的坐标(因为窗体的坐标按屏幕坐标) mouseOffset = control.PointToScreen(e.Location); // 下面计算的结果就是鼠标按下的坐标和窗体坐标的偏移量 mouseOffset.X = this.Location.X - mouseOffset.X; mouseOffset.Y = this.Location.Y - mouseOffset.Y; // 标记已按住了鼠标 isMouseDown = true; } } private void dataGridView1_MouseMove(object sender, MouseEventArgs e) { if (isMouseDown) { Control control = sender as Control; // 获取移动后的鼠标相对屏幕的坐标 Point now_mouse_point = control.PointToScreen(e.Location); // 因为不管鼠标在什么位置,窗体的左上角坐标跟鼠标的坐标的偏移量永远是一样的 now_mouse_point.Offset(mouseOffset.X, mouseOffset.Y); this.Location = now_mouse_point; } } private void dataGridView1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { isMouseDown = false; } }



