C# Windows Forms. Перетаскивание формы без границ. Перетаскивание формы не за заголовок.

Т.е. такой формы, у которой FormBorderStyle установлен в None

Вариант 1, это прописать в обработчике MouseDown вот такой код:

base.Capture = false;
Message m = Message.Create(base.Handle, 0xa1, new IntPtr(2), IntPtr.Zero);
this.WndProc(ref m);

Вариант простой, форма будет перетаскиваться, как обычная форма, только за любую ее точку, а не за заголовок.

Вариант №2 вот такой:

        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;
            }
        }

Форма также перетаскивается за любую точку формы, но, нужно несколько обработчиков событий, при перетаскивании форма будет перерисовываться вся, а не как обычно, когда появляется только рамка перетаскивания, и к тому же форма чуть-чуть дернется в начале перетаскивания, после нажатия левой кнопки мыши. Но если надо, чтоб во время перетаскивания она вся перерисовывалась, то вариант использовать второй способ.

Код раз Проект раз
Код два Проект два
Источник Копия

Добавить комментарий

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