В VCL библиотеке реализована также технология перетаскивания и встраивания оконных объектов (Drag&Drop).
Приемник, способный принимать переносимые компоненты (клиенты), принято называть контейнером. Если для оконного компонента установить свойство DockSite = true, то он становится контейнером. Свойство приемника UseDockManager = true определяет автоматическое встраивание клиента в приемник. Это не всегда желательно, так как размер и выравнивание компонент в приемнике тоже выбираются автоматически.
Для потенциальных клиентов следует установить свойство DragKind = dkDock. DragMode = dmAutomatic означает, что процесс перетаскивания начинается автоматически.
Для создания тестового примера следует начать новое приложение и разместить на форме один компонент-панель (Panel1) и два компонента класса Image (Image1 и Image2), загрузить в эти компоненты изображения из битовых файлов (свойство Picture). Следующие упражнения помогут разобраться в значениях свойств:
Установить для Form1 и Panel1 свойство DockSite = true; для Image1, Image2 DragKind=dkDock, а DragMode = dmAutomatic. Протестировать приложение.
Дополнительно для Panel1 установить UseDockManager = true. Протестировать приложение.
На рисунке показана картинка в состоянии плавающего окна и размещенная в компоненте Panel1. Перевести размещенный компонент в состояние плавающего окна можно и в процессе выполнения программы. Метод ManualFloat имеет единственный параметр типа TRect, который определяет положение и размещение плавающего окна.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TRect temp;
temp.Left=Form1->Left+30;
temp.Top=Form1->Top+40;;
temp.Right=temp.Left+200;
temp.Bottom=temp.Top+100;
Image2->ManualFloat(temp);
}
Следующий код плавающий объект размещает на форме:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TRect temp;
TPoint p;
p=Image2->ClientToScreen(Point(0,0));
temp.Left=p.x;
temp.Top=p.y;
p=Image2->ClientToScreen(Point(160,80));
temp.Right=p.x;
temp.Bottom=p.y;
Image2->ManualFloat(temp);
Image2->ManualDock(Form1,NULL,alLeft);
}
Если при создании формы в обработчике OnCreate разместить следующие операторы, то можно будет свободно перемещать картинки мышью по форме, а за пределами формы, когда картинки будут помещены в самостоятельно плавающие окна, можно будет изменять их размеры.
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TRect temp;
TPoint p;
// координаты точки (0,0) приводятся в соответствие с координатами экрана
p=Image1->ClientToScreen(Point(0,0));
temp.Left=p.x;
temp.Top=p.y;
// координаты точки (200,120) приводятся в соответствие с координатами экрана
p=Image1->ClientToScreen(Point(200,120));
temp.Right=p.x;
temp.Bottom=p.y;
// перевести компонент Image1 в состояние плавающего окна
Image1->ManualFloat(temp);
// встроить Image1 в Form1
Image1->ManualDock(Form1,NULL,alLeft);
// перевести компонент Image2 в состояние плавающего окна
Image2->ManualFloat(Rect(Form1->Left+25,Form1->
Top+40,Form1->Left+125,Form1->Top+140));
// встроить Image2 в Form1
Image2->ManualDock(Form1,NULL,alLeft);
}
События возникающие при перетаскивании и встраивании объектов
Событие OnGetSiteInfo возникает в начале процесса перемещения и сообщает всем приемникам о том, какой именно управляющий элемент перемещается (параметр Tcontrol *DockClient), TRect &InfluenceRect – прямоугольник рамки перетаскиваемого объекта. В логическую переменную CanDock приемник может поместить свое решение о принятии объекта.
Например, форма разрешает работу только с конкретной панелью Panel1:
void __fastcall TForm1::FormGetSiteInfo(TObject *Sender,
TControl *DockClient, TRect &InfluenceRect, TPoint &MousePos,
bool &CanDock)
{
CanDock= DockClient == Panel1;
}
|