Т.е. такой формы, у которой FormBorderStyle
установлен в None
Вариант 1, это прописать в обработчике MouseDown вот такой код:
base.Capture = false;
Message m = Message.Create(base.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);
this.WndProc(ref m);
Вариант простой, форма будет перетаскиваться, как обычная форма, только за любую ее точку, а не за заголовок.
private Point mouseOffset;
private bool isMouseDown = false;
private void frmTest_MouseDown(object sender, MouseEventArgs e)
{
int xOffset;
int yOffset;
if (e.Button == MouseButtons.Left)
{
xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
yOffset = -e.Y - SystemInformation.CaptionHeight -
SystemInformation.FrameBorderSize.Height;
mouseOffset = new Point(xOffset, yOffset);
isMouseDown = true;
}
}
private void frmTest_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mouseOffset.X, mouseOffset.Y);
Location = mousePos;
}
}
private void frmTest_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown = false;
}
}
Форма также перетаскивается за любую точку формы, но, нужно несколько обработчиков событий, при перетаскивании форма будет перерисовываться вся, а не как обычно, когда появляется только рамка перетаскивания, и к тому же форма чуть-чуть дернется в начале перетаскивания, после нажатия левой кнопки мыши. Но если надо, чтоб во время перетаскивания она вся перерисовывалась, то вариант использовать второй способ.