Зміна ширини списку відкритого ComboBox
Все про програмування.
Головне меню
Зміна ширини списку відкритого ComboBox
| Статті |
![]() КомпонентTComboBox поєднує редагований список з можливістю прокручування і вибору певного пункту списку. Користувач може вибрати елемент зі списку або ввести його безпосередньо в поле редагування. Список, що розкриваєтьсяКоли список знаходиться у відкритому стані, Windows малює вікно внизу списку з елементами, які знаходяться у списку. Властивість DropDownCount визначає максимальну кількість елементів, які відображатимуться у відкритому списку. Ширина відкритого списку дорівнює ширині поля ComboBox. Коли довжина (або рядок) перевищує ширину ComboBox, елементи урізаються до ширини списку. Компонент TComboBox не має властивості для розширення вікна списку, що розкривається. Фіксована ширина поля ComboBox, що розкривається.Але можна самостійно встановити ширину списку, що розкривається, відправивши спеціальне повідомлення WindowsComboBox. Це повідомленняCB_SETDROPPEDWIDTH, яке означає мінімально допустиму ширину списку, що розкривається. Для розміру вікна, скажімо, 200 пікселів можна зробити так: Це буде працювати правильно, якщо тільки ширина пунктів списку не перевищуватиме 200 пікселів. Для того, щоб бути впевненим, що пункти меню "влізуть" у список, що розкривається, можна буде зробити обчислення. Ось приклад функції для розрахунку ширини списку, що розкривається, з урахуванням ширини його окремих пунктів. Для розрахунку ширини списку, що розкривається, використовується ширина самоїдовгий рядок. Звідки викликати процедуру ComboBox AutoWidth?Якщо Ви попередньо заповнюєте список під час розробки, то викликати процедуруComboBox_AutoWidt зручно при створенні форми в обробнику подіїOnCreate форми. Якщо Ви динамічно заповнюєте список під час роботи програми, то викликати процедуруComboBox_AutoWidth можна всередині обробника подіїOnDropDown ComboBox. Ця подія відбувається, коли Ви відкриваєте список, що розкривається. Для перевірки помістіть компонентTComboBox на форму і заповніть його властивість Items словами різної довжини. Потім пишемо процедуруComboBox_AutoWidth і викликаємо її у події формиOnCreate. Після запуску програми, Ви можете переконатися, що ширина списку, що розкривається, розтягнеться по ширині найдовшого пункту списку. Розширення списку вліво!Зауважте, що список розширюється праворуч. Що ж зробити, якщоComboBox знаходиться праворуч на формі, а поле зі списком виходить за межі вікна? ПовідомленняCB_SETDROPPEDWIDTH завжди розширює список праворуч і немає жодної можливості вказати, в якому напрямку потрібно розширювати список (праворуч або ліворуч). Знайдене рішення - WM_CTLCOLORLISTBOXРішення просте: коли відкривається список, Windows надсилає повідомленняWM_CTLCOLORLISTBOX. КожнеVCL керування надає властивостіWindowProc - це процедура, яка реагує на повідомлення, що відправляються на керування. Ми можемо використовувати властивістьWindowProc, щоб тимчасово замінити або зробити підклас процедури вікна управління. Ось наш зміненийWindowProc дляComboBox : Коли наш списокотримає повідомленняWM_CTLCOLORLISTBOX, ми отримаємо розміри вікна списку, а також прямокутник вікна розкритого списку (GetWindowRect ). Якщо виявиться, що список, що розкривається, буде правіше самогоComboBox, то ми перемістимо його ліворуч, тобто. вирівняємо праворуч. Якщо повідомлення неWM_CTLCOLORLISTBOX, ми просто викликаємо оригінальну процедуру обробки повідомлення. Ну і нарешті, потрібно розмістити все це в обробнику подіїOnCreate форми: |
