Переместить окно без рамки - PullRequest
11 голосов
/ 02 января 2011

Как мне переместить окно, у которого нет границы.В приложении нет свободного места, все, что доступно, это веб-браузер и меню.Я бы хотел, чтобы пользователи могли перемещать окно, перетаскивая полосу меню.Как мне это написать?Я пробовал несколько блоков кода, которые нашел в Интернете, но ни один из них не работал.

Ответы [ 8 ]

16 голосов
/ 03 января 2011

Эта статья Code Project поможет вам в этом. Я использовал это сам без проблем. Это суть этого:

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, System.Windows.Forms.MouseEventArgs e)
{     
    if (e.Button == MouseButtons.Left)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    }
}

Это в основном "обманет" оконный менеджер, заставив его думать, что он захватывает строку заголовка winform.

Чтобы применить его к вашему проекту, просто используйте событие MouseDown из MenuStrip.

11 голосов
/ 14 октября 2013

Вот .Net Way

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

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

    private void Form1_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 Form1_MouseUp(object sender, MouseEventArgs e)
    {
        dragging = false;
    }

вот и все.

0 голосов
/ 22 февраля 2017

Просто поместите начальную точку в 2D-массив следующим образом:

public partial class mainForm : Form
{
    //Global variables for Moving a Borderless Form
    private bool dragging = false;
    private Point startPoint = new Point(0, 0); 


    public mainForm()
    {
        InitializeComponent();
    }

    private void mainForm_MouseDown(object sender, MouseEventArgs e)
    {
        dragging = true;
        startPoint = new Point(e.X, e.Y);

    }

    private void mainForm_MouseUp(object sender, MouseEventArgs e)
    {
        dragging = false;
    }

    private void mainForm_MouseMove(object sender, MouseEventArgs e)
    {
        if (dragging)
        {
            Point p = PointToScreen(e.Location);
            Location = new Point(p.X - this.startPoint.X, p.Y - this.startPoint.Y);

        }

    }
}
0 голосов
/ 07 января 2017

Мне пришлось использовать System.Runtime.InteropServices.DllImportAttribute - просто подумал, что прокомментирую и дам вам все знать.

0 голосов
/ 11 декабря 2013

Mbithi Kioko на верном пути, но я бы сделал это так.

    bool dragging = false;
    int xOffset = 0;
    int yOffset = 0;

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        dragging = true;

        xOffset = Cursor.Position.X - this.Location.X;
        yOffset = Cursor.Position.Y - this.Location.Y;
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (dragging)
        {
            this.Location = new Point(Cursor.Position.X - xOffset, Cursor.Position.Y - yOffset);
            this.Update();
        }
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        dragging = false;
    }
0 голосов
/ 26 июля 2013

Если вы используете Panel, вы должны добавить это в

YourForm.Designer.cs

this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown);

и это в

YourForm.cs

 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 panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ReleaseCapture();
                SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
            }
        }
0 голосов
/ 03 января 2011

Я не пробовал, но если вы можете обрабатывать события "OnMouseDown" и "onMouseUp" в строке меню:

  • При нажатии мыши - перемещение окна в соответствии с движением мыши
  • Прекратить отслеживание движения мыши вверх или вниз
0 голосов
/ 02 января 2011

Вы можете подделать свою менструацию, например, используя вместо нее панель с меткой. И затем вы можете справиться с этим вручную: когда пользователь щелкает ярлык, открывается всплывающее меню, а когда пользователь перетаскивает ярлык, окно перемещается. Но я бы посоветовал против таких обходных путей, потому что это не стандартное поведение графического интерфейса, и вы могли бы запутать своих пользователей.

...