Àêæàí â ñåòè - Íà óðîâåíü ââåðõ(W32) Êàê áûñòðî íàðèñîâàòü òåíü â çàäàííîì ðåãèîíå?

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