Телефон: +7 (926) 245-03-63

Тень в заданной области

Следующая статья: Динамическое создание пункта всплывающего меню.

Как быстро наложить тень на заданную область?

Решение

procedure TForm1.DrawShadows(WDepth, HDepth: Integer); 
var Dst, RgnBox: TRect; hOldDC: HDC; OffScreen, 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;

Функция рисует сложную тень на форме Form1. Для определения формы тени используется регион ShadeRgn, который был создан где-то раньше.

Интересное в интернете: ящики хеттих, каталоги.