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

Mina66

Member
Joined
month_4_short 16, 2007
Messages
5
Reaction score
4
Location
Россия
Ребята, подскажите как убрать рамку выделения Item'а (такой пунктирный прямоугольник вокруг Item), или ссылку где можно посмотреть.
Спасибо.
 

ploki

Member
Joined
month_5_short 16, 2005
Messages
237
Reaction score
180
Location
Москва
Фокус рисуется всегда! Убрать вызов его прорисовки можно только правкой StdCtrls.pas. Но, к счастью, можно не убирать вызов, а добавить :)

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

В обработчике события OnDrawItem пишем в конце вызов DrawFocusRect в случае, если State включает odFocused. Всё!
Пример (не для виртуального списка!):
Code:
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;
 

sfsoft

New member
Joined
month_6_short 6, 2008
Messages
3
Reaction score
0
Age
50
Ребята, подскажите как убрать рамку выделения Item'а (такой пунктирный прямоугольник вокруг Item), или ссылку где можно посмотреть.
Спасибо.
Обработать событие CustomDraw.
 
Top