C# 从另一个类拖动带有控件的窗体

C# 从另一个类拖动带有控件的窗体,c#,winforms,C#,Winforms,首先,如果标题没有什么意义,我很抱歉,因为我不知道最好的解释方法 现在我来解释一下。我所做的是在VisualStudio2013的类库项目中创建一个控件。此控件应充当将“FormBorderStyle”设置为“None”的表单的标题栏。这个模拟标题栏控件应该移动表单,就像普通表单的标题栏一样 我已经实现了这一点,但只是在表单代码中。这是我使用的代码: private int mouseStartX, mouseStartY; private int formStartX, for

首先,如果标题没有什么意义,我很抱歉,因为我不知道最好的解释方法

现在我来解释一下。我所做的是在VisualStudio2013的类库项目中创建一个控件。此控件应充当将“FormBorderStyle”设置为“None”的表单的标题栏。这个模拟标题栏控件应该移动表单,就像普通表单的标题栏一样

我已经实现了这一点,但只是在表单代码中。这是我使用的代码:

    private int mouseStartX, mouseStartY;
    private int formStartX, formStartY;
    private bool FormDragging = false;

    private void titleBar_MouseDown(object sender, MouseEventArgs e)
    {

        this.mouseStartX = MousePosition.X;
        this.mouseStartY = MousePosition.Y;
        this.formStartX = this.Location.X;
        this.formStartY = this.Location.Y;
        FormDragging = true;
    }

    private void titleBar_MouseMove(object sender, MouseEventArgs e)
    {
        if (FormDragging)
        {
            this.Location = new Point(
            this.formStartX + MousePosition.X - this.mouseStartX,
            this.formStartY + MousePosition.Y - this.mouseStartY
            );
        }
    }

    private void titleBar_MouseUp(object sender, MouseEventArgs e)
    {
        FormDragging = false;
    }
在表单代码中,“this.*”显然是指表单。所以,当然,如果我简单地把它放到控件代码中,它显然是指控件,因此控件就是在表单上移动的控件

我还在类库中创建了一个控件,用作关闭按钮。我所要做的就是:

    Form.ActiveForm.Close();
同样适用于以下情况:

    Form.ActiveForm.WindowState = FormWindowState.Minimized;
    Form.ActiveForm.WindowState = FormWindowState.Maximized;
最大限度地:

    Form.ActiveForm.WindowState = FormWindowState.Minimized;
    Form.ActiveForm.WindowState = FormWindowState.Maximized;
在控件上单击事件

当我尝试将“this.”替换为“Form.ActiveForm.”时,在发布的第一个代码中,它返回以下错误:

“System.Windows.Forms.Form”不包含“mouseStarX”的定义,并且找不到接受“System.Windows.Forms.Form”类型的第一个参数的扩展方法“mousStartX”(是否缺少using指令或程序集引用?)


就这样,我不知道该怎么办

您可以使用一个简单的pinvoke通过控件移动表单

改编自,而不是使用
Form.ActiveForm
,您将使用
this.FindForm()
获取控件的父窗体。这里使用它传递窗体的句柄值:

public class MyHeader : Control {
  private const int WM_NCLBUTTONDOWN = 0xA1;
  private const int HT_CAPTION = 0x2;

  [DllImportAttribute("user32.dll")]
  private static extern int SendMessage(IntPtr hWnd, int Msg,
                                        int wParam, int lParam);
  [DllImportAttribute("user32.dll")]
  private static extern bool ReleaseCapture();

  protected override void OnMouseDown(MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
      ReleaseCapture();
      SendMessage(this.FindForm().Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    }
    base.OnMouseDown(e);
  }
}
要关闭表单,请使用相同的方法:

this.FindForm().Close();

有一个简单的pinvoke可用于通过控件移动窗体

改编自,而不是使用
Form.ActiveForm
,您将使用
this.FindForm()
获取控件的父窗体。这里使用它传递窗体的句柄值:

public class MyHeader : Control {
  private const int WM_NCLBUTTONDOWN = 0xA1;
  private const int HT_CAPTION = 0x2;

  [DllImportAttribute("user32.dll")]
  private static extern int SendMessage(IntPtr hWnd, int Msg,
                                        int wParam, int lParam);
  [DllImportAttribute("user32.dll")]
  private static extern bool ReleaseCapture();

  protected override void OnMouseDown(MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
      ReleaseCapture();
      SendMessage(this.FindForm().Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    }
    base.OnMouseDown(e);
  }
}
要关闭表单,请使用相同的方法:

this.FindForm().Close();

我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。顺便说一句,使用Windows窗体比使用C#作为编程语言要重要得多。对此表示抱歉。下次我会记住的。用Form.ActiveForm替换它根本没有任何意义。您希望使用自己的字段,而不是表单的属性。别这样,我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。顺便说一句,使用Windows窗体比使用C#作为编程语言要重要得多。对此表示抱歉。下次我会记住的。用Form.ActiveForm替换它根本没有任何意义。您希望使用自己的字段,而不是表单的属性。别那么做。