Как переместить форму Windows, когда ее свойство FormBorderStyle установлено в None? - PullRequest
17 голосов
/ 07 августа 2009

Использование C #.
Я пытаюсь переместить Form без строки заголовка.
Я нашел статью об этом на: http://www.codeproject.com/KB/cs/csharpmovewindow.aspx

Это работает, пока я не установил FormBorderStyle как None.

Можно ли заставить его работать с этим свойством, установленным как None?

Ответы [ 5 ]

40 голосов
/ 05 августа 2010

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

/*
Constants in Windows API
0x84 = WM_NCHITTEST - Mouse Capture Test
0x1 = HTCLIENT - Application Client Area
0x2 = HTCAPTION - Application Title Bar

This function intercepts all the commands sent to the application. 
It checks to see of the message is a mouse click in the application. 
It passes the action to the base action by default. It reassigns 
the action to the title bar if it occured in the client area
to allow the drag and move behavior.
*/

protected override void WndProc(ref Message m)
{
    switch(m.Msg)
    {
        case 0x84:
            base.WndProc(ref m);
            if ((int)m.Result == 0x1)
                m.Result = (IntPtr)0x2;
            return;
    }

    base.WndProc(ref m);
}

Это позволит перемещать любую форму, щелкая и перетаскивая ее в пределах клиентской области.

38 голосов
/ 27 августа 2010

Вот это лучший способ, который я нашел. Это «путь .NET», без использования WndProc. Вам просто нужно обработать события MouseDown, MouseMove и MouseUp поверхностей, которые вы хотите перетаскивать.

private bool dragging = false;
private Point dragCursorPoint;
private Point dragFormPoint;

private void FormMain_MouseDown(object sender, MouseEventArgs e)
{
    dragging = true;
    dragCursorPoint = Cursor.Position;
    dragFormPoint = this.Location;
}

private void FormMain_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        Point dif = Point.Subtract(Cursor.Position, new Size(dragCursorPoint));
        this.Location = Point.Add(dragFormPoint, new Size(dif));
    }
}

private void FormMain_MouseUp(object sender, MouseEventArgs e)
{
    dragging = false;
}
2 голосов
/ 13 ноября 2016

У меня был тот же вопрос некоторое время назад, и во время поиска ответа я нашел код ниже (не помню сайт) и вот что я делаю:

    Point mousedownpoint = Point.Empty;

    private void Form_MouseDown(object sender, MouseEventArgs e)
    {
        mousedownpoint = new Point(e.X, e.Y);
    }

    private void Form_MouseMove(object sender, MouseEventArgs e)
    {

        if (mousedownpoint.IsEmpty)
            return;
        Form f = sender as Form;
        f.Location = new Point(f.Location.X + (e.X - mousedownpoint.X), f.Location.Y + (e.Y - mousedownpoint.Y));

    }

    private void Form_MouseUp(object sender, MouseEventArgs e)
    {
        mousedownpoint = Point.Empty;
    }
0 голосов
/ 14 марта 2018

Точка mousedownpoint = Point.Empty;

    private void Form_MouseDown(object sender, MouseEventArgs e)
    {
        mousedownpoint = new Point(e.X, e.Y);
    }

    private void Form_MouseMove(object sender, MouseEventArgs e)
    {

        if (mousedownpoint.IsEmpty)
            return;
        Form f = sender as Form;
        f.Location = new Point(f.Location.X + (e.X - mousedownpoint.X), f.Location.Y + (e.Y - mousedownpoint.Y));

    }

    private void Form_MouseUp(object sender, MouseEventArgs e)
    {
        mousedownpoint = Point.Empty;
    }

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        Form_MouseDown(this, e);
    }

    private void panel1_MouseUp(object sender, MouseEventArgs e)
    {
        Form_MouseUp(this, e);
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        Form_MouseMove(this, e);
    }
0 голосов
/ 02 ноября 2015

Сначала нам нужно будет использовать сервисы взаимодействия, используя пространство имен как

using System.Runtime.InteropServices;

Следующим шагом будет определение сообщений, которые позаботятся о перемещении формы. Мы будем иметь их как переменные-члены класса

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();

и, наконец, мы напишем код для отправки сообщения всякий раз, когда пользователь нажимает кнопку мыши. Форма будет перемещена в соответствии с движением мыши, если пользователь удерживает кнопку мыши нажатой.

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    ReleaseCapture();
    SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
}

Ссылка на ссылку Перетаскиваемая форма

Кредиты Рахул-Раджат-Сингх

...