VR
Virtual Reality On-line   Журнал
Новости   |     Журнал    |    Хаkер    |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]

[ Download  ]
[  Конкурс  ]
[ Анекдоты  ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
Язык программирования Delphi.
Хранители экрана
:
Logo

Если ты до сих пор считаешь, что 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); выводит моё произведение на экран.

Вот и готов простейший хранитель экрана. Надеюсь, что скоро увидимся.

 Исходники примера забирай здесь


Design by FMk group ©
Copyright©: Horrific aka Флёнов Михаил ©