Детище которое тебе предстоит сейчас создать, называется АРМАГЕДЕЦ ВИНДАМ. Как ты уже наверное понял это из серии издевательств над виндосом (и над неопытными юзверями). Если ты сейчас подумал, что подобные приколы уже надоели, хватит уже и т.д., то я тебя не держу.Одевайся уходи. Но знай это тебе не овцы которые сыпятся с наднебесья монитора, и не кошка бегающая за мышкой, это нечто более злое и серьезное, это АРМАГЕДЕЦ.
Ну так вот, идея сего творения состоит в том, что после того как юзверь запускает прогу, начинает трястись рабочий стол, а потом и вовсе разрывается на разъезжающиеся куски. Скажу сразу в общих чертах как это достигается. На форму кидаем Image и 2 таймера. 1 таймер сотрясает десктоп, а второй его разрывает. При запуске проги, ее окно растягивается на весь экран, вместе с окном и Image, в который собственно и копируется содержимое десктопа. Ну а дальше пошла жара.
Итак, надеюсь ты уже приготовил форму с вышеописанными компонентами( Image и 2 таймера). Разберемся с переменными. Нам нужны: канва которая будет канвой десктопа, 2 переменные типа bitmap, это будут половины расколотого десктопа, и две переменные типа Integer, здесь будут левые координаты половин. У меня это выглядит так:
Кликай пару раз по форме и ты в процедуре FormCreate ( если ты этого не осознаешь, мне тебя жалко). Приведу код, а потом объясню.
procedure TForm2.FormCreate(Sender: TObject);
begin
DstCanva:=TCanvas.Create; // Создаем канву
DstCanva.Handle:=GetDC(0); //Получаем контекст десктопа и присваеваем его канве.
//Теперь это канва десктопа.
Left :=0; // В этой и следующих трех строках растягиваем форму на весь экран.
Top :=0;
Width:=Screen.Width;
Height:=Screen.Height;
with Image1 do
begin
Left:=0; // В этой и следующих трех строках растягиваем Image на всё окно.
Top:=0;
Width:=Form2.Width; // Не смотри что у меня Form2, а не Form1,
//просто так получилось. Можешь назвать хоть Form349
Height:=Form2.Height;
// Здесь копируем изо десктопа в Image
Canvas.CopyRect(Canvas.ClipRect,DstCanva, DstCanva.ClipRect);
end;
Image1.Canvas.Font.Color :=clRed; // Устанавливаем цвет и размер шрафта
Image1.Canvas.Font.Size :=20; // ведь нам нужно будет напугать друга-чайника
Im2:=TBitmap.Create; // Создаем Bitmap первой половины
Im3:=TBitmap.Create; // Создаем Bitmap второй половины
Im2.Height:=Height; // В этой и следующих трех строках задаем размеры половин.
Im2.Width :=Trunc(Image1.Width /2);//Они должны быть одинаковыми ведь это половины.
Im3.Width :=Im2.Width;
Im3.Height :=Height;
Half1:=0; // Это будет левой координатой 1 половины
Half2:=Im3.Width; // Это будет левой координатой 2 половины.
//Равна она как ты видишь и понимаешь центру
//Здесь копируем половину Image в Im2 и половину в Im3
Im2.Canvas.CopyRect(Im2.Canvas.ClipRect,Image1.Canvas, Im2.Canvas.ClipRect);
Im3.Canvas.CopyRect(Im3.Canvas.ClipRect,Image1.Canvas,
Rect(Im3.Width,Top,Im3.Width*2,Height));
randomize; // Запускаем ген случайных чисел. Он будет нужен при сотрясении десктопа.
end;
Этого должно хватить для понимания. Если тебе не понятно как работает какая-нибудь функция, загляни в хелп. Сразу же напиши обработчик FormClose в нем нужно уничтожить всё что было тобой создано, а создано было: канва и 2 Bitmap'а.
DstCanva.Free;
Im2.Free;
Im3.Free;
Теперь перейдем к таймерам. Как я уже говорил, один из них будет сотрясатель, а другой разрыватель экрана. Запускать таймеры я решил по событию FormShow. У сотрясателя интервал явно должен быть меньше чем у разрывателя. У меня можно сказать экран будеть разъезжаться а не разрыватьться потому что у разрывателя я поставил интервал 1000.
У сотрясателя я поставил 20. Итак, сотрясатель всего лишь будет передвигать форму не больше чем на пять пикселей в любую сторону ( можешь сделать и не 5), а поскольку это будет происходить каждые 20 миллисекунд, то получается землетрясение какое-то.
procedure TForm2.Timer1Timer(Sender: TObject);
var
Atop,Aleft:Integer;
begin
// Генерятся числа в диапазоне от -5 до 5
Atop:=RandomRange(-5,5);
Aleft:=RandomRange(-5,5);
// Перемещаю форму на кол-во пикселей равное сгенеренным числам
Left:=Aleft;
Top:=Atop;
end;
Сотрясатель готов. Теперь дело за разрывателем. Принцип работы разрывателя: правая часть копии десктопа должна уезжать вправо, а левая как ты понимаешь влево. Левые координаты частей должны соответственно уменьшаться и увеличиваться. Короче вот код с полнейшими коментариями.
Inc(Half2,5); // Увеличиваю координату правой части
Dec(Half1,5); // Уменьшаю координату левой части
Image1.Canvas.FillRect(Image1.Canvas.ClipRect);// Закрашиваю Image белым цветом
// Здесь я вывожу текст, но сначала он будет закрыт половинами изображения
Image1.Canvas.TextOut(Trunc(Width/2-Width/6),Trunc(Height/2),'Комп заражён вирусом');
// Рисую обе половинки
Image1.Canvas.Draw(Half1,0,Im2);
Image1.Canvas.Draw(Half2,0,Im3);
Еще несколько слов. Сначала я делал 2 формы. Первая растягивалась на весь экран и закрашивалась черным цветом. Это было для того чтобы при сотрясении не было видно реального десктопа, но как показала практика по скольку смещение всего на 5 пикселей, то его и так не видно. Исходники прилагаются.