首先,如果标题没有多大意义,我很抱歉,因为我不知道最好的解释方法。
现在要真正解释一下。我所做的是在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;
关于控件的点击事件。
当我尝试将“this。”替换为“Form.ActiveForm。”时,在发布的第一个代码中 - 它返回此错误:
'System.Windows.Forms.Form'不包含'mouseStarX'的定义,并且没有扩展方法'mousStartX'接受类型'System.Windows.Forms.Form'的第一个参数可以找到(你错过了吗?) using指令或程序集引用?)
就是这样,我不知道怎么回事。
答案 0 :(得分:1)
您可以使用简单的pinvoke通过您的控件移动表单。
改编自C# - Make a borderless form movable?,而不是使用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();