繁体   English   中英

从另一个类的控件拖动窗体

[英]Drag form with control from another class

首先,我对标题的意义不大表示歉意,因为我不知道最好的解释方法。

现在要真正解释一下。 我所做的是在Visual Studio 2013的类库项目中创建一个控件。该控件应充当将“ 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。 ”替换“ this。 ”时 ,在发布的第一个代码中-它返回此错误:

'System.Windows.Forms.Form'不包含'mouseStarX'的定义,并且找不到扩展方法'mousStartX'接受类型为'System.Windows.Forms.Form'的第一个参数(是否缺少using指令?或装配参考?)

就是这样,我不知道该怎么做。

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

改编自C#-使无边界表单可移动吗? ,而不是使用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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM