Articles

You should use onDrawItem event of ListBox component, if you want to create ListBox with some background picture. Pay attention to the IntersectRect function.

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  ImageRect1, NewRect, ImageRect2, ResRect: TRect;
begin
  ImageRect1 := Classes.Rect(
    0,
    0,
    Image1.Picture.Bitmap.Width,
    Image1.Picture.Bitmap.Height);

  ImageRect2 := ImageRect1;
  IntersectRect(ResRect, ImageRect2, Rect);

  NewRect.Left:=ImageRect1.Left;
  NewRect.Top:=ImageRect1.Top+ResRect.Top-ImageRect2.Top;
  NewRect.Right:=ImageRect1.Right;
  NewRect.Bottom:=ImageRect1.Bottom+
                    ResRect.Bottom-
                    ImageRect2.Bottom;

  ListBox1.Canvas.CopyRect(
    ResRect,
    Image1.Picture.Bitmap.Canvas,
    NewRect);

  ListBox1.Canvas.Brush.Style:=bsClear;
  ListBox1.Canvas.TextOut(
    Rect.Left+2,
    Rect.Top,
    ExtractFileName(ListBox1.Items[Index]));