Восстановление функции подсветки строк при наведении в ListView с OwnerDraw=true в Delphi
Вопрос, с которым вы столкнулись, заключается в том, что после включения свойства OwnerDraw для ListView в Delphi, пропала стандартная функция подсветки строк при наведении курсора. Это произошло из-за использования кастомного рисования элементов списка. Давайте разберемся, как можно восстановить эту функцию.
Использование события OnCustomDrawItem
Одним из простых способов изменения внешнего вида строк в ListView является использование события OnCustomDrawItem, которое доступно даже если свойство OwnerDraw установлено в False. В этом случае можно изменить цвета фона и шрифта строк, не теряя при этом стандартных эффектов подсветки и выбора.
Пример кода для OnCustomDrawItem:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
const
BgColors: array[Boolean] of TColor = (clWhite, clSilver);
FgColors: array[Boolean] of TColor = (clBlack, clBlack);
begin
Sender.Canvas.Brush.Color := BgColors[Odd(Item.Index)];
Sender.Canvas.Font.Color := FgColors[Odd(Item.Index)];
end;
Полное кастомное рисование с OwnerDraw = True
Если вам нужно более детальное управление внешним видом элементов ListView, можно использовать полное кастомное рисование, установив OwnerDraw в True. В этом случае можно определить процедуру OnDrawItem, которая будет вызываться для каждого элемента.
Пример кода для OnDrawItem:
procedure TForm1.ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
Rect: TRect; State: TOwnerDrawState);
const
BgColors: array[Boolean] of TColor = (clWhite, clSilver);
FgColors: array[Boolean] of TColor = (clBlack, clBlack);
Alignments: array[TAlignment] of TTextFormats = (tfLeft, tfRight, tfCenter);
var
LV: TListView;
i, x1, x2: Integer;
R: TRect;
S: string;
begin
// ... код для рисования элементов ...
if odSelected in State then
begin
// Код для рисования выделенной строки
end
else if odHotLight in State then
begin
// Код для рисования строки при наведении курсора
end
else
begin
// Код для рисования обычной строки
end;
end;
Восстановление эффекта подсветки при наведении
Для восстановления эффекта подсветки при наведении курсора на строку, можно использовать дополнительные обработчики событий OnMouseMove и OnMouseLeave, а также установить тег элемента ListView для отслеживания индекса выделенной строки.
Пример кода для OnMouseMove:
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
LI: TListItem;
Idx: Integer;
begin
LI := ListView1.GetItemAt(X, Y);
if Assigned(LI) then
Idx := LI.Index
else
Idx := -1;
if Idx <> ListView1.Tag then
begin
ListView1.Tag := Idx;
ListView1.Invalidate;
end;
end;
Пример кода для OnMouseLeave:
procedure TForm1.ListView1MouseLeave(Sender: TObject);
begin
if ListView1.Tag <> -1 then
begin
ListView1.Tag := -1;
ListView1.Invalidate;
end;
end;
И не забудьте обновить процедуру OnDrawItem, чтобы использовать новый тег для определения цвета фона при наведении.
Заключение
Использование событий OnCustomDrawItem или полное кастомное рисование с OwnerDraw = True позволяют вам контролировать внешний вид элементов ListView. Однако, для восстановления стандартных эффектов подсветки и выбора, может потребоваться дополнительная логика и обработка событий мыши. Следуя приведенным выше примерам, вы сможете восстановить функцию подсветки строк при наведении в ListView с OwnerDraw=true.
Описание контекста: Вопрос связан с восстановлением функции подсветки строк при наведении курсора в компоненте `ListView` с использованием свойства `OwnerDraw` в среде разработки Delphi, что требует настройки кастомного рисования элементов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.