Как нарисовать выбранный элемент списка другим цветом?

Можно ли изменить цвет фокуса выбора элемента и цвет текста в TListBox?

Когда в проекте не включены темы или стиль окна списка установлен на рисование владельцем, выделение вокруг элемента окрашивается в синий цвет, что, как я полагаю, глобально определяется настройками внешнего вида системы.

Я хотел бы изменить цвет выбранных элементов на собственный цвет.

Итак, например, результат будет примерно таким:

введите здесь описание изображения

Обратите внимание, что последний список был изменен в Paint для иллюстрации примера.


person Community    schedule 19.12.2011    source источник


Ответы (3)


попробуй это:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with (Control as TListBox).Canvas do
  begin
    if odSelected in State then
      Brush.Color := $00FFD2A6;

    FillRect(Rect);
    TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[Index]);
    if odFocused In State then begin
      Brush.Color := ListBox1.Color;
      DrawFocusRect(Rect);
    end;
  end;
end;
person SimaWB    schedule 19.12.2011
comment
@Craig - убедитесь, что у пользователей нет одинакового цвета текста окна. - person Sertac Akyuz; 19.12.2011
comment
Спасибо @Sertac, я подумаю об этом. - person ; 22.12.2011
comment
Пробовал это, но процедура TForm1.ListBox1DrawItem никогда не вызывается, я поставил на нее точку останова, и она никогда не останавливается на этом. Что мне не хватает? - person delphirules; 28.06.2017
comment
Разве для этого не требуется, чтобы ListBox1.Style был одним из значений lbOwnerDrawXxxx? - person dummzeuch; 29.06.2017

Я видел, свойство Style должно быть lbOwnerDrawFixed

person delphirules    schedule 28.06.2017

Это помогло мне сделать то, что мне нужно было сделать, а именно, убрать все видимые выделения. Я немного изменил приведенный выше код, чтобы добиться этого:

procedure TForm1.OnDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with (Control as TListBox).Canvas do
  begin
    if odSelected in State then
    begin
      Brush.Color := clWhite;
      Font.Color := clBlack;
    end;

    FillRect(Rect);
    TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[Index]);
    if odFocused In State then begin
      Brush.Color := ListBox1.Color;
      DrawFocusRect(Rect);
    end;
  end;
end;

Сделал цвет фона выбранного элемента белым, а цвет шрифта черным, что сделало то, что мне нужно. Большое спасибо!

person Jared Schmidt    schedule 31.10.2019