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

Mina66

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

ploki

Member
Joined
May 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
Jun 6, 2008
Messages
3
Reaction score
0
Age
48
Ребята, подскажите как убрать рамку выделения Item'а (такой пунктирный прямоугольник вокруг Item), или ссылку где можно посмотреть.
Спасибо.
Обработать событие CustomDraw.
 
Top