C Builder 5
Обмеження Constraints є дуже ефективним механізмом обмеження розмірів елемента управління. Працюючи з ними важливо пам'ятати, що не можна змінювати розміри елемента управління з порушенням його обмежень чи обмежень видимого елемента управління.
У проекті Panels.bpr наводиться приклад використання обмежень Constraints для запобігання надмірному зменшенню основної форми. Для властивості Constraints->MinHeight панелей Panell і Panel2 задано однакове значення 300. Це означає, що клієнтська частина форми Forml (основної форми) не може бути меншою за 300x300. Для мінімальної висоти MinHeight і ширини MinWidth форми Forml можна встановити інші обмеження, але для досягнення такого ж результату (300x300) потрібно врахувати різницю між висотою форми Height і клієнтської частини ClientHeight, а також шириною форми Width і клієнтської частини ClientWidth.
MiniCalculator також використовується обмеження Constraints. Щоб гарантувати видимість основного меню для основної форми MainForm, задано 52 пікселя як мінімальну висоту Constraints->MinHeight і 248 пікселів як мінімальну ширину Constraints->MinWidth. Це також гарантує видимість рядка стану StatusBarl, оскільки задані лише обмеження її мінімальної MinHeight та максимальної висоти MaxHeight
Розділ 5. Принципи та методи створення інтерфейсу користувача
287 (обидва значення дорівнюють 30, тобто висоті Height рядки стану StatusBarl). Дисплей LCDPanel має власне обмеження мінімальної ширини MinWidth, оскільки він може відкріплюватись/закріплюватися і його розмір можна змінювати незалежно від основної форми MainForm. Для обмежень мінімальної MinHeight та максимальноївисоти MaxHeight дисплея LCDPanel встановлено значення 77, тобто. значення висоти Height дисплея LCDPanel. Отже, висота LCDPanel не може бути змінена. Панель кнопок ButtonsControlBar має власні обмеження, які визначаються динамічно під час виконання програми, так що вони завжди можуть бути підігнані під розміри елементів управління, які вона містить, незалежно від їх положення в ній. Для цього потрібно створити відповідний код події OnConstrainedResize на панелі кнопок ButtonsControlBar.
Подія OnConstrainedResize використовується для оновлення обмежень елемента керування при зміні його розмірів. Як було зазначено, у програмі MiniCalculator динамічно оновлюються обмеження панелі кнопок ButtonsControlBar типу TControlBar. Це робиться для обмеження мінімальної висоти і ширини панелі кнопок і постійного припасування її розмірів відповідно до елементів управління, що містяться в ній, незалежно від їх розташування всередині панелі. Код обробника події ButtonsControlBar-OnConstrainedResize наводиться в лістингу 5.24.
Лістинг 5.24. Код обробника події ButtonsControlBar->OnConstrainedResize
void _fastcall TMainForm::ButtonsControlBarConstrainedResize(
TObject * Sender, Ints MinWidth, Ints MinHeight, Ints MaxWidth, Ints MaxHeight)
Подія OnConstrainedResize має чотири параметри, кожен з яких відповідає одному обмеженню Constraints елемента управління, що спричинив появу цієї події: MinWidth, MinHeight, MaxWidth та MaxHeight.
Обробник події ButtonsControlBarConstrainedResize() виконує обмежену кількість дій: викликає функцію з вичерпною назвою GetControlBarMinWidthAndHeight(), передаючи як аргументи покажчик нацю панель кнопок, а також параметри MinWidth та MinHeight для обчислення та присвоєння їм нових значень. Оголошення функції GetControlBarMinWidthAndHeight() має такий вигляд.
void _fastcall GetControlBarMinWidthAndHeight(
TCustomControlBar* ControlBar, Ints MinWidth, Ints MinHeight);
Обидва параметри типу int передаються функції GetControlBarMinWidthAndHeight() за посиланням, що дозволяє змінювати передані значення. Код функції GetControlBarMinWidthAndHeight() наведено у лістингу 5.25.
Частина I. Основи C++Builder 5 Лістинг 5.25. Код функції GetControlBarMinWidthAndHeightO
TCustomControlBar* ControlBar, Ints MinWidth, Ints MinHeight)
int MinLeft = 0; int MinTop = 0; int MaxRight = 0; int MaxBottom = 0;
bool FirstVisible = true;
for(int i=0; i ControlCount; ++i)
MinLeft = ControlBar->Controls[i]->Left - ll; MinTop = ControlBar->Controls[i]->Top - 2; MaxRight = ControlBar->Controls[i]->Left
+ ControlBar->Controls[i]->Width + 2; MaxBottom = ControlBar->Controls[i]->Top
+ ControlBar->Controls[i]->Height + 2; FirstVisible = false;
if((ControlBar->Controls[i]->Top-2) Попередня 134 135 136 137 138 139 .. 405 >> Наступна