Следующая статья: Динамическое создание пункта всплывающего меню.
Как быстро наложить тень на заданную область?
Решение
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, который был создан где-то раньше.