Як помістити кнопку в заголовок форми

Все про програмування.

Головне меню

Як помістити кнопку в заголовок форми

Що потрібно зробити, щоб додати кнопку до заголовка форми?

  • Нам потрібна функція для малювання кнопки
  • Потрібно перемальовувати кнопку, коли кнопка видима/невидима, коли форма активізується, змінює розміри або переміщається
  • Потрібно мати подію клацання миші на кнопці

Малюємо TRect як кнопку

Ви не можете поміщати об'єктиVCL у неклієнтську область вікна, але можна намалювати його та моделювати вигляд кнопки. Щоб виконати малювання в області заголовка вікна, потрібно зробити три важливі речі:

  1. Потрібно отримати поточні координати вікна та розмір зображення, щоб знати в якій області малювати та якого розміру буде прямокутник
  2. Потім потрібно визначити структуруTRect з певним розміром та позицією в межах області заголовка
  3. Нарешті, потрібно намалюватиTRect як кнопку, потім додати будь-яке зображення або текст, що має бути на поверхні кнопки

Все це виконується в одному виклику процедуриDrawTitleButton, який наведено нижче:

Крок перший виконується, роблячи чотири виклики функцій WinAPIGetSystemMetrics, запитуючи систему про ширину та висоту вікна (SM_CXRFAME іSM_CYFRAME ) і розмір точкових малюнків, що містяться в області заголовка (SM_CXSIZE таSM_CYSIZE ).

У кроці 2 виконується функціяBounds, яка повертаєTRect з розмірами та параметрами позиції. Зверніть увагу, що тут використовуються деякі умовні директиви компілятора. Це тому, що розмір кнопок у заголовках Windows 95 та Windows 3.1 відрізняються, так що і розмір повиненвстановлюватись по-іншому. Тепер це можна використовувати у будь-якій версії Windows. Однак, оскільки Windows NT UI те ж саме, що і Windows 3.1, потрібно визначити, чи це Windows NT і якщо так, потрібно визначитиTRect так само, як і для Windows 3.1.

Щоб зробити крок 3, робимо викликDrawButtonFace модуля Buttons, щоб намалювати кнопки в межахTRect, який ми вже визначили. Як тільки додамо, потрібно включити код малювання точкового малюнка на кнопці. Тут також застосовується умовна директива компілятора різних версій Windows. Тому що точковий малюнок 16 Х 16 пікселів може бути занадто великим для Windows 95. Так що тут використовуєтьсяStretchDraw, щоб розтягнути малюнок за розміром кнопки.

Пастки подій Drawing та Painting

Ви повинні переконатися, що кнопка буде видно щоразу після перемальовування форми. Перемальовка відбувається у відповідь на активацію та зміну розмірів. Якщо не буде оновлення кнопки, вона буде губитися, коли відбуватиметься перемальовка форми. Потрібно написати обробник події, які виконають ці дії та оновлюватимуть кнопку. Наступні чотири процедури обробляють події натискання кнопки та оновлення:

Щоразу, коли відбувається одне з цих подій, воно своє чергу викликає процедуруDrawTitleButton. Це гарантуватиме, що кнопка буде завжди видно в області заголовка. Тут використовується обробник події формиOnResize, щоб змусити виконуватисяWM_NCACTIVATE.

Обробка клацань миші

Тепер, коли отримано код, який малює кнопку, потрібно обробити клацання миші на кнопці. Це робиться двома процедурами. Перша процедура перевіряє, чи було клацання миші в області кнопки, а друга фактичновиконує виконання коду, пов'язане з натисканням кнопки:

Перша процедураWMNCHitTest повідомлення натискання, щоб визначити, де була натиснута миша в неклієнтській області. У цій процедурі перевіряється, що точка натискання була в межах нашогоTRect, використовуючи функціюPtInRect. Якщо клацання миші було виконано в межахTRect, то результат повідомлення встановлюється в htTitleBtn, яка є константою і оголошена як htTitleBtn + 1. htSizeLast - константа перевірки натискання, щоб перевірити, де було останнє натискання.

А тепер об'єднаємо всі разом

Тепер давайте подивимося на повний код у формі: