VirtualTreeView: проверьте, виден ли узел - PullRequest
4 голосов
/ 20 марта 2012

Как проверить, видим ли узел (на экране) с компонентом VirtualTreeView? Примерно так:

if not Grid.NodeVisible (Node) then
   Grid.ScrollIntoView (Node, True);

Узел должен быть центрирован, если он не был виден, но оставаться там, где он есть, если он был виден.

Обратите внимание, что я говорю не о видимом флаге узла, а о видимости на экране. Свойство IsVisible всегда возвращает True в моем случае.

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Я думаю, что самым близким из них является метод GetDisplayRect():

Определяет клиентские координаты, которые охватывает данный узел, в зависимости от прокрутки, состояния расширения и т. Д. Если данный узел не может быть найден(поскольку один из его родителей свернут или он невидим), возвращается пустой прямоугольник.

Не уверен, что он возвращает в случае, если узел «виден, но не виден» - возможно,написать вспомогательную функцию, которая проверяет возвращаемый прямоугольник внутри клиентского прямоугольника VT ...

0 голосов
/ 06 апреля 2012

Свойство IsVisible возвращается, только если узлы были скрыты или нет, как вы нашли. Единственный способ узнать, находится ли узел на экране, - это использовать GetDisplayRect, как это было предложено, и затем проверить его на соответствие клиентскому прямоугольнику древовидного представления.

Однако, если я понимаю, что вы пытаетесь сделать правильно, опция toCenterScrollIntoView в SelectionOption для VirtualTreeView даст вам желаемое поведение без необходимости проверять, находится ли узел в видимой области или нет.

есть (C ++):

TreeView->TreeOptions->SelectionOptions =
TreeView->TreeOptions->SelectionOptions << toCenterScrollIntoView ;
...
ScrollIntoView(Node);
...