Домой Windows Form Привязка окон друг к другу при перетаскивании: Справочник по C#

Привязка окон друг к другу при перетаскивании: Справочник по C#

465
0


      Данная инструкция позволяет реализовать стыковку окон(форм), присоединяя дочерние формы к главному окну. Готовым примером работы данного функционала может послужить программа Winamp.
      Для реализации данного примера необходимо добавить в проект вторую форму. Для создания дочерней(второй) формы, перейдите в обозреватель решений и правой клавишей мыши щелкните но названию проекта, далее выберите Добавить-> Создать элемент и выберете «Фома Windows Form«.В код главной формы добавьте приведенный ниже код:

public bool down = false, //проверяет, пристыковано ли окно к нижней границе
left = false,  //проверяет, пристыковано ли окно к левой границе
top = false,   //проверяет, пристыковано ли окно к верхней границе
right = false; //проверяет, пристыковано ли окно к правой границе
public double leftlength, toplength;  //переменные нужны для вычисления смещения второго окна по отношению к главному

//Создаем объект второго окна
Form2 fr2 = new Form2();

В свойствах главной формы создаем событие LocationChanged и вставляем туда вот этот код:

//Стыковка с нижней границей главного окна
if (down)
{
//Второе окно оставляем у нижней границы главного окна путем смещения координаты верхней границы на значение высоты главного окна
fr2.Top = this.Top + this.Height;
//А левую границу второго окна смещаем относительно левой границы главного на величину leftlength, установленную в момент стыковки
fr2.Left = (int)this.Left + (int)leftlength;
}

//Соответственно поступаем и при стыковке с другими границами
//Стыковка с верхней границей главного окна
if (top)
{
fr2.Top = this.Top - fr2.Height;
fr2.Left = (int)this.Left + (int)leftlength;
}

//Стыковка с левой границей главного окна
if (left)
{
fr2.Left = this.Left - fr2.Width;
fr2.Top = (int)this.Top + (int)toplength;
}

//Стыковка с правой границей главного окна
if (right)
{
fr2.Left = this.Left + this.Width;
fr2.Top = (int)this.Top + (int)toplength;
}

Перейдите в код второй формы и также создайте событие LocationChanged. Вставьте приведенный ниже код:

Form1 fr1 = this.Owner as Form1;
//Стыковка с нижней границей главного окна
//Проверяем условия попадания верхней границы данного окна в пределы нижней границы главного окна
if ((this.Top < fr1.Top + fr1.Height + 20) && (this.Top > fr1.Top + fr1.Height - 20))
{
//Собственно стыковка
this.Top = fr1.Top + fr1.Height;
//Запоминаем смещение левой границы данного окна и левой границы главного окна (условие ввел для фиксации переменной, чтобы больше не изменять ее во время сеанса текущей стыковки)
if (!fr1.down) fr1.leftlength = this.Left - fr1.Left;
//Говорим главному окну, что произошла стыковка
fr1.down = true;
}
else fr1.down = false;

//Соответственно поступаем с остальными границами
//Стыковка с верхней границей главного окна
if ((this.Top + this.Height < fr1.Top + 20) && (this.Top + this.Height > fr1.Top - 20))
{
this.Top = fr1.Top - this.Height;
if (!fr1.top) fr1.leftlength = this.Left - fr1.Left;
fr1.top = true;
}
else fr1.top = false;

//Стыковка с левой границей главного окна
if ((this.Left + this.Width < fr1.Left + 20) && (this.Left + this.Width > fr1.Left - 20))
{
this.Left = fr1.Left - this.Width;
if (!fr1.left) fr1.toplength = this.Top - fr1.Top;
fr1.left = true;
}
else fr1.left = false;

//Стыковка с правой границей главного окна
if ((this.Left < fr1.Left + fr1.Width + 20) && (this.Left > fr1.Left + fr1.Width - 20))
{
this.Left = fr1.Left + fr1.Width;
if (!fr1.right) fr1.toplength = this.Top - fr1.Top;
fr1.right = true;
}
else fr1.right = false;

      Этот код реализует стыковку форм и позволяет перетаскивать главной формой состыкованные, и свободно перемещать формы по раздельности если они разъединены!

ЧИТАТЬ ТАКЖЕ:  Расчет номера недели для определенной даты: Справочник по C#

Ссылка для скачивания примера: Rusfolder.net

Привязка окон друг к другу при перетаскивании: Справочник по C#

0.00 (0%) 0 votes

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь