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

Есть ли способ сделать форму, которая не имеет границы (для параметра FormBorderStyle установлено значение «none»), если мышь нажата на форму так же, как если бы была граница?

Эта статья о 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); } } 

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

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

Это, как говорится, вот мой fragment. Я использую это все время. Я также хотел бы отметить, что вы не должны использовать 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) + eX, (this.Location.Y - lastLocation.Y) + eY); this.Update(); } } private void Form1_MouseUp(object sender, MouseEventArgs e) { mouseDown = false; } 

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

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

используйте MouseDown, MouseMove и MouseUp. Вы можете установить для него флаг переменной. У меня есть образец, но я думаю, вам нужно пересмотреть.

Я кодирую действие мыши на панель. Как только вы нажмете на панель, ваша форма будет перемещаться вместе с ней.

 //Global variables; private bool _dragging = false; private Point _offset; private Point _start_point=new Point(0,0); private void panel1_MouseDown(object sender, MouseEventArgs e) { _dragging = true; // _dragging is your variable flag _start_point = new Point(eX, eY); } private void panel1_MouseUp(object sender, MouseEventArgs e) { _dragging = false; } private void panel1_MouseMove(object sender, MouseEventArgs e) { if(_dragging) { Point p = PointToScreen(e.Location); Location = new Point(pX - this._start_point.X,pY - this._start_point.Y); } } 

Только WPF


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

 frmBorderless.DragMove(); 

Метод Window.DragMove (MSDN)

Ссылка видео Ссылка

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

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

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

 public Point mouseLocation; private void frmInstallDevice_MouseDown(object sender, MouseEventArgs e) { mouseLocation = new Point(-eX, -eY); } 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; } } 

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

Для .NET Framework 4,

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

 private void mainLayout_MouseDown(object sender, MouseButtonEventArgs e) { this.DragMove(); } 

https://social.msdn.microsoft.com/Forums/vstudio/en-US/d803d869-68e6-46ff-9ff1-fabf78d6393c/how-to-make-a-borderless-form-in-c?forum=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); } } 

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

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

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

 if (e.Button == MouseButtons.Left){ Left += eX; Top += eY;` } 

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

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

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

 AddDrag(NameOfControl); 

Я пытался сделать перемещаемую без полей форму windows, которая содержала элемент управления элементом элемента WPF и пользовательский элемент управления 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)(pX - this._start_point.X), (int)(pY - this._start_point.Y)); } } //Global variables; private Point _start_point = new Point(0, 0); 

Добавление MouseLeftButtonDown событий MouseLeftButtonDown к MainWindow работало для меня.

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

 base.OnMouseLeftButtonDown(e); this.DragMove(); 

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

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

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

  private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { base.OnMouseLeftButtonDown(e); // Begin dragging the window this.DragMove(); } 
  • Лучший способ обновить DataGridView при обновлении базового источника данных
  • Как найти элемент управления, который я добавил в форму?
  • передавать значение из одной формы в другую
  • Как вы показываете анимированные GIF-файлы в форме Windows (c #)
  • Как сохранить массив int в настройках приложения
  • Слабые справочные преимущества
  • Создание контроля прозрачным
  • Выделить событие с текстовым полем?
  • Изменение пользовательского агента элемента управления WebBrowser
  • Общий базовый class для WinForm UserControl
  • UI Design Pattern для Windows Forms (например, MVVM для WPF)
  • Interesting Posts

    Местное уведомление о прекращении подачи заявки

    Понимание размеров сетки CUDA, размеров блоков и организации streamов (простое объяснение)

    Как отключить загрузку файлов в Internet Explorer?

    Как подключиться к базе данных JDBC / источнику данных в приложении на основе сервлета?

    шестнадцатеричная плавающая константа в C

    Ошибка сборки maven: невозможно найти компилятор Javac в: jre или jdk issue

    Intent не устанавливает параметры камеры

    как преобразовать System :: String в const char *?

    C ++. Какова цель литья в пустоту?

    Как я могу получить доступ к томам, зашифрованным с помощью LUKS / dm-crypt из Windows?

    Отправка электронной почты с приложением через GMailSender?

    Как эффективно случайным образом выбирать элемент массива без повторов?

    процент на y lab в гранжевом барграфе ggplot?

    Как перенаправить URL-адрес на определенный IP-адрес, например, с / etc / hosts?

    Ноутбук SONY Viao делает высокий шум. Зачем?

    Давайте будем гением компьютера.