Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 相对于单击的位置移动表单_C#_.net - Fatal编程技术网

C# 相对于单击的位置移动表单

C# 相对于单击的位置移动表单,c#,.net,C#,.net,我有一个表单,当用户在边界区域单击和拖动时,它可以被移动。我看到的所有实现都锁定到当前鼠标位置,因此当移动表单时,表单会跳转,以便鼠标位于左上角。我想更改它,使其行为类似于正常的windows窗体,并且在移动时该窗体相对于鼠标保持相同的位置。我当前的代码如下所示: Point locationClicked; bool isMouseDown = false; private void Form1_MouseDown(object sender, MouseEventArgs e) {

我有一个表单,当用户在边界区域单击和拖动时,它可以被移动。我看到的所有实现都锁定到当前鼠标位置,因此当移动表单时,表单会跳转,以便鼠标位于左上角。我想更改它,使其行为类似于正常的windows窗体,并且在移动时该窗体相对于鼠标保持相同的位置。我当前的代码如下所示:

Point locationClicked;
bool isMouseDown = false;

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    isMouseDown = true;
    locationClicked = new Point(e.Location.X, e.Location.Y);
}

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

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    if (isMouseDown && targetCell == new Point(-1, -1) && (mouseLocation.X < margin.X || mouseLocation.Y < margin.Y ||
        mouseLocation.X > margin.X + cellSize.Width * gridSize.Width ||
        mouseLocation.Y > margin.Y + cellSize.Height * gridSize.Height))
    {
        this.Location = new Point(e.Location.X - locationClicked.X, e.Location.Y - locationClicked.Y);
    }
}
点定位点击;
bool isMouseDown=false;
私有void Form1\u MouseDown(对象发送方,MouseEventArgs e)
{
isMouseDown=真;
locationClicked=新点(e.Location.X,e.Location.Y);
}
私有void Form1_MouseUp(对象发送方,MouseEventArgs e)
{
isMouseDown=错误;
}
私有void Form1\u MouseMove(对象发送方,MouseEventArgs e)
{
如果(isMouseDown&&targetCell==新点(-1,-1)和(mouseLocation.Xmargin.X+cellSize.Width*gridSize.Width||
鼠标位置.Y>margin.Y+cellSize.Height*gridSize.Height)
{
this.Location=新点(e.Location.X-locationClicked.X,e.Location.Y-locationClicked.Y);
}
}
当我拖动窗口时,它的行为与我想要的类似。窗体在屏幕上的两个位置之间闪烁,其中一个位置的移动速度约为鼠标的一半。有没有办法解决这个问题?

试试这个

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    Point locationClicked;
    bool dragForm = false;

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            locationClicked = new Point(e.Location.X, e.Location.Y);
            if (isMouseDown && targetCell == new Point(-1, -1) && (mouseLocation.X < margin.X || mouseLocation.Y < margin.Y ||
                mouseLocation.X > margin.X + cellSize.Width * gridSize.Width ||
                mouseLocation.Y > margin.Y + cellSize.Height * gridSize.Height))
            {
                dragForm = true;
            }
        }

    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (dragForm)
        {
            this.Location = new Point(this.Location.X + (e.X - locationClicked.X), this.Location.Y + (e.Y - locationClicked.Y));
        }
    }

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

}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
点定位;
bool-dragForm=false;
私有void Form1\u MouseDown(对象发送方,MouseEventArgs e)
{
if(e.Button==System.Windows.Forms.MouseButtons.Left)
{
locationClicked=新点(e.Location.X,e.Location.Y);
如果(isMouseDown&&targetCell==新点(-1,-1)和(mouseLocation.Xmargin.X+cellSize.Width*gridSize.Width||
鼠标位置.Y>margin.Y+cellSize.Height*gridSize.Height)
{
dragForm=true;
}
}
}
私有void Form1\u MouseMove(对象发送方,MouseEventArgs e)
{
if(拖曳式)
{
this.Location=新点(this.Location.X+(e.X-locationClicked.X),this.Location.Y+(e.Y-locationClicked.Y));
}
}
私有void Form1_MouseUp(对象发送方,MouseEventArgs e)
{
dragForm=false;
}
}

只要适当地处理
WM\n chittest
消息,Windows将为您移动所有窗口。这是可行的,但在生成边框时会导致异常(我实际上利用了这一点,所以很好),但在拖动窗体的底部或右边距后,它会停止工作。知道为什么吗?通过重置
targetCell
解决了问题。谢谢