Сделать форму без полей подвижной?

Есть ли способ сделать форму, у которой нет границы (FormBorderStyle установлен в "none"), подвижной, когда мышь щелкает по форме, как если бы была граница?

90 голосов | спросил user 20 +04002009-10-20T10:53:51+04:00312009bEurope/MoscowTue, 20 Oct 2009 10:53:51 +0400 2009, 10:53:51

16 ответов


0

В этой статье о CodeProject подробно описывается методика. В основном сводится к:

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;

[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.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);
    }
}

По сути, это точно аналогично захвату строки заголовка окна с точки зрения менеджера окон.

ответил Joey 20 +04002009-10-20T10:58:52+04:00312009bEurope/MoscowTue, 20 Oct 2009 10:58:52 +0400 2009, 10:58:52
0

Давайте не будем делать вещи сложнее, чем они должны быть. Я сталкивался с таким количеством фрагментов кода, которые позволяют перетаскивать форму (или другой элемент управления). И многие из них имеют свои недостатки /побочные эффекты. Особенно те, в которых они вводят Windows в заблуждение, что элемент управления формы является действительной формой.

Как говорится, вот мой фрагмент. Я пользуюсь этим все время. Я также хотел бы отметить, что вы не должны использовать this.Invalidate (); как другие любят делать, потому что это вызывает мерцание формы в некоторых случаях. И в некоторых случаях это так. Обновить. Используя this.Update, у меня не было никаких мерцающих проблем:

private bool mouseDown;
private Point lastLocation;

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        mouseDown = true;
        lastLocation = e.Location;
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if(mouseDown)
        {
            this.Location = new Point(
                (this.Location.X - lastLocation.X) + e.X, (this.Location.Y - lastLocation.Y) + e.Y);

            this.Update();
        }
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        mouseDown = false;
    }
ответил jay_t55 3 J000000Thursday14 2014, 23:32:24
0

Еще один более простой способ сделать то же самое.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        // set this.FormBorderStyle to None here if needed
        // if set to none, make sure you have a way to close the form!
    }
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_NCHITTEST)
            m.Result = (IntPtr)(HT_CAPTION);
    }

    private const int WM_NCHITTEST = 0x84;
    private const int HT_CLIENT = 0x1;
    private const int HT_CAPTION = 0x2;
}
ответил elimad 11 J000000Friday14 2014, 10:10:15
0

только WPF


У

нет точного кода, но я думаю, что в недавнем проекте я использовал событие MouseDown и просто выразил это:

frmBorderless.DragMove();

Window.DragMove Метод (MSDN)

ответил Chris 20 +04002009-10-20T11:05:16+04:00312009bEurope/MoscowTue, 20 Oct 2009 11:05:16 +0400 2009, 11:05:16
0

Ref. Ссылка на видео

Это проверено и легко понять.

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);
}
ответил Gnana Akilan 10 FebruaryEurope/MoscowbTue, 10 Feb 2015 20:19:56 +0300000000pmTue, 10 Feb 2015 20:19:56 +030015 2015, 20:19:56
0

Нет никакого свойства, которое можно было бы перевернуть, чтобы это произошло просто волшебным образом. Посмотрите на события для формы, и это становится довольно тривиально реализовать, установив this.Top и this.Left. В частности, вы захотите взглянуть на MouseDown, MouseUp и MouseMove.

ответил Matthew Scharley 20 +04002009-10-20T10:56:56+04:00312009bEurope/MoscowTue, 20 Oct 2009 10:56:56 +0400 2009, 10:56:56
0
public Point mouseLocation;
private void frmInstallDevice_MouseDown(object sender, MouseEventArgs e)
{
  mouseLocation = new Point(-e.X, -e.Y);
}

private void frmInstallDevice_MouseMove(object sender, MouseEventArgs e)
{
  if (e.Button == MouseButtons.Left)
  {
    Point mousePos = Control.MousePosition;
    mousePos.Offset(mouseLocation.X, mouseLocation.Y);
    Location = mousePos;
  }
}

это может решить твою проблему ....

ответил Syed Ali 21 FebruaryEurope/MoscowbThu, 21 Feb 2013 11:41:55 +0400000000amThu, 21 Feb 2013 11:41:55 +040013 2013, 11:41:55
0

Лучший способ, который я нашел (модифицированный, конечно)

// This adds the event handler for the control
private void AddDrag(Control Control) { Control.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DragForm_MouseDown); }
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();

private void DragForm_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
        // Checks if Y = 0, if so maximize the form
        if (this.Location.Y == 0) { this.WindowState = FormWindowState.Maximized; }
    }
}

Чтобы применить перетаскивание к элементу управления, просто вставьте его после InitializeComponent ()

AddDrag(NameOfControl);
ответил Ricky Divjakovski 20 J000000Thursday17 2017, 17:15:16
0

https://social.msdn.microsoft.com/Forums/vstudio/en-US/d803d869-68e6-46ff-9ff1-fabf78d6393c/how-to-make- а-полей форм-в-с? форуме = csharpgeneral

Этот фрагмент кода по приведенной выше ссылке помог мне в моем случае:)

protected override void OnMouseDown(MouseEventArgs e)  

{
      base.OnMouseDown(e);
      if (e.Button == MouseButtons.Left)
      {
        this.Capture = false;
        Message msg = Message.Create(this.Handle, 0XA1, new IntPtr(2), IntPtr.Zero);
        this.WndProc(ref msg);
      }
}
ответил Abhirath Mahipal 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 26 Sep 2016 09:44:49 +0300 2016, 09:44:49
0

Для .NET Framework 4,

Вы можете использовать this.DragMove() для MouseDown событие компонента (mainLayout в этом примере), который вы используете для перетаскивания.

private void mainLayout_MouseDown(object sender, MouseButtonEventArgs e)
{
    this.DragMove();
}
ответил Neeraj Kumar Das 23 PMpSat, 23 Apr 2016 16:57:09 +030057Saturday 2016, 16:57:09
0

Кроме того, если вам нужно DoubleClick и сделать форму больше /меньше, вы можете использовать первый ответ, создать глобальную переменную int, добавить 1 каждый раз, когда пользователь нажимает на компонент, который вы используете для перетаскивания. Если variable == 2, тогда увеличьте /уменьшите вашу форму. Также используйте таймер на каждые полсекунды или секунды, чтобы ваш variable = 0;

ответил Billy Xd 16 32016vEurope/Moscow11bEurope/MoscowWed, 16 Nov 2016 23:10:03 +0300 2016, 23:10:03
0

Самый простой способ:

Сначала создайте метку с именем label1. Перейти к событиям label1> события мыши> Label1_Mouse Переместите и напишите:

if (e.Button == MouseButtons.Left){
    Left += e.X;
    Top += e.Y;`
}
ответил user7500524 1 FebruaryEurope/MoscowbWed, 01 Feb 2017 16:00:31 +0300000000pmWed, 01 Feb 2017 16:00:31 +030017 2017, 16:00:31
0

Я пытался сделать форму окон без полей подвижной, которая содержала элемент управления WPF Element Host и элемент управления пользователя WPF.

Я получил панель стека StackPanel в своем пользовательском элементе управления WPF, которая казалась логичной попыткой щелкнуть, чтобы переместиться. Попытка кода junmats работала, когда я медленно двигал мышь, но если бы я двигал мышь быстрее, мышь уходила из формы, и форма застревала где-то в середине движения.

Это улучшило его ответ на мою ситуацию с использованием CaptureMouse и ReleaseCaptureMouse, и теперь мышь не сдвигается с формы при ее перемещении, даже если я перемещаю ее быстро.

private void StackPanel_MouseDown(object sender, MouseButtonEventArgs e)
{
    _start_point = e.GetPosition(this);
    StackPanel.CaptureMouse();
}

private void StackPanel_MouseUp(object sender, MouseButtonEventArgs e)
{
    StackPanel.ReleaseMouseCapture();
}

private void StackPanel_MouseMove(object sender, MouseEventArgs e)
{
    if (StackPanel.IsMouseCaptured)
    {
        var p = _form.GetMousePositionWindowsForms();
        _form.Location = new System.Drawing.Point((int)(p.X - this._start_point.X), (int)(p.Y - this._start_point.Y));
    }
}

    //Global variables;
    private Point _start_point = new Point(0, 0);
ответил Mike Sage 10 AM000000120000003231 2016, 00:22:32
0

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

class MouseDragger
{
    private readonly Form _form;
    private Point _mouseDown;

    protected void OnMouseDown(object sender, MouseEventArgs e)
    {
        _mouseDown = e.Location;
    }

    protected void OnMouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            int dx = e.Location.X - _mouseDown.X;
            int dy = e.Location.Y - _mouseDown.Y;
            _form.Location = new Point(_form.Location.X + dx, _form.Location.Y + dy);
        }
    }
    public MouseDragger(Form form)
    {
        _form = form;

        MakeDraggable(_form);            
    }

    private void MakeDraggable(Control control)
    {
        var type = control.GetType();
        if (typeof(Button).IsAssignableFrom(type))
        {
            return;
        }

        control.MouseDown += OnMouseDown;
        control.MouseMove += OnMouseMove;

        foreach (Control child in control.Controls)
        {
            MakeDraggable(child);
        }
    }
}
ответил Sebastian 20 J0000006Europe/Moscow 2018, 12:54:21
0

Добавление обработчика событий MouseLeftButtonDown в MainWindow мне помогло.

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

base.OnMouseLeftButtonDown(e);
this.DragMove();
ответил Aparna Ratheesh 19 J0000006Europe/Moscow 2018, 10:45:05
0

Я попробовал следующее и перед сменой, мое прозрачное окно больше не было заморожено на месте, но могло быть перемещено !! (выбросьте все эти сложные решения выше ...)

   private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonDown(e);
        // Begin dragging the window
        this.DragMove();
    }
ответил RoySeberg 20 J000000Friday18 2018, 19:04:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132