VirtualStringTree: исправление хитбокса узла после OnBeforeCellPaint

В моей форме есть элемент управления virtualstringtree, который должен отображать значки из списка изображений для определенных узлов. Это работает нормально, однако, оно также должно отображать пользовательские нарисованные значки, которые равны по высоте узлу и квадрату, для определенных узлов.

Я использую событие OnBeforeCellPaint для рисования этих изображений и изменяю ContentRect для размещения дополнительного пространства, которое требуется в элементе.

ContentRect.Offset(ContentRect.Height + 4, 0);

(+4 должен иметь такой же интервал от "иконки" для текста, как и для тех, которые загружены из списка изображений)

Этот метод, кажется, работает нормально, узлы отрисованы правильно и прямоугольники выбора также. Однако хитбоксы для щелчка по узлам не обновляются. Я должен нажать на оригинальный ContentRect, чтобы выбрать узел.

Как мне обновить хитбокс?

1 ответ

Решение

Чего следует избегать?

Не изменяйте ContentRect в OnBeforeCellPaint если вы хотите изменить размер узла. ContentRect прямоугольник в OnBeforeCellPaint Событие предназначено для изменения места, где будет отображаться ячейка. Это на самом деле не меняет размер узла. Тем ContentRect Смещение Вы только что переместили рисование из физического положения узла, из положения, в котором можно щелкнуть узел.

Как настроить высоту узла?

Фиксированная высота узла по умолчанию определяется DefaultNodeHeight имущество. Если вы не знаете заранее высоту нужного вам узла, вы можете написать обработчик для OnMeasureItem событие. Там вы можете изменить NodeHeight значение параметра для регулировки высоты узла.

Когда вы будете обрабатывать OnMeasureItem событие, обязательно включите toVariableNodeHeight вариант к TreeOptions.MiscOptions опция установлена.

Как настроить ширину узла?

За TVirtualStringTree в частности, ширина узла вычисляется по измеренной ширине текста узла, увеличенной на 2 * текстовое поле (настраивается TextMargin имущество). Во время измерения ширины текста узла OnMeasureTextWidth событие происходит с объявленным Extent параметр, который содержит измеренную ширину текста. Изменяя это Extent Параметр, вы будете влиять на общую ширину узла, так как это событие внутренне используется только для этой цели.

Итак, чтобы увеличить ширину каждого узла, например, на 20 пикселей, вы можете написать следующее:

procedure TForm1.VirtualStringTree1MeasureTextWidth(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  const Text: string; var Extent: Integer);
begin
  Extent := Extent + 20;
end;

Вот результат без измененного экстента текста:

За TVirtualDrawTree контролировать ситуацию намного проще. Имеет OnGetNodeWidth событие, которое используется для указания ширины узла через его NodeWidth объявленный параметр.

Другие вопросы по тегам