Як зробити screensaver своїми руками
Бажання творити щось власними руками - це, на мій погляд, один з тих не самих істотних у великих масштабах, але вельми серйозних в масштабах однієї конкретної особистості двигунів прогресу, який дрімає всередині кожної людини. Тобто, звичайно, дрімає він не у всіх - у дуже багатьох він активно працює.
Звичайно, проявлятися бажання творити може найрізноманітнішими способами, і, на мій погляд, програмування - хороший спосіб самовираження. Тому зараз я хочу розповісти тим з наших Новомосковсктелей, у кого є творча жилка програміста, про те, як створити власну заставку, відому також під іменами зберігача екрану і скрінсейвера.
Тому спочатку трохи про те, що собою скрінсейвер являє. Для користувача це заставка, яка з'являється на екрані, коли комп'ютер деякий час знаходиться без діла. З точки зору програміста, це звичайнісінька програма у вигляді EXE-файлу. правда, що має кілька нестандартне розширення - .SCR. Само собою, створити скрінсейвер можна за допомогою будь-якого середовища програмування для Windows; ми ж з вами скористаємося Delphi.
Тому логічно винести малювання в окрему процедуру. Її ви зможете змінити самостійно, використовуючи як стандартні малювальне інструменти Windows API і Delphi, так і спеціалізовані бібліотеки OpenGL і DirectX. У мене ж скрінсейвер просто виводить на екран задану фотографію або малюнок. Ось код процедури, яка це реалізує:
Поки я не буду на них докладно зупинятися, оскільки їх зміст стане цілком ясний з коду процедури, що відображає "прев'юшки". Крім зазначених вище змінних, нам потрібна віконна процедура.
Це просто обробник системних подій: якщо система скаже знищити вікно, то воно знищиться, якщо скаже перемалювати - що ж, перерісуем. Тепер можна написати і, власне, процедуру відтворення прев'юшки:
Що ж, тепер давайте розбиратися. Спочатку оголошуються необхідні змінні - дескриптор батьківського (головного) вікна, клас нашого дочірнього вікна, а також змінна для обробки повідомлень. Спочатку ми витягуємо з параметрів командного рядка дескриптор батьківського вікна, після чого инициализируем клас свого. Як бачите, майже всі параметри встановлюються в нуль - значить, наше вікно не матиме ні іконки, ні меню, тільки ім'я класу ScreenSaverClass01. теж закінчується нулем.
Далі реєструємо клас вікна за допомогою процедури RegisterClass. а потім - отримуємо розміри області, яку ми повинні заповнити своїм вікном. Зробивши це, створюємо дочірнє вікно, потім створюємо канву, на якій будемо малювати (це просто VCL-обгортка над контекстом вікна "прев'юшки"), а потім йде стандартний для всіх Windows-додатків цикл обробки повідомлень. Як бачите, він може обірватися, тільки якщо того захоче сама система - а її це змусить захотіти користувач. Після переривання псевдобесконечного циклу ми "прибираємо сміття" - контекст вікна і канву.
Тепер буде йти процедура реакції головного вікна на різні системні повідомлення. Саме вона відповідає за закриття скринсейвера при різних діях користувача. Зручніше реалізувати її так, ніж вішати процедуру на все обробники подій нашої форми. Покладіть на форму компонент ApplicationEvents з закладки Additional. Двічі клікніть на подію onMessage в інспекторові об'єктів і заповніть процедуру наступним чином:
Тепер потрібно додати ще обробник події onIdle того ж компонента. Він буде містити всього два рядки:
Як бачите, тут ми просто малюємо - якраз в ті моменти, коли система нічим не зайнята. Що ж, тепер готове практично все. Залишається тільки поміняти деякі властивості головної форми і написати ще трохи коду. Властивості міняємо такі: колір (Color) на чорний (clBlack), BorderStyle ставимо в bsNone. а WindowState в wsMaximized.
Робиться це все за допомогою інспектора об'єктів. Далі в меню Project вибираємо View Source. оголошуємо змінну c типу char, додаємо в розділ uses модуль Dialogs. стираємо все між begin і end і пишемо такі рядки:
Ось тепер скрінсейвер готовий.
Уважні Новомосковсктелі, мабуть, помітили, що замість нормального діалогу налаштувань буде відображатися віконце-повідомлення з написом "This is a very cool screensaver!". Це, як ви самі розумієте, можна доопрацювати. Ще можна доопрацювати переміщення зображення по екрану з плином часу, додати перевірку, чи не був скрінсейвер вже запущений (хоча, в принципі, для зберігачів екрану така перевірка не критична, оскільки ситуація одночасного запуску декількох екземплярів малоймовірна і не несе ніяких руйнівних для системи наслідків) .