Прилипають - вікна, Програмування на WinAPI, Статті, Програмування - Програмування C,

Незважаючи на те, що Delphi обробляє величезну кількість повідомлень, деякі з них все ж таки "залишаються без уваги". Наприклад, ми знаємо, що якщо нашій програмі потрібно обробити зміну розміру форми, то ми пишемо обробник події OnResize - таким чином Delphi обробляє повідомлення WM_SIZE, але як визначити, що форма пересувається по екрану? Форма Delphi отримує відповідне повідомлення, але з обробляє його.

Повідомлення WM_MOVING надсилається вікну, яке пересувається користувачем. Обробивши це повідомлення, програма може отримати інформацію про розмір і позицію прямокутника, що пересувається, і, якщо потрібно, змінити їх.

Повідомлення WM_WINDOWPOSCHANGING надсилається вікну, чиї розміри, позиція або видимість повинні змінитися в результаті виклику функції SetWindowPos або іншої функції керування вікном.

Іноді простого факту, що подія сталася, недостатньо і нам потрібна додаткова інформація про неї. Наприклад, прийнявши повідомлення WM_MOVE ми дізнаємося не тільки те, що положення форми змінилося, але і нові координати X і Y нашого вікна.

Повідомлення WM_WINDOWPOSCHANGING дозволяє отримати трохи більше даних - ми отримуємо покажчик на структуру WindowPos, яка містить інформацію про нові координати та розмір вікна. Ось як ця структура описана:

Наше завдання просте: ми хочемо, щоб форма прилипала до краю екрана, якщо край форми при переміщенні виявляється на певній відстані від краю екрана (скажімо, 20 пікселів).

Тепер приступимо до написання власне коду програми. Створіть нову форму та помістіть на неї наступні компоненти: TLabel, поле введення (TEdit) та чотири чекбокси (TCheckBox). Введіть нове ім'я поля введення - нехай це буде edStickAt. Чекбокси перейменуйтеchkLeft, chkTop і т.д. Як ви, мабуть, здогадалися, в edStickAt міститься число пікселів, на яке потрібно наблизити край форми до краю екрана, щоб форма "прилипла" до нього, а чекбокси визначають поведінку вікна поблизу відповідних країв екрана. Форма виглядатиме приблизно так:

Для визначення поточного розміру робочого стола Windows використовується функція SystemParametersInfo, в яку першим параметром передається константа SPI_GETWORKAREA. Таким чином враховується лише вільний простір робочого столу - не беруться до уваги панель керування, панелі Internet Explorer і т.д.

Тепер просто запустіть програму та спробуйте присунути форму до краю екрана.