Удалить рамку выделения у ListBox (Delphi)

Mina66

Местный
Регистрация
16 Апр 2007
Сообщения
5
Реакции
4
Credits
6
Ребята, подскажите как убрать рамку выделения Item'а (такой пунктирный прямоугольник вокруг Item), или ссылку где можно посмотреть.
Спасибо.
 

ploki

Местный
Регистрация
16 Май 2005
Сообщения
237
Реакции
180
Credits
0
Фокус рисуется всегда! Убрать вызов его прорисовки можно только правкой StdCtrls.pas. Но, к счастью, можно не убирать вызов, а добавить :)

Переводим наш ListBox в режим lbOwnerDrawFixed или lbOwnerDrawVariable (это уж как кому нужно).

В обработчике события OnDrawItem пишем в конце вызов DrawFocusRect в случае, если State включает odFocused. Всё!
Пример (не для виртуального списка!):
Код:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
//Далее простейший вариант прорисовки
  (Control as TListBox).Canvas.FillRect(Rect);

  DrawText(
    (Control as TListBox).Canvas.Handle, 
    PChar((Control as TListBox).Items[Index]),
    Length((Control as TListBox).Items[Index]), 
    Rect, 
    Control.DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX)); // Это можно оптимизировать
  
  // И самое главное!
  if odFocused in State then [B]DrawFocusRect[/B]((Control as TListBox).Canvas.Handle, Rect); // Пользуемся свойством подпрограммы DrawFocusRect, которое гласит, что её повторный вызов убирает рамку (которая рисуется с помощью операции xor)

end;
 

ploki

Местный
Регистрация
16 Май 2005
Сообщения
237
Реакции
180
Credits
0
to sfsoft
Первый раз слышу о таком событии у ListBox.