Как перетащить форму мышью не за заголовок на C#?
автор evteev, Мар.09, 2013, рубрики C/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 мышки перевернута
Советуем портал Softout.Ru как каталог с возможностью бесплатно скачать программы для любых целей.