Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2010, 18:26   #1
Alexxx5800
 
Регистрация: 08.10.2010
Сообщений: 4
По умолчанию Привязка окон друг к другу при перетаскивании

Доброго времени суток!
Огромная просьба подсказать, как в Windows Forms реализовать возможность привязки или состыковки окон друг с другом при перетаскивании?

Аналогия - Winamp.

Например, имеется главное окно и плейлист. В состыкованном положении при перемещении главного окна плейлист тянется за ним. При перемещении плейлиста он отделяется от главного окна и перемещается затем отдельно, независимо от главного окна. Если я плейлист перемещаю к границе главного окна, он примагничивается к главному окну, и теперь при перемещении главного окна плейлист снова тянется за ним.

Как реализовать такую возможность в Visual Studio в проекте Windows Forms?
Alexxx5800 вне форума Ответить с цитированием
Старый 10.10.2010, 20:19   #2
Alexxx5800
 
Регистрация: 08.10.2010
Сообщений: 4
По умолчанию

Немножко подумал и сделал сам )). Решение основано на небольших вычислениях.

Для этого используем событие LocationChanged() обоих окон. Собственно оно и является событием перемещения окна по экрану. При перемещении второго окна проверяется условие, вошло ли оно в пределы границ главного окна. Если да, то происходит стыковка и установка соответствующих переменных (введены 4 булевых переменных для фиксирования факта самой стыковки для каждой из границ, а также 2 численные переменные для сохранения значений смещения окон друг относительно друга)

Если установилась какая-либо из 4 булевых переменных, в событии LocationChanged() главного окна выполняется код, который позволяет тянуть второе окно за главным при перемещении. Программа оперирует только свойствами Top и Left обеих окон.

В общем, лучше все наглядно покажет программный код с комментариями.

Код главного окна:

Код:
 public partial class MainWindow : Window
    {
        public bool down = false,  //проверяет, пристыковано ли окно к нижней границе
                    left = false,  //проверяет, пристыковано ли окно к левой границе
                    top = false,   //проверяет, пристыковано ли окно к верхней границе
                    right = false; //проверяет, пристыковано ли окно к правой границе
        public double leftlength, toplength;  //переменные нужны для вычисления смещения второго окна по отношению к главному
        //Создаем объект второго окна
        Window1 win1 = new Window1();

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //Устанавливаем данное главное окно владельцем второго окна
            win1.Owner = this;
            win1.Show();
        }

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

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

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

            //Стыковка с правой границей главного окна
            if (right)
            {
                win1.Left = this.Left + this.Width;
                win1.Top = this.Top + toplength;
            }
        }
    }
Alexxx5800 вне форума Ответить с цитированием
Старый 10.10.2010, 20:19   #3
Alexxx5800
 
Регистрация: 08.10.2010
Сообщений: 4
По умолчанию

Код второго окна:

Код:
public partial class Window1 : Window
    {
        
        public Window1()
        {
            InitializeComponent();
            
        }

        private void Window_LocationChanged(object sender, EventArgs e)
        {
            //Создаем объект главного окна, чтобы использовать его переменные
            MainWindow main = this.Owner as MainWindow;

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Данные по столбцам - упорядочить данные к друг другу PetroD Microsoft Office Excel 10 07.08.2010 12:30
При перетаскивании не изменять формат ячейки. agregator Microsoft Office Excel 4 17.11.2009 19:17
Как сделать так, что-бы при перетаскивании файла драг&дроп-ом на мою форму, он открывался??? Altera Общие вопросы Delphi 2 11.04.2008 15:00
Как открывать песню при ее перетаскивании на ярлык програмы SeRhy Общие вопросы Delphi 2 14.03.2008 18:50