Проблема стилей Delphi VCL с TListview EditCaption и HideSelection

Я использую Delphi 10.3 в приложении VCL со стилем Dark VCL (например, Windows10 Dark по умолчанию).

У меня есть две проблемы со стилями VCL в TListview.

При редактировании элемента в TListview редактирование списка не стилизовано: оно имеет белый фон с черным текстом. Есть ли способ применить стиль VCL к этому редактированию, хотя это не элемент управления VCL?

Кроме того, если HideSelection = False и представление списка не имеет фокуса, цвет фона выбранного элемента является светло-серым цветом по умолчанию вместо гораздо более темного цвета, который лучше соответствовал бы стилю VCL. Есть ли способ изменить это, кроме пользовательского рисунка?

Я проверил это с несколькими темными стилями VCL, у всех у них проблемы с TListView (и с TTreeview тоже).


person Gerrit Beuze    schedule 02.05.2019    source источник


Ответы (1)


Мне удалось исправить фон редактирования списка и цвет текста, переопределив обработчик сообщений WM_CTLCOLOREDIT в потомке TListView (в моем случае TListViewEx), как показано ниже. Если вы проверите исходный код VCL для TCustomListView.WMCtlColorEdit, вы увидите, что это исправление не распространяется на правильный случай GlassPaint, но я его не использую. Мне кажется, что на самом деле это ошибка VCL, и приведенный ниже код должен быть включен в TCustomListView.WMCtlColorEdit. Примечание: тот же тип исправления также работает для TTreeview (очевидно, с использованием потомка TTreeview)

Я еще не нашел обходного пути для несфокусированного цвета выделения.

procedure TListViewEx.WMCtlColorEdit(var Message: TMessage);
var
  DC: HDC;
begin
  if StyleServices.IsSystemStyle then
    inherited
  else
  begin
    DC := Message.WParam;
    SetTextColor(DC, StyleServices.GetSystemColor(clWindowText));
    SetBkColor(DC, StyleServices.GetSystemColor(clWindow));
    Message.Result := 1;
  end;
end;
person Gerrit Beuze    schedule 06.05.2019