Если вы хотите, чтобы часть формы велась как заголовок, то способ WM_NCHITTEST
, который дал SLaks, - это путь.Но если вы хотите сделать дочернее окно способным перетаскивать форму, есть и другой способ.
Как правило, если вы отправите сообщение WM_SYSCOMMAND в DefWindowProc с идентификатором команды MOUSE_MOVE, то Windows перейдет в режим перетаскивания.Это, в основном, то, как это делает подпись, но вырезав посредника, мы можем инициировать это перетаскивание из дочернего окна, и мы не получаем всех других поведений подписи.
public class form1 : Form
{
...
[DllImport("user32.dll")]
static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, UIntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool ReleaseCapture(IntPtr hwnd);
const uint WM_SYSCOMMAND = 0x112;
const uint MOUSE_MOVE = 0xF012;
public void DragMe()
{
DefWindowProc(this.Handle, WM_SYSCOMMAND, (UIntPtr)MOUSE_MOVE, IntPtr.Zero);
}
private void button1_MouseDown(object sender, MouseEventArgs e)
{
Control ctl = sender as Control;
// when we get a buttondown message from a button control
// the button has capture, we need to release capture so
// or DragMe() won't work.
ReleaseCapture(ctl.Handle);
this.DragMe(); // put the form into mousedrag mode.
}