Как передвинуть форму с помощью мыши, если необходимо установить свойство FormBorderStyle в System.Windows.Forms.FormBorderStyle.None ?
Способ «В лоб»:
private Int32 tmpX; private Int32 tmpY; private bool flMove = false; private void frmMain_MouseDown(object sender, MouseEventArgs e) { tmpX = Cursor.Position.X; tmpY = Cursor.Position.Y; flMove = true; } private void frmMain_MouseMove(object sender, MouseEventArgs e) { if (flMove) { this.Left = this.Left + (Cursor.Position.X - tmpX); this.Top = this.Top + (Cursor.Position.Y - tmpY); tmpX = Cursor.Position.X; tmpY = Cursor.Position.Y; } } private void frmMain_MouseUp(object sender, MouseEventArgs e) { flMove = false; }
Способ «Хакерский»:
const int WM_NCHITTEST = 0x84; const int HTCAPTION = 2; const int HTCLIENT = 1; protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == WM_NCHITTEST && (int) m.Result == HTCLIENT) m.Result = (IntPtr) HTCAPTION; }
Еще один способ «Изящный хакерский»:
[DllImport("user32", CharSet = CharSet.Auto)] internal extern static bool PostMessage(IntPtr hWnd, uint Msg, uint WParam, uint LParam); [DllImport("user32", CharSet = CharSet.Auto)] internal extern static bool ReleaseCapture(); const uint WM_SYSCOMMAND = 0x0112; const uint DOMOVE = 0xF012; const uint DOSIZE = 0xF008; private void frmMain_MouseDown(object sender, MouseEventArgs e) { ReleaseCapture(); PostMessage(this.Handle, WM_SYSCOMMAND, DOMOVE, 0); }
P.S.
Список констант:
0xF001 .. 0xF008 = резайз 0xF020 = сворачивает окно или контрол (!!!) 0xF030 = максимизирует окно или контрол 0xF040 = z order — окно на задний план без потери фокуса ввода 0xF060 = закрыть окно 0xF00A = телепортирует мышку на заголовок окна или контрола 0xF00С .. 0xF00F = смешной резайс, ось X мышки перевернута