Управління властивостями вікон

Подивіться на рис. 3.10, де показаний повний знімок Робочого столу.

Управління властивостями вікон

Мал. 3.10. Windows всередині вікна

Створіть новий проект в Delphi і помістіть на форму кнопку Запустити. За натисканні цієї кнопки пишемо виклик знайомої функції EnunWindows перебору всіх вікон:







Функція EnurrWi ndowsProc, яка буде викликатися для кожного знайденого вікна, повинна виглядати таким чином:

Тут ми перевіряємо, чи є вікно видимим. Якщо так, то викликається функція SetParent, яка встановлює батьківське вікно. В якості першого параметра функції потрібно вказати вікно, батька якого ми хочемо змінити, а в якості другого вказується новий батько. У другому параметрі використовується покажчик на головне вікно нашої програми. Таким чином, все, що знаходиться на екрані, переноситься всередину зазначеного вікна.

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

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

У цій функції також відбувається перевірка на видимість знайденого вікна. Якщо воно мабуть, то викликається функція установки меню SetMenu. Цій функції потрібно передати наступні два параметри:

в меню, яке повинно бути встановлено. Вказуємо 0, що рівноцінно видалення меню.

Запустіть програму і натисніть кнопку Прибрати меню. У всіх вікнах, де використовуються стандартні меню Windows, меню зникне. У Delphi 7, в пакеті програм MS Office та деяких інших продуктах використовуються нестандартні меню в стилі ХР. Насправді це панелі з кнопками, після натиснення яких випадає меню, тому в цих програмах нічого не станеться.







Давайте модифікуємо код і, навпаки, встановимо меню. Для цього помістіть на форму компонент TMainMenu і створіть в ньому будь-які пункти. Можна придумати все що завгодно, і обробники ставити не обов'язково, тільки назви.

Тепер можна змінити функцію SetMenu на наступну:

Таким чином, для всіх вікон встановлюється меню з компонента TMai nMenu. Подивіться на рис. 3.11, де показаний скріншот програми Delphi На кожному вікні встановлено одне власне меню там, де його раніше не було. Але найцікавіше, що меню з'явилося на робочому столі (в самому верху) і навіть у Панелі завдань.

Як бачите, встановити меню досить просто. А от змусити його працювати - завдання не з простих. В системі немає обробників подій для пунктів цього меню, а обробники з нашої програми викликатися не будуть.

Аналогічно можна змінювати властивості вікна. Для цього викликається функція Get-WindowLong таким способом:

Управління властивостями вікон

Мал. 3.11. Скріншот Delphi з новим меню

Функція 6е1І1пас "1-ОПД може змінювати різні настройки вікон. Функція має такі параметри:

• параметр, який треба встановити. Визначене значення залежить від другого параметра.

У нашому випадку в першому параметрі вказується знайдене вікно. Другий параметр свідчить про те, що треба змінити стандартний стиль вікна. А ось в третьому параметрі знаходиться дуже цікава конструкція:

5еЕІ ^ 0УЛ.0пд (п. 614Ь_5ТУЬЕ) - И5_САРТЮМ

Функція SetWinclowLong змінює вказане властивість вікна. У першому параметрі передається покажчик на знайдене вікно, а в другому - тип цікавить властивості. У другому параметрі функції SetWindowLong можна вказувати ті ж значення, що і в другому параметрі функції GetWindowLong.

В даному випадку ми отримуємо стандартні властивості вікна і віднімаємо з цих властивостей заголовок (І5_САРТЮМ). В результаті, якщо у вікна був заголовок, ми його забираємо. Звичайно ж, після виконання цього коду заголовок може нікуди не дітися і залишитися на місці, але реагувати на події користувача точно не буде.

Вихідний код розглянутого тут приклад знаходиться на компакт-диску в каталозі БоігсевУгпОЗ ^ уу / Иоул /.







Схожі статті