Скачиваний:
37
Добавлен:
28.06.2014
Размер:
118.78 Кб
Скачать

Технология Drag&Doc

Общие сведения

В VCL библиотеке реализована также технология перетаскивания и встраивания оконных объектов (Drag&Doc).

Приемник, способный принимать переносимые компоненты (клиенты), принято называть контейнером. Если для оконного компонента установить свойство 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;

}

Событие OnDockOverвозникает и повторяется, когда в поле приемника входит курсор мыши, буксирующий клиента. ПараметрSourceтипаTDragDockObjectопределяет перетаскиваемый компонент, логическая переменнаяAccept(по умолчаниюtrue) сигнализирует о необходимости приема. СвойствоDockRectобъектаSourceописывает перемещаемую рамку, ею можно управлять, например, изменяя ее размеры.

Событие OnDockDropвозникает в момент окончания перетаскивания клиента и определяет размещение объектSourceв приемнике.

Событие OnEndDockсообщает клиенту об окончании процесса его перемещения.