Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка интерфейса Drag & Dock.doc
Скачиваний:
7
Добавлен:
15.11.2019
Размер:
192.51 Кб
Скачать

10

Министерство образования и науки Российской Федерации

Рыбинский государственный авиационный технологический университет имени П. А. Соловьева

Кафедра Вычислительные системы

И. Н. Паламарь Разработка интерфейса Drag & Dock приложения Windows

Методические указания к выполнению лабораторной работы

Рыбинск 2012

1. Общие сведения об интерфейсе Drag & Dock

Технология Drag & Dock обеспечивает возможность динамического перемещения при помощи мыши элементов управления (TControl) в доки (элементы парковки). В качестве носителей элементов управления выступают элементы, являющиеся потомками класса TWinControl. Использование интерфейса Drag & Dock возможно только для элементов в рамках одного приложения.

Технология Drag & Dock позволяется объединять на экране различные инструменты, например, такие как Инспектор объектов и Менеджер проекта в визуальных средах программирования. Можно настраивать панели инструментов путем их слияния или организации плавающих панелей в MS Word, как показано на рисунке 1.

Рисунок 1 – Вид плавающих панелей в MS Word

Возможны два варианта реализации техники Drag & Dock: автоматический и ручной. Для использования автоматического режима в Инспекторе объектов для выбранного элемента управления нужно установить значение свойства DragKind в dkDock, а свойства DragMode – в dmAutomatic. Остальную реализацию механизма парковки предоставляет код VCL.

Носителем других компонентов может служить потомок TWinControl. У него есть свойство DockSite, установка значения True которого разрешает перенос на него других компонентов. Если при этом еще и установить значение свойства AutoSize равным True, док будет автоматически масштабироваться в зависимости от того, что на нем находится.

Между доком и содержащимися на нем элементами управления есть двухсторонняя связь. Все припаркованные элементы управления содержатся в векторном свойстве Dockclients, а их количество можно узнать из свойства DockClientCount.

С другой стороны, если элемент управления находится на доке, то ссылка на док находится в свойстве HostDocksite. С ее помощью можно установить, где находится элемент, и даже поменять свойства дока.

При выборе ручного режима необходимо выполнить программирование самостоятельно и контролировать процесс, используя предусмотренные события интерфейса.

Каждый переносимый элемент управления имеет два события, возникающие в моменты начала и конца переноса:

type TStartDockEvent = procedure(Sender: TObject; var DragObject: TDrag-DockObject) of object;

TEndDraqEvent = procedure(Sender, Target: TObject; X, Y: Integer) of object;

В первом из методов Sender – это переносимый объект, а DragObject – специальный объект, создаваемый на время процесса переноса и содержащий его свойства. Во втором Sender это также переносимый объект, a Target –объект-док.

Док тоже извещается о событиях во время переноса:

type

TGetSiteInfoEvent= procedure(Sender: TObject; DockClient: TControl;

var influenceRect: TRect; MousePos: TPoint; var CanDock: Boolean) of object;

TDockOverEvent = procedure(Sender: TObject; Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean) of object;

TDockDropEvent = procedure(Sender: TObject; Source: TDragDockObject; X, Y: Integer) of object;

TUnDockEvent = procedure(Sender: TObject; Client: TControl; NewTarget:

TWinControl; var Allow: Boolean) of object;

Как только пользователь нажал кнопку мыши над переносимым компонентом и начал сдвигать его с места,всем потенциальным докам (компонентам, значение свойства которыхDocksite установлено равным True) рассылается событие onGetsiteinfo. С ним передаются параметры: кто хочет "причалить " (параметр Dockciient) и где (Mousepos). В ответ док должен сообщить решение, принимает он компонент(параметр canDock) и предоставляемый прямоугольник (influenceRect) или нет. При помощи этого события можно принимать только определенные элементы управления,как показано в примере:

procedure TFonnl.PanellGetSiteInfо(Sender: TObject; DockClient: TControl;

var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);

begin if DockClient is TBitBtn then CanDock := False;

end;

Два последующих события в точности соответствуют своим аналогам из механизма перетаскивания (Drag-and-Drop). Событие OnDockOver происходит при перемещении перетаскиваемого компонента над доком, onDockDrop - в момент его отпускания. Наконец, onUnDock сигнализирует об уходе компонента с дока и происходит в момент его "причаливания" в другом месте.