Как перетащить форму мышью не за заголовок на C#?

Как перетащить форму мышью не за заголовок на C#?

Как передвинуть форму с помощью мыши, если необходимо установить свойство 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 мышки перевернута
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *