
В данном посте, мы попробуем метод описать, с помощью которого можно будет экран разделить сначало на блоки, а потом уже поменять данные блоки местами. Еще можно размеры самих блоков менять, а также скорость перемещения последних. К тому же это будет неплохое начало для творения интересной логической игрушки или же какой-то экранной заставки…
Полностью мы уверены - из Вас каждый хоть раз видел подобное что-то в уже действии! Именно при пуске, программа изображение самого десктопа берёт его и разделяет на необходимое к-тво прямоугольных частей одинаковых по своему размеру. После данной процедуры, часть блоков автоматически перемещается с собственного места.
На автосайте autotuni.ru, представлена схема автоматической коробки передач - посмотрите. интересно!
Как же все это на практике осуществить?
Для этого давайте создадим новый проект Дельфи с полностью чистой формой.
Продолжая, установим свойство Name именно в позицию 'Shuffler'.
После чего добавим на нашу форму компонент Image (а именно, Image1) и также компонент Timer (Timer1).
Image у нас в данном случае содержать будет в себе самого десктопа изображение (оно буде разобранное), а Timer вызывать будет процедуру рисования.
Само свойство Interval, нужного нам компонента под названием Timer, определяет с какой частотой, происходить будет перемешивание (число 1000 = одной секунде, 2000 = 2 секундам).
Еще для нашего проекта необходима парочка глобальных переменных. Приведенный ниже код перед секцией implementation в самом модуле формы:
var
Shuffler: TShuffler; //здесь добавлено было самой Дельфи
DesktopBitmap : TBitmap;
gx, gy : Integer;
redRect : TBitmap;
rW, rH : Integer;
const
DELTA = 8; //здесь быть должно 2^n
Значение самой константы (integer) DELTA то определяет, на сколько именно частей разбит будет экран (имеются ввиду строки и колонки). Число же DELTA, обьязательно быть должно в виде 2^n, где именно n - целое (integer) представляется числом со знаком.
Большое же значение DELTA к небольшим размерам блоков приводит.
К примеру, в том случае, когда DELTA = 16 и разрешение самого экрана 1024 x 768, то будет экран разделён на 256 частей, каждая размером 64x48.
- DesktopBitmap представляет собой битмап, хранящий в себе текущее захваченное изображение самого десктопа - мы здесь получать будем данное изображение, когда будем делать скриншот.
- redRect представляет собой битмап картинка, заменяющая перемещённую картинки часть. redRect в событии формы создаётся под названием OnCreate.
- gx, gy текущие координаты содержат x и y (Left, Top) redRect именно внутри самого разобранного изображения.
- rW, rH представляют собой ширину и высоту блока прямоугольного. Для 1024x768 и DELTA=16, rW равно будет 64 а rH = 48.
Проект наш выполняться начинает с обработчика события под названием OnCreate:
procedure TShuffler.FormCreate(Sender: TObject);
begin
rW := Screen.Width div DELTA;
rH := Screen.Height div DELTA;
redRect:=TBitmap.Create;
with redRect do begin
Width := rW;
Height := rH;
Canvas.Brush.Color := clRed;
Canvas.Brush.Style := bssolid;
Canvas.Rectangle(0,0,rW,rH);
Canvas.Font.Color := clNavy;
Canvas.Font.Style := Canvas.Font.Style + [fsBold];
Canvas.TextOut(2,2,'About');
Canvas.Font.Style := Canvas.Font.Style - [fsBold];
Canvas.TextOut(2,17,'Delphi');
Canvas.TextOut(2,32,'Programming');
end;
Timer1.Enabled := False;
Image1.Align := alClient;
Visible := False;
BorderStyle := bsNone;
Top := 0;
Left := 0;
Width := Screen.Width;
Height := Screen.Height;
InitScreen;
// SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,
SWP_NOSIZE + SWP_NOMOVE);
Visible := True;
Timer1.Interval := 10; // здесь именно меньше := быстрее
Timer1.Enabled := True; // здесь запускаем вызов самого DrawScreen
end;
Продолжение в теме - «Рокировка» блоков экрана. Часть 2