Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обновление хитбоксов для узлов с кастомными иконками в VirtualStringTree

Delphi , Синтаксис , Деревья

При работе с компонентом TVirtualStringTree в Delphi может возникнуть проблема, когда узлы дерева отображают кастомные иконки, размер которых равен размеру узла. В этом случае может потребоваться изменить размер узла, чтобы правильно отобразить иконку. Однако, при изменении размера узла хитбоксы для клика не обновляются, и пользователь должен кликать в оригинальном ContentRect, чтобы выбрать узел.

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

Что не следует делать?

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

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

По умолчанию высота узла определяется свойством DefaultNodeHeight. Если вам неизвестна высота узла заранее, вы можете обработать событие OnMeasureItem. В этом событии вы можете изменить значение параметра NodeHeight, чтобы настроить высоту узла.

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

Как изменить ширину узла?

Для компонента TVirtualStringTree ширина узла рассчитывается как ширина текста узла, увеличенная на 2 * ширину поля (настраиваемую свойством TextMargin). Во время измерения ширины текста узла вызывается событие OnMeasureTextWidth, имеющее параметр 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.

Изменив размер узла с помощью OnMeasureItem (для высоты) или OnMeasureTextWidth (для ширины) в TVirtualStringTree, или с помощью OnGetNodeWidth в TVirtualDrawTree, хитбоксы для клика будут автоматически обновлены, и пользователь сможет кликать по узлу в правильном месте.

Создано по материалам из источника по ссылке.

В статье описывается проблема с хитбоксами для клика в узлах с кастомными иконками в компоненте TVirtualStringTree в Delphi и предлагается решение для правильного изменения размера узлов, чтобы хитбоксы были обновлены.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Деревья ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 22:40:05/0.0053839683532715/1