Переворачиваем десктоп
Автор: William Egge
Весёлая программка, которая позволяет
подшутить над Вашими друзьями :-). Пример
переворачивает десктоп и держит его в таком
положение, до тех пор пока не кликнуть по нему
мышкой. По мимо этого код содержит в себе
довольно интересные моменты.
Совместимость: Delphi 5.x (или выше)
1. В примере используется TDesktopCanvas, который
получить доступ к десктопучерез объект TCanvas.
2. Так же в примере используется TQuickPixel, который
позволяет увеличить скорость доступа к пикселям.
Скачайте исходник, откомпилируйте его, и
поместите программку в папку "Автозагрузка"
на компьютере Вашего друга и смело идите по своим
делам :-).
Для завершения работы программки достаточно
кликнуть по перевёрнутому экрану.
А теперь давайте разберёмся с исходником:
Класс TQuickPixel был сделан для быстрого доступа к
пикселам, чтобы не возиться со строками
развёртки. Для увеличения производительности,
данный класс кэширует строки развёртки.
Единственный недостаток данного класса
заключается в том, что он устанавливает Ваш Bitmap в
24 бита.
Ниже представлен собственно сам код TQuickPixel.
===================================
unit QuickPixel;
interface
uses
Windows, Graphics;
type
TQuickPixel = class
private
FBitmap: TBitmap;
FScanLines: array of PRGBTriple;
function GetPixel(X, Y: Integer): TColor;
procedure SetPixel(X, Y: Integer; const Value: TColor);
function GetHeight: Integer;
function GetWidth: Integer;
public
constructor Create(const ABitmap: TBitmap);
property Pixel[X, Y: Integer]: TColor read GetPixel write
SetPixel;
property Width: Integer read GetWidth;
property Height: Integer read GetHeight;
end;
implementation
{ TQuickPixel }
constructor TQuickPixel.Create(const ABitmap: TBitmap);
var
I: Integer;
begin
inherited Create;
FBitmap:= ABitmap;
FBitmap.PixelFormat:= pf24bit;
SetLength(FScanLines, FBitmap.Height);
for I:= 0 to FBitmap.Height-1 do
FScanLines[I]:= FBitmap.ScanLine[I];
end;
function TQuickPixel.GetHeight: Integer;
begin
Result:= FBitmap.Height;
end;
function TQuickPixel.GetPixel(X, Y: Integer): TColor;
var
P: PRGBTriple;
begin
P:= FScanLines[Y];
Inc(P, X);
Result:= (P^.rgbtBlue shl 16) or (P^.rgbtGreen shl 8) or P^.rgbtRed;
end;
function TQuickPixel.GetWidth: Integer;
begin
Result:= FBitmap.Width;
end;
procedure TQuickPixel.SetPixel(X, Y: Integer; const Value: TColor);
var
P: PRGBTriple;
begin
P:= FScanLines[Y];
Inc(P, X);
P^.rgbtBlue:= (Value and $FF0000) shr 16;
P^.rgbtGreen:= (Value and $00FF00) shr 8;
P^.rgbtRed:= Value and $0000FF;
end;
end.
|