Imas srece, ne treba DirectX. Stvar mozes izvesti na sledeci nacin: Uzmes sliku ekrana pre prikazivanja tvog prozora koji cemo nazvati A. Tu sliku pretvoris u grayscale. Prvo kreiras prozor B koji podesis da nema ivice, da je maximized i prikazes ga sa show. U njemu naravno imas preko celog prozora TImage u koji ces staviti onu grayscale sliku. Zatim prikazes prozor A preko njega i to je to. I windows to radi vrlo slicno.
Da malo pomognem evo nekih metoda koji ti trebaju za trik:
Code:
...
type
PRGBArray = ^TRGBArray;
TRGBArray = Array[0..2500] of TRGBTriple;
...
procedure TakeScreenShot(Bm : TBitmap);
var
DC: hDC;
X, Y: integer;
ScreenWidth, ScreenHeight: integer;
r : word;
begin
ScreenWidth:= GetSystemMetrics(sm_CXScreen);
ScreenHeight:= GetSystemMetrics(sm_CYScreen);
Bm.Width:= ScreenWidth;
Bm.Height:= ScreenHeight;
Bm.PixelFormat:= pf24bit;
DC:= GetDC(0);
try
BitBlt( Bm.Canvas.Handle, 0, 0,
ScreenWidth, ScreenHeight, DC, 0, 0, SrcCopy);
finally
ReleaseDC(0, DC);
end;
end;
procedure GrayOutBitmap(Bm : TBitmap);
Var
Y, X : integer;
SL: PRGBArray;
begin
for Y := 0 to Bm.Height - 1 do
begin
SL := Bm.ScanLine[Y];
for X := 0 to Bm.Width - 1 do
begin
SL[X].rgbtRed := Round( 0.212671 * SL[X].rgbtRed + 0.715160 *
SL[X].rgbtGreen + 0.072169 * SL[X].rgbtBlue );
SL[X].rgbtGreen := SL[X].rgbtRed;
SL[X].rgbtBlue := SL[X].rgbtRed;
end
end;
end;