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