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

4.5 Перетаскивание и встраивание объектов —
Drag&Doc. Плавающие окна

В C++Builder 4 реализована новая технология перетаскивание и встраивание
|  оконных объектов — Drag&Doc. Вы можете познакомится с результатами этой
технологии, работая с Интегрированной Средой Разработки C++Builder 4. Она
предоставляет пользователю полную свободу в перестройке интерфейса. Отдель-
ные окна могут объединяться вместе, создавать многостраничное окно с закладка-
ми, затем опять разъединяться и т.д. Посмотрим, как подобный подход можно ре-
ализовать в своем приложении.

У оконных компонентов в C++Builder 4 введено свойство DockSite, которое по
умолчанию равно false, но если его установить в true, то компонент становится
контейнером: приемником, способным принимать переносимые в него компонен-
ты — клиенты. Еще одно свойство приемника — UseDockManager. Если оно равно
true (это принято по умолчанию), то процессом встраивания клиента автоматиче-
ски управляет диспетчер встраивания, соответствующий тому компоненту, кото-
\  рый является приемником. Если же задать UseDockManager равным false, то
встраивание клиентов ложится на плечи программиста.

В компонентах — потенциальных клиентах надо установить свойство Drag-
Kind в dkDock. Кроме того, если вы хотите, чтобы процесс перетаскивания начи-
нался автоматически, то, так же, как и в технологии Drag&Drop, надо установить
свойство DragMode в dmAutomatic. Если оставить значение DragMode равным
dmManual по умолчанию, то управление процессом Drag&Doc осуществляется так
же, как описывалось ранее для процесса Drag&Drop.

Посмотрим, к чему все это может привести. Давайте построим тестовое прило-
жение, в котором осуществим Drag&Doc, не написав ни одной строчки кода.

Начните новое приложение. Перенесите на форму 6 панелей, расположив их
примерно так, как показано на рис. 4.14 а). В панели Panell установите свойство
DockSite в true. Эта панель сможет служить у вас приемником. В панелях Ра-
nel2 — Рапе16 установите DragKind в dkDock и DragMode в dmAutomatic. Запус-
тите приложение. Попробуйте перетаскивать мышью панели Panel2 — Рапе16. Вы
увидите (рис. 4.14 б), что панель Panell может принимать другие панели, разме-
щая их внутри себя, причем способ встраивания зависит от того, в какой части
приемника вы завершаете буксировку клиента. Между размещенными клиентами
имеются разделители, которые позволяют вам перемещать буксировкой границы
|  между клиентами, изменяя их относительные размеры. Вы можете также видеть,
что даже независимо от наличия или отсутствия в приложении приемника, при

^•" .-^tffi^?':;1'1:,"":^^^^^^^^^^^^^'•"•""'"№#УШ                   PaieG           ',        panaS   '^       ::":

^^      :       :' . : : •.\,'     Рапей ,;;,:;                                          •-     •   'I

.1:            !'               I ^—•-—7—^:^-"-; 7

-i1                                  !               Р.^^    '                                                                                     '''•-

'Иг.                                                                                                   '                     Рапе16      | :

\ :     : ' 'ф ; Psnel5 ^I^^^ParieiS         \    "_ ;.^ '^. \'._'-: \^ :^ ^        —^ —^-„^—.-—l :-"

а)                                                 б)
Рис. 4.14

Демонстрация техники Drag&Doc: форма (а) и окно приложения во время выполнения (б)