通过控件和MouseEventArgs拖放表单

时间:2013-03-27 10:03:33

标签: c# winforms user-interface

我目前正在使用上述代码在单击并在特定控件上移动鼠标时移动我的表单(在本例中为toolStrip)。

private void toolStrip1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left) //Wenn die linke Maustaste gedrückt wurde,
            FormMouseDownLocation = e.Location; //wird die Position der Maus gespeichert
    }

    private void toolStrip1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left) //Wird die Linke taste gedrückt und bewegt,
        {
            this.Left += e.X - FormMouseDownLocation.X; //so verschiebt sich das Fenster bei jeder Bewegung um die Positionänderung der Maus (hier die X Pos)

            this.Top += e.Y - FormMouseDownLocation.Y; //so verschiebt sich das Fenster bei jeder Bewegung um die Positionänderung der Maus (hier die Y Pos)
        }
    }

现在我遇到了问题。光标移动得比窗体快,因此光标经常离开toolStrip并且窗体停止移动。只有在我将此代码与主窗体以外的控件结合使用时才会发生这种情况。

这种行为是否有任何解决方案,或者在点击其他控件时更改表单位置的更好方法?

提前致谢

其他信息: 我正在使用winforms, FormBorderStyle:无

2 个答案:

答案 0 :(得分:3)

这是一个常见问题,您必须捕获鼠标以确保在光标移动到工具条窗口之外时仍然会收到MouseMove事件。任何窗口的问题,但更可能使用工具条,因为它们往往是苗条的。修正:

private void toolStrip1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left) {
        FormMouseDownLocation = e.Location;
        toolStrip1.Capture = true;
    }
}

private void toolStrip1_MouseUp(object sender, MouseEventArgs e)
{
    toolStrip1.Capture = false;
}

请选择更好的变量名称。 “FormMouseDownLocation”非常不准确,该位置与表单完全无关。

答案 1 :(得分:0)

您可以参考this。例如,您可以使用面板甚至任何可用作标题的对象。请检查链接。不是他们使用WndProc

的部分