Проектирование графического интерфейса пользователя______________273

Параметр ScreenPos этого метода определяет положение и размер компонента
после его перевода в состояние плавающего окна.

Например, вы можете открыть свое тестовое приложение (рис. 4.14) и ввести в
него кнопку, которая будет переводить в состояние плавающего окна, например,
панель Рапе13. Текст обработчика щелчка на такой кнопке может быть следую-
щим:

TRect TempRect;

TPoint P;

Р = Panel3->ClientToScreen(Point(0, 0)) ;

TempRect.Left = P.x;

TempRect.Top = P.y;

P = Panel3->ClientToScreen(Point(Panel3->UndockWidth,
Panel3->UndockHeight)) ;

TempRect.Right = P.x;

TempRect.Bottom = P.y;

Panel3->ManualFloat(TempRect) ;

В этом коде вводится переменная TempRect, в которой формируется прямо-
угольник, определяющий размер и местоположение генерируемого плавающего
окна. Этот прямоугольник восстанавливает размер панели Рапе13, бывший у нее в
последний раз, когда она отображалась плавающим окном. Левый верхний угол
прямоугольника совпадает с текущим положением панели. Для правильного
размещения окна координаты с помощью метода ClientToScreen переводятся в ко-
ординаты экрана. Последний оператор методом ManualFloat генерирует плаваю-
щее окно.

И последний метод, который мы рассмотрим — ManualDock, размещающий
компонент в указанном приемнике. Его описание:

bool _fastcall ManualDock(TWinControl* NewDockSite,

TControl* DropControl, TAlign ControlSide);

Параметр NewDockSite определяет приемник, в котором должен размещаться
клиент. Второй параметр DropControl определяет другой компонент в приемнике
NewDockSite, который должен разместить данного клиента. Как правило, этот па-
раметр задается равным NULL. Параметр ControlSide определяет выравнивание
клиента внутри приемника. Если это единственный клиент в приемнике, то значе-
ние этого параметра безразлично. Но если там уже есть клиенты, то задание, на-
пример, ControlSide = alLeft приведет к перестановке, если только данный клиент
не самый левый в приемнике.

Можете ввести в свое тестовое приложение кнопку, снабдив ее обработчиком:

Panel4->ManualDock(Panel I,NULL,alLeft) ;

Этот обработчик будет размещать Pnalel4 в Panell, выравнивая ее по левому
краю приемника, если в нем расположены еще какие-нибудь клиенты.

В заключение обратим внимание на одно нестандартное использование мето-
дов ManualFloat и ManualDock. Пусть, например, вы хотите иметь форму, содер-
жащую несколько панелей, которые пользователь мог бы перемещать, не переводя
их в состояние плавающего окна и не изменяя размеров. Тогда вы можете в форме
установить DockSite = true, сделать в панелях установки свойств DragKind в
dkDock и DragMode в dmAutomatic, а в событии формы OnCreate выполнить для
каждой панели методы ManualFloat и ManualDock, назначив приемником в Ma-
nualDock форму. Вы получите приложение, в котором пользователь сможет пере-
мещать мышью панели. Это может быть полезно в каких-то приложениях, связан-
ных с проектированием топологии или конструированием. Подобные задачи будут
рассмотрены в следующем разделе.