Данная инструкция позволяет реализовать стыковку окон(форм), присоединяя дочерние формы к главному окну. Готовым примером работы данного функционала может послужить программа 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;
Этот код реализует стыковку форм и позволяет перетаскивать главной формой состыкованные, и свободно перемещать формы по раздельности если они разъединены!
Ссылка для скачивания примера: Rusfolder.net
0.00 (0%) 0 votes









