Si quieres dibujar un rectángulo debes de usar Rectangle, ya que DrawFocusRect siempre se dibuja igual independiente de los valores que asignes al canvas. Por otro lado no hace falta que crees un Pen y Canvas nuevos cada vez, sobre todo porque luego no los destruyes y quedan en memoria. Bueno yo lo haría así:
Código Delphi
[-]
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with Control as TListBox do
begin
Canvas.Brush.Style := bsSolid;
Canvas.Pen.Style := psSolid;
Canvas.Pen.Color := clRed;
Canvas.Pen.Width := 1;
if odSelected in State then
begin
Canvas.Brush.Color:= clGray;
Canvas.Rectangle(Rect);
end else
begin
Canvas.Brush.Color:= clWhite;
Canvas.FillRect(Rect);
end;
Canvas.Font.Color := clBlack;
Canvas.TextOut(Rect.Left + 1, Rect.Top + 1, Items[Index]);
end;
end;