Отправляет email-рассылки с помощью сервиса Sendsay

Программирование в Delphi

  Все выпуски  

Делаем программу, выводящую помехи на экран


Здравствуйте!

Сегодня хочу показать вам небольшой алгоритм, создающий движущиеся помехи на изображении, очень похожие на помехи от телевизора. Применяя этот алгоритм можно сделать screensaver? или напугать какого-нибудь ламера. Представляете, включает он компьютер, а на экране монитора идут помехи!

Киньте на форму таймер, задайте интервал 100 миллисекунд. Ещё поместите компонент Image, свойства Top и Left сделайте равными 0, ширину и высоту картинки мы будем задавать программно. Больше никаких компонентов нам не потребуется.

Сначала сделаем код, который выполняется по событию Create формы.

procedure TForm1.FormCreate(Sender: TObject);

begin

Form1.Windowstate:=wsMaximized; // Делаем форму полноэкранной и

Form1.Borderstyle:=bsNone;             //  убираем заголовок

Image1.Width:=Screen.Width;          //Делаем размеры Image равными разрешению

Image1.Height:=Screen.height;         // монитора

Image1.Picture.Bitmap:=CaptureScreen(Rect(0,0,Screen.Width,Screen.Height));

end;

В последней строчке мы вызываем функцию CaptureScreen, эта функция копирует изображение с экрана, вот её код

function CaptureScreen(ARect : TRect) : TBitmap;

var

 ScreenDC : HDC;

begin

 Result:=TBitmap.Create;

 with result, ARect do begin

  Width:=Right-Left;

  Height:=Bottom-Top;

  ScreenDC:=GetDC(0);

  try

    BitBlt(Canvas.Handle, 0,0,Width,Height,ScreenDC, Left, Top, SRCCOPY           );

  finally

    ReleaseDC(0, ScreenDC);

  end;

 end;

end;

Если вы запустите программу, то увидите что она сфотографировала рабочий стол и подменила его своим изображением. Возникает ощущение, что компьютер завис, потому что курсор мыши двигается, но ни одна кнопка или иконка не работает.

Теперь введём код в событие Timer1Timer? Который и добавляет помехи.

procedure TForm1.Timer1Timer(Sender: TObject);

var i, j: integer;

begin

For j:= 1 to Image1.Height do

begin

For i:= 1 to Image1.Width do

begin

If (i mod 2 = 1) and (j mod 2 = 1) then Image1.Canvas.Pixels[i, j]:=RGB(random(256), random(256), random(256));

If (i mod 2 = 0) and (j mod 2 = 0) then Image1.Canvas.Pixels[i, j]:=RGB(random(256), random(256), random(256));

end;

end;

end;

Как вы видете по событию таймера программа «обходит» все пиксели изображения и если координаты данного пикселя чётные (4, 8) или нечётные (3,5) задаёт им случайный цвет.

Можете поэкспериментировать с цветами вместо random(256) написав постоянное число в диапозоне 0..255 (1 байт).

Также перед завершающим end. Напишите:

Initialization

Randomize

Теперь поместите прогу в автозагрузку и наслаждайтесь :)) Правда есть одна проблемка - если ламер окажется не такой уж ламерюжный, то он легко сможет отрубить прогу в диспетчере задач. Но зачем нам такие ламеры? Благо мастдайных ламеров всегда поле непаханное!

Проделав лёгкие телодвижения эту прогу можно превратить в screensaver, сделав выход по нажатию кнопки клавиатуры или мыши. Эта заставка, конечно, будет малость неполноценной, т.к. она не будет отображаться в предварительном просмотре и показывать окно настроек.

Немного попозже обещаю написать как сделать полноценный screensaver.

Исходники здесь, а здесь exe.

Встретимся через неделю.

С уважением, Valar.


В избранное