VirtualTreeView с UseExplorerThemes

Я только что обнаружил, что использование Option toUseExplorerTheme позволяет создать красивый прямоугольник выбора для VirtualStringTree. Однако, если установлен параметр Option toGridExtensions и в дереве есть несколько столбцов, для внутренних ячеек не рисуется вертикальная граница выделения, а также отсутствуют закругленные углы. Правильно отрисовываются только крайние края и углы крайнего левого и правого столбцов. Выглядит так, как будто прямоугольник выбора рисуется между крайними столбцами, а фон невыбранных столбцов просто рисуется поверх прямоугольника выбора.

Отключение toGridExtensions приводит к правильному прямоугольнику выбора, но я предпочитаю, чтобы он был включен, потому что ячейку можно выбрать, только щелкнув текст в стандартном режиме (а не щелкнув пустое место рядом с текстом).

Проблема возникает с Delphi 7 и XE2, а также, возможно, с другими версиями.

Чтобы воспроизвести, добавьте в форму TVirtualStringTree, покажите заголовок, добавьте несколько столбцов в заголовок и активируйте параметры toGridExtensions (MiscOptions), toUseExplorerTheme (PaintOptions), toExtendedFocus (SelectionOptions), запустите программу и щелкните любую ячейку.


person wp_1233996    schedule 26.09.2013    source источник


Ответы (1)


На мой взгляд, это ошибка, потому что кто хотел бы иметь такой выбор:

введите здесь описание изображения

Чтобы исправить это в коде Virtual Tree View (в моем случае v.5.1.4), перейдите к методу TBaseVirtualTree.PrepareCell (в моем случае строка 25802) и проверьте этот код вложенной процедуры (комментарии мои):

procedure DrawBackground(State: Integer);
begin
  // here the RowRect represents the row rectangle and InnerRect the cell
  // rectangle, so there should be rather, if the toGridExtensions is NOT
  // in options set or the toFullRowSelect is, then the selection will be
  // drawn in the RowRect, otherwise in the InnerRect rectangle
  if (toGridExtensions in FOptions.FMiscOptions) or (toFullRowSelect in FOptions.FSelectionOptions) then
    DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, RowRect, nil)
  else
    DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, InnerRect, nil);
end;

Чтобы решить эту проблему, измените код следующим образом:

procedure DrawBackground(State: Integer);
begin
  // if the full row selection is disabled or toGridExtensions is in the MiscOptions, draw the selection
  // into the InnerRect, otherwise into the RowRect
  if not (toFullRowSelect in FOptions.FSelectionOptions) or (toGridExtensions in FOptions.FMiscOptions) then
    DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, InnerRect, nil)
  else
    DrawThemeBackground(Theme, PaintInfo.Canvas.Handle, TVP_TREEITEM, State, RowRect, nil);
end;

И вы получите такой выбор:

введите здесь описание изображения

То же самое относится и к следующей DrawThemedFocusRect вложенной процедуре.

Я сообщил об этой проблеме как Issue 376, что исправлено в revision r587.

person TLama    schedule 26.09.2013
comment
Отлично. Спасибо. - person wp_1233996; 27.09.2013
comment
Пожалуйста! В любом случае, с моим ранее предложенным решением было an issue, поэтому, пожалуйста, обновитесь до версии r587 для исправления. - person TLama; 19.12.2013