procedure TForm2.DrawShadows(WDepth, HDepth : Integer);
var
Dst, RgnBox : TRect;
hOldDC : HDC;
OffScreen : TBitmap;
Pattern : TBitmap;
Bits : array[0..7] of WORD;
begin
Bits[0] := $0055;
Bits[1] := $00aa;
Bits[2] := $0055;
Bits[3] := $00aa;
Bits[4] := $0055;
Bits[5] := $00aa;
Bits[6] := $0055;
Bits[7] := $00aa;
hOldDC := Canvas.Handle;
Canvas.Handle := GetWindowDC(Form1.Handle);
OffsetRgn(ShadeRgn, WDepth, HDepth);
GetRgnBox(ShadeRgn, RgnBox);
Pattern := TBitmap.Create;
Pattern.ReleaseHandle;
Pattern.Handle := CreateBitmap(8, 8, 1, 1, @(Bits[0]));
Canvas.Brush.Bitmap := Pattern;
OffScreen := TBitmap.Create;
OffScreen.Width := RgnBox.Right-RgnBox.Left;
OffScreen.Height := RgnBox.Bottom-RgnBox.Top;
Dst := Rect(0, 0, OffScreen.Width, OffScreen.Height);
OffsetRgn(ShadeRgn, 0, -RgnBox.Top);
FillRgn(OffScreen.Canvas.Handle, ShadeRgn,
Canvas.Brush.Handle);
OffsetRgn(ShadeRgn, 0, RgnBox.Top);
// BitBlt ðàáîòàåò áûñòðåå CopyRect
BitBlt(OffScreen.Canvas.Handle, 0, 0, OffScreen.Width,
OffScreen.Height,
Canvas.Handle, RgnBox.Left, RgnBox.Top, SRCAND);
Canvas.Brush.Color := clBlack;
FillRgn(Canvas.Handle, ShadeRgn, Canvas.Brush.Handle);
BitBlt(Canvas.Handle, RgnBox.Left, RgnBox.Top,
OffScreen.Width,
OffScreen.Height, OffScreen.Canvas.Handle, 0, 0,
SRCPAINT);
OffScreen.Free;
Pattern.Free;
OffsetRgn(ShadeRgn, -WDepth, -HDepth);
ReleaseDC(Form1.Handle, Canvas.Handle);
Canvas.Handle := hOldDC;
end;
Êîììåíòàðèè :
Ôóíêöèÿ ðèñóåò òåíü ñëîæíîé ôîðìû íà ôîðìå Form2 (èçâèíÿþñü çà ñòèëü). Äëÿ îïðåäåëåíèÿ ôîðìû òåíè èñïîëüçóåòñÿ ðåãèîí ShadeRgn, êîòîðûé áûë ñîçäàí ãäå-òî ðàíüøå (íàïðèìåð â OnCreate). Îòíîñèòåëüíî ðåãèîíîâ ñì. Win32 API.
Åñëè ÷òî-òî íåïîíÿòíî, ïèøèòå ìíå ëè÷íî.
Òèòîâ Èãîðü Åâãåíüåâè÷
infos@obninsk.ru