Есть ли способ сделать форму, у которой нет границы (FormBorderStyle имеет значение «none»), подвижной при щелчке мыши по форме, как если бы была граница?
109
В этой статье о CodeProject подробно описывается техника. Это в основном сводится к:
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.DllImport("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);
}
}
По сути , с точки зрения диспетчера окон, это происходит так же, как и захват строки заголовка окна.
Form1_MouseDown
не привязан к фактическомуMouseDown
событиюForm1
.this.MouseDown += ...
кMain()
функции для формыДавайте не будем усложнять вещи более сложными, чем они должны быть. Я встречал так много фрагментов кода, которые позволяют перетаскивать форму (или другой элемент управления). И у многих из них есть свои недостатки / побочные эффекты. Особенно те, где они обманывают Windows, заставляя думать, что Control в форме является реальной формой.
При этом вот мой фрагмент. Я использую это все время. Также хочу отметить, что вам не следует использовать this.Invalidate (); как и другие, потому что в некоторых случаях это вызывает мерцание формы. И в некоторых случаях так и происходит. Обновить. Используя this.Update, у меня не было проблем с мерцанием:
источник
Другой более простой способ сделать то же самое.
источник
используйте MouseDown, MouseMove и MouseUp. Вы можете установить для этого переменный флаг. У меня есть образец, но я думаю, что нужно переделать.
Я кодирую действие мыши на панели. Как только вы нажмете на панель, ваша форма переместится вместе с ней.
источник
Только WPF
у меня нет точного кода под рукой, но в недавнем проекте я думаю, что использовал событие MouseDown и просто поместил это:
Метод Window.DragMove (MSDN)
источник
Ref. ссылка на видео
Это проверено и легко понять.
источник
WM_NCHITTEST
замаскировано.Нет свойства, которое можно перевернуть, чтобы это произошло волшебным образом. Посмотрите на события формы, и становится довольно просто реализовать это, установив
this.Top
иthis.Left
. В частности, вы захотите посмотретьMouseDown
,MouseUp
иMouseMove
.источник
это может решить вашу проблему ....
источник
https://social.msdn.microsoft.com/Forums/vstudio/en-US/d803d869-68e6-46ff-9ff1-fabf78d6393c/how-to-make-a-borderless-form-in-c?forum=csharpgeneral
Этот фрагмент кода из приведенной выше ссылки помог в моем случае :)
источник
Лучший способ, который я нашел (конечно, модифицированный)
Чтобы применить перетаскивание к элементу управления, просто вставьте это после InitializeComponent ()
источник
Это сработало для Меня.
источник
Для .NET Framework 4
Вы можете использовать
this.DragMove()
дляMouseDown
события компонента (mainLayout в этом примере), который вы используете для перетаскивания.источник
Самый простой способ:
Сначала создайте этикетку с именем label1. Перейдите к событиям label1> события мыши> Label1_Mouse Move и напишите следующее:
источник
Я пытался сделать подвижную форму окон без полей, которая содержала элемент управления WPF Element Host и элемент управления WPF User.
Я получил панель стека под названием StackPanel в моем пользовательском элементе управления WPF, что казалось логичным, чтобы попробовать щелкнуть, чтобы переместиться. Попытка кода junmats сработала, когда я двигал мышь медленно, но если я перемещал мышь быстрее, мышь смещалась с формы, и форма застревала где-то в середине движения.
Это улучшило его ответ для моей ситуации с использованием CaptureMouse и ReleaseCaptureMouse, и теперь мышь не смещается с формы при ее перемещении, даже если я перемещаю ее быстро.
источник
Поскольку некоторые ответы не позволяют перетаскивать дочерние элементы управления, я создал небольшой вспомогательный класс. Следует пройти форму верхнего уровня. При желании можно сделать более универсальным.
источник
Также, если вам нужно использовать DoubleClick и увеличить / уменьшить форму, вы можете использовать ответ «Первый», создать глобальную переменную типа int, добавлять 1 каждый раз, когда пользователь нажимает на компонент, который вы используете для перетаскивания. Если
variable == 2
тогда сделайте вашу форму больше / меньше. Также используйте таймер на каждые полсекунды или секунды, чтобы сделать свойvariable = 0
;источник
Добавление
MouseLeftButtonDown
обработчика событий в MainWindow сработало для меня.В функцию события, которая создается автоматически, добавьте следующий код:
источник
Я расширяю решение от jay_t55 еще одним методом,
ToolStrip1_MouseLeave
который обрабатывает событие быстрого перемещения мыши и выхода из области.источник
Я попробовал следующее и presto changeo, мое прозрачное окно больше не застывало на месте, но его можно было переместить !! (выбросьте все эти другие сложные решения выше ...)
источник
Форма1 ():
new Moveable(control1, control2, control3);
Класс:
источник
источник