- •Лекція №14
- •Тема 4. Розробка графічного інтерфейсу користувача (продовження) Обробка подій миші і клавіатури План
- •2. Розпізнавання джерела події, натиснутих кнопок і клавіш, координат курсору
- •3. Події клавіатури
- •4. Перетягування даних між об’єктами
- •5. Перетягування і вбудовування об'єктів — Drag&Doc. Плаваючі вікна
- •6. Буксування компонентів у вікні програми
5. Перетягування і вбудовування об'єктів — Drag&Doc. Плаваючі вікна
Починаючи з C++Builder4 реалізована технологія перетягання і вбудовування віконних об'єктів — Drag&Doc. Ви можете познайомиться з результатами цієї технології, працюючи з Інтегрованим Середовищем Розробки C++Builder. Вона надає користувачу повну свободу в перебудові інтерфейсу. Окремі вікна можуть об'єднуватися разом, створювати багатосторінкове вікно із закладками, потім знову відокремлюватися і т.д. Подивимося, як подібний підхід можна реалізувати у своїй програмі.
У деяких віконних компонентів введено властивість DockSite, яка за умовчанням дорівнює false, але якщо її встановити в true, то компонент стає контейнером: приймачем, здатним приймати інші компоненти — клієнти. Ще одна властивість приймача — UseDockManager. Якщо вона дорівнює true (це прийнято за умовчанням), то процесом вбудовування клієнта автоматично управляє диспетчер вбудовування, відповідний тому компоненту, який є приймачем. Якщо ж задати UseDockManager рівним false, то вбудовування клієнтів «лягає на плечі» програміста.
У компонентах — потенційних клієнтах треба встановити властивість DragKind в dkDock. Крім того, якщо ви хочете, щоб процес перетягання починався автоматично, то, так само, як і в технології Drag&Drop, треба встановити властивість DragMode в dmAutomatic. Якщо залишити значення DragMode рівним dmManual за умовчанням, то управління процесом Drag&Doc здійснюється так само, як описувалося раніше для процесу Drag&Drop.
Подивимося, до чого все це може привести. Давайте побудуємо тестове застосування, в якому здійснимо Drag&Doc, не написавши жодного рядка коду.
Почніть новий проект. Перенесіть на форму 6 панелей, розташувавши їх приблизно так, як показано на мал. 14.1 У панелі Panel1 встановите властивість DockSite в true.
Мал. 14.1
Ця панель зможе служити у вас приймачем. У панелях Panel2 — Panel6 встановіть DragKind в dkDock і DragMode в dmAutomatic. Запустіть застосування. Спробуйте перетягувати мишею панелі Panel2 — Panel6, ви побачите, що панель Panel1 може приймати інші панелі, розміщуючи їх усередині себе, причому спосіб вбудовування залежить від того, в якій частині приймача ви завершуєте буксирування клієнта. Між розміщеними клієнтами є роздільники, які дозволяють вам переміщати буксируванням межі між клієнтами, змінюючи їх відносні розміри. Ви можете також бачити, що навіть незалежно від наявності або відсутності в застосуванні приймача, при клацанні на компонентах-клієнтах вони перетворюються на самостійні плаваючі, які можна переміщати, виходячи навіть за межі батьківської форми, можна змінювати їх розміри, можна закривати їх, після чого відповідні компоненти зникають.
Приймачем може бути і сама форма. Вкажіть для форми вашого проекту DockSite рівним true і запустіть його знову. Поведінка панелей дещо зміниться. При клацанні на компонентах - клієнтах вони як і раніше перетворюються на плаваючі вікна, які можна переміщати, змінювати їх розміри і т.п. Але при повторному клацанні вони знову стають звичайними панелями, зберігаючи при цьому змінене місцеположення і розміри. Пояснюється це тим, що повторне клацання сприймається в цьому випадку як вбудовування клієнта в приймач — форму.
Давайте побудуємо багатовіконий редактор текстів, що має сховище, в яке можна поміщати документи на зберігання і потім витягувати з нього потрібні документи.
Почніть новий проект і виконайте наступні пункти.
-
назвіть форму (властивість Name) Fmain.
-
розмістіть на формі компонент MainMenu і задайте в ньому всього один пункт — Новий, маючи на увазі під цим створення нового документа.
-
помістіть на форму панель, задайте її властивість Caption рівним Сховище документів і задайте Align = alTop.
-
помістіть на форму компонент PageControl і задайте Align = alClient, щоб він займав всю площу вікна, окрім смуги, зайнятою панеллю Сховище документів Задайте в ньому властивість DockSite рівним true. Цей компонент служитиме приймачем документів.
-
додайте в проект ще одну форму, виконавши команду Fiie/NewForm. Назвіть її FDoc (властивість Name). Задайте її властивість Visible рівним true. Встановіть її властивість DragKind рівним dkDock, а властивість DragMode рівним dmAutomatic. Ця форма служитиме клієнтом компоненту TPageControl на формі Fmain.
-
помістіть на форму FDoc компонент Memo, задавши для нього Align = alClient, щоб він зайняв всю форму. Зітріть в ньому текст (властивість Lines).
-
виконайте команду Project/Options і перенесіть форму FDoc з вікна Autocreate forms у вікно Available forms, оскільки вона повинна створюватися не автоматично, а при виборі користувачем розділу меню Новий.
-
збережіть проект, назвавши модуль з першою формою Umain, а з другою —UDoc.
Ми створили необхідні нам форми. Залишилося написати декілька операторів, щоб це все працювало.
-
виконайте для модуля Umain команду File/Include Unit Hdr і підключіть з її допомогою заголовний файл UDoc.h, щоб можна було посилатися на модуль UDoc.
-
введіть глобальну змінну LDoc типу TList. Вона є списком, в якому зберігатимуться покажчики на створювані користувачем форми документів: TList * LDoc;
-
у обробник події OnCreate форми Fmain запишіть оператор:
LDoc = new TList(); Цей оператор створює список LDoc.
-
у обробник події OnDestroy форми Fmain запишіть оператор:
delete Ldoc; Цей оператор звільняє пам'ять при закритті програми.
Залишилося написати обробник клацання на розділі меню Новий. Він може мати наступний вигляд:
TFDoc * New = new TFDoc(this);
LDoc->Add(New);
New->Caption = "Документ " + IntToStr(LDoc->Count);
У цьому обробнику вводиться змінна New типу TFDoc, відповідного типу форми FDoc. Перший оператор обробника динамічно розміщує нову форму FDoc і привласнює покажчик на неї змінною New. Наступний оператор додає покажчик на цю форму в список LDoc. А останній оператор задає заголовок вікна форми FDoc - «Документ ...», де багатокрапка замінюється на номер, відповідний числу рядків в списку LDoc.
Тепер ваша програма повністю готова. Збережіть її і спробуйте в роботі. При клацанні на Новий створюється нова форма документа, в якому ви можете писати текст. Документи можна поміщати в сховище, в якому кожному документу автоматично відводиться нова сторінка. Ви можете працювати з документом безпосередньо в сховищі, а можете вилучити його звідти, перетворивши знову на окреме вікно.