При работе с компонентом ListView в среде Delphi и использовании VCL стилей, пользователи иногда сталкиваются с проблемой, когда цвет выделения ряда в ListView обрезается вокруг иконки, особенно если используется PNG ImageList. В данной статье мы рассмотрим, как исправить эту проблему.
Проблема
При настройке компонента ListView для отображения иконок из PNG ImageList с помощью события CustomDrawSubItem, пользователи могут столкнуться с ситуацией, когда цвет выделения ряда обрезается в области иконки. Это происходит из-за того, что при выделении ряда не рисуется фон под иконкой, и цвет выделения перекрывает изображение.
Пример кода
Для решения проблемы необходимо добавить рисование фона под иконкой при выделении ряда. Вот пример кода, который решает эту задачу:
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
var
R: TRect;
C: TCanvas;
begin
ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @R);
C := Sender.Canvas;
if cdsSelected in State then
begin
C.Brush.Color := clHighlight;
C.FillRect(R);
end;
if SubItem = 1 then
begin
ImageList_Draw(PngImageList1.Handle, 0, C.Handle, R.Left + (R.Width - PngImageList1.Width) div 2, R.Top, ILD_TRANSPARENT);
DefaultDraw := False;
end;
end;
Пошаговое решение
В методе ListView1CustomDrawSubItem получить прямоугольник субэлемента с помощью функции ListView_GetSubItemRect.
Проверить состояние элемента (State) на наличие флага cdsSelected, который указывает на выделение.
Если элемент выделен, закрасить фон субэлемента с помощью цвета выделения (clHighlight).
Если субэлемент содержит иконку (в данном случае, если SubItem = 1), нарисовать иконку из PNG ImageList с использованием режима ILD_TRANSPARENT.
Отменить стандартное рисование субэлемента, установив DefaultDraw в False.
Заключение
Применение предложенного кода позволит правильно отобразить цвет выделения в ListView, не обрезая его вокруг иконки, и обеспечит корректное отображение субэлементов с изображениями в формате PNG при использовании VCL стилей.
Улучшение визуального отображения выделения строк в ListView с использованием PNG ImageList в Delphi, с решением проблемы обрезки цвета выделения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS