<
  • Главная
Статьи

VR on-line #HOME

Мова програмування Delphi.
Хранителі екрану:

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

З одного боку, ця стаття повинна була йти в розділі "Робота з графікою", тому що ми будемо багато малювати. Але я вирішив її вставити сюди, тому що використовуються тут графічні функції ми вже вивчили. А ось саме програмування буде дуже цікавим.

Для того, щоб Delphi міг створити зберігач екрану, ти повинен зробити кілька установок для своєї форми:

  • Перед оголошенням типів вставити ось такий рядок: {$ D SCRNSAVE Raver}.
  • Властивість форми BorderStyle поміняти на bsNone. Це означає, що у форми не повинно бути ніяких заголовків і обрамлень.
  • Всі параметри в Border Icons встановити в False.
  • Властивість форми WindowState поміняти на wsMaximized.
  • Створити подію OnKeyPress і вставити туди всього лише одну процедуру - Close ().
  • На подію FormActivate значення Left і Top потрібно встановити в нуль.

Тепер Delphi створить скрінсейвер. Залишається одна деталь - у зберігача розширення SCR. Ти можеш після створення перейменувати файл в * .scr або покласти цей важкий труд на Delphi. Для цього необхідно вибрати пункт Option з меню Project і на закладці Application в рядку Target file extension написати SCR. В цьому випадку Delphi сам підставити це розширення.

Підготовчі роботи закінчені. Можна приступати до написання зберігача екрану. Ти вже знаєш достатньо багато, і зможеш сам написати що-небудь цікаве. А я все ж покажу найпростіший приклад.

Для мого прикладу знадобиться оголосити три змінні в розділі private:

private {Private declarations} BGbitmap: TBitmap;DC: hDC;BackgroundCanvas: TCanvas;

Потім подивимося на мій обробник події OnCreate

procedure TForm1.FormCreate (Sender: TObject);begin BGbitmap: = TBitmap.Create; // Ініціалізація // Виставляємо розміри картинки як біля екрану BGbitmap.Width: = Screen.Width;BGbitmap.Height: = Screen.Height;DC: = GetDC (0);BackgroundCanvas: = TCanvas.Create;BackgroundCanvas.Handle: = DC;BGBitmap.Canvas.CopyRect (Rect (0, 0, Screen.Width, Screen.Height), BackgroundCanvas, Rect (0, 0, Screen.Width, Screen.Height));BackgroundCanvas.Free;randomize;end;

Що тут діється? На самому початку я не започатковано BGbitmap і встановлюю йому розмір як біля екрану. Потім в змінну DC заноситися покажчик на контекст виведення екрану. На перший погляд це відбувається не явно, але все дуже просто. GetDC повертає покажчик на контекст зазначеного в якості параметра пристрою або форми. Якщо вказати 0, то GetDC поверне покажчик на контекст відтворення екрану. Якщо ти захочеш отримати контекст відтворення твоєї форми, то ти повинен написати GetDC (Handle). Як параметр виступає Handle (покажчик) вікна. Але ти в такому вигляді не будеш ніколи використовувати GetDC, тому що у тебе вже є контекст відтворення форми - це Canvas, а покажчик на нього - Canvas.Handle.

Далі я створюю BackgroundCanvas - це TСanvas, який буде вказувати на екран. Я роблю це тільки для зручності. Я міг би використовувати для малювання DC, але все ж TCanvas більш зрозумілий.

За допомогою наступного рядка, я зберігаю копію екрану:

BGBitmap.Canvas.CopyRect (Rect (0, 0, Screen.Width, Screen.Height), BackgroundCanvas, Rect (0, 0, Screen.Width, Screen.Height));

Тут все дуже просто, і твоїх знань вже повинно вистачати на розуміння цього коду.

Потім я знищую покажчик на контекст екрану (BackgroundCanvas.Free).

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

У обробнику події OnDistroy я знищую картинку:

procedure TForm1.FormDestroy (Sender: TObject);begin BGBitmap.Free;end;

Остання функція - це оброблювач таймера, який я поставив на форму:

procedure TForm1.Timer1Timer (Sender: TObject);const DrawColors: array [0..7] of TColor = (clRed, clBlue, clYellow, clGreen, clAqua, clFuchsia, clMaroon, clSilver);begin BGBitmap.Canvas.Pen.Color: = DrawColors [random (7)];BGBitmap.Canvas.MoveTo (random (Screen.Width), random (Screen.Height));BGBitmap.Canvas.LineTo (random (Screen.Width), random (Screen.Height));Canvas.Draw (0,0, BGBitmap);end;

У розділі констант я оголошую масив DrawColors який зберігає вісім кольорів. Оголошення відбувається наступним чином:

Імя_массіва: array [Індекс_первого_значенія .. Індекс_последнего_значенія] of Тіп_значенія_Массіва = (Перечісленіе_значеній)

В "перечісленіі_значеній" має бути описано "Індекс_последнего_значенія" - "Індекс_первого_значенія" +1 параметрів. У моєму випадку це 7-0 + 1 = 8 значень кольору.

Далі міняю колір у контексту малювання форми BGBitmap.Canvas.Pen.Color випадковим кольором з масиву DrawColors. Функція random повертає число з таблиці випадкових чисел, при цьому, це число буде більше нуля і менше значення переданого в якості параметра. Це означає, що random (7) поверне випадкове число від 0 до 7. За допомогою BGBitmap.Canvas.MoveTo я переміщаюся в випадкову точку всередині BGBitmap і за допомогою BGBitmap.Canvas.LineTo малюю з цієї точки в нову точку лінію. Canvas.Draw (0,0, BGBitmap); виводить мій твір на екран.

Ось і готовий найпростіший хранитель екрану. Сподіваюся, що скоро побачимося.

Вихідні тексти прикладу забирай тут Вихідні тексти прикладу забирай тут



Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью