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
объявленный параметр.