Как двигать окном если ее форма не стандартная? C#

Всем привет! Бывает при разработке программы, мы можем создать не стандартную форму приложения, или отключить границы окна. В таком случаи у нас загрузиться программа но мы не сможем ее двигать.

Для того что бы создать форму в качестве картинки вам нужно использовать изображение в Background или если у вас геометрическая фигура в виде формы тогда следующий код:

Title="MainWindow" Height="450" Width="800"  AllowsTransparency="True" WindowStyle="None" Background="{x:Null}" MouseLeftButtonDown="Window_MouseLeftButtonDown" >

Как мы видим Background просто присваиваем Null если этого не сделать будет виден фон формы.

Решение WPF:

Достаточно обработать событие при нажатии левой кнопкой мыши по форме и вызвать всего лишь один метод DragMove(); который позволит перетаскивать окно за любую область.

 private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            // Для перетаскивания окна за любую область.
            DragMove();
        }

 

Альтернативное решение.

Для перемещения окна без формы заголовка можем воспользоваться winapi. Нам так же необходимо создать обработчик при нажатии кнопки мыши. Целый листинг кода ниже:

	[DllImport("user32", CharSet = CharSet.Auto)]
		internal extern static bool PostMessage(IntPtr hWnd, uint Msg, uint WParam, uint LParam);

		[DllImport("user32", CharSet = CharSet.Auto)]
		internal extern static bool ReleaseCapture();

		const uint WM_SYSCOMMAND = 0x0112;
		const uint DOMOVE = 0xF012;
		const uint DOSIZE = 0xF008;
		
		
		public Form1()
		{
			InitializeComponent();

			//	this.FormBorderStyle = FormBorderStyle.None;
			//	this.MouseDown += new MouseEventHandler(Form1_MouseDown);
			//	this.MouseDown += new MouseEventHandler(label1_MouseDown);

			this.FormBorderStyle = FormBorderStyle.None;
			this.MouseDown += new MouseEventHandler(Form1_MouseDown);
		}
		
		
			private void Form1_MouseDown(object sender, MouseEventArgs e)
		{
			

			ReleaseCapture();
			PostMessage(this.Handle, WM_SYSCOMMAND, DOMOVE, 0);
		}

 

Такой пример можно использовать и для Winform приложений.

Обновлено: 05.03.2021 — 08:20

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.