Авторазворачивание Tree control в разных системах
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 21.10.22 09:48
Оценка: 3 (1)
Есть графическая программа (точнее, плагин к программе), где отображается динамически конструируемый Tree control. Обнаружилось, что на Win7 этот контрол автоматически разворачивается на один уровень от корневого элемента, тогда как на Win10 такого не происходит, всё дерево полностью свёрнутое. Прогнав через Spy++, обнаружил, что, действительно, в Win7 после создания дерева и наполнения его элементами контролу прилетает сообщение TVM_EXPAND, тогда как в десятке его нет. (Разумеется, запускалась одна и та же версия с одним и тем же конфигом.)

К сожалению, плагин без открытых исходников, а в ассемблере я не настолько профи, чтобы докопаться до нужного места. То есть чисто теоретически есть вероятность, что в самом плагине проверяется версия операционки и по этому условию дерево либо разворачивается, либо нет. Но с точки зрения логики это было бы совершенно безумное, ничем не обоснованное решение. Поэтому больше верится, что различие в поведении каким-то образом связано именно с самой операционкой. Но до сих пор мне не приходилось слышать о таких эффектах в Windows 10. Может, кто-нибудь в курсе подобных казусов? Чем они могут быть вызваны и есть ли возможность повлиять на это поведение без модификации кода? (Конечно, для десятки можно накостылить сторонний хук с автоматической посылкой сообщения разворачивания после инициализации дерева, но мне интересно в первую очередь разобраться в причинах такого поведения.)

Если хочется подробностей, то речь идёт о плагине FileInfo к файл-менеджеру Total Commander; при просмотре PE-файлов вкладка Dll Dependencies выводит дерево зависимостей до заданной в настройках глубины (по умолчанию 2). Плагин, судя по всему, написан в Visual C++ 2008 (linker version 9.00). Сам Total Commander написан на Delphi/Lazarus (32- и 64-битная версия, соответственно); разница в поведении проявляется в обеих битностях.
Примеры скриншотов, как окно выглядит сразу после открытия: Win7, Win10.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re: Авторазворачивание Tree control в разных системах
От: wildwind Россия  
Дата: 21.10.22 10:44
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

>Но с точки зрения логики это было бы совершенно безумное, ничем не обоснованное решение.


Мимикрия под меняющиеся стандарты UI вполне распространенное явление. И в общем-то, обоснованное.

>Но до сих пор мне не приходилось слышать о таких эффектах в Windows 10.


Например, в Проводнике Мой компьютер в 7 раскрыт, а в 10 нет.


CF>Если хочется подробностей, то речь идёт о плагине FileInfo к файл-менеджеру Total Commander


Есть же форум TC-шный, там и спрашивай.
Re: Авторазворачивание Tree control в разных системах
От: Carc Россия https://vk.com/gosha_mazov
Дата: 21.10.22 10:53
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>Есть графическая программа (точнее, плагин к программе), где отображается динамически конструируемый Tree control. Обнаружилось, что на Win7 этот контрол автоматически разворачивается на один уровень от корневого элемента, тогда как на Win10 такого не происходит, всё дерево полностью свёрнутое. Прогнав через Spy++, обнаружил, что, действительно, в Win7 после создания дерева и наполнения его элементами контролу прилетает сообщение TVM_EXPAND, тогда как в десятке его нет. (Разумеется, запускалась одна и та же версия с одним и тем же конфигом.)


А посмотреть чего там в TVM_EXPAND? Какие WPARAM, LPARAM? И вообще оно (TVM_EXPAND) в 10-ке прилетает или вовсе нет?

CF>К сожалению, плагин без открытых исходников, а в ассемблере я не настолько профи, чтобы докопаться до нужного места.

А хулио, нам Хулио!?! ©

Отсабклассить TreeCtrl, да и в момент Икс, проверить состояние корневого узла TreeView_GetRoot и TreeView_GetItemState + TVIS_EXPANDED
и развернуть корневой узел, если ну очень нада
Ну, как-то так…
Aml Pages Home
Re[2]: Авторазворачивание Tree control в разных системах
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 21.10.22 11:29
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Мимикрия под меняющиеся стандарты UI вполне распространенное явление. И в общем-то, обоснованное.


W>Например, в Проводнике Мой компьютер в 7 раскрыт, а в 10 нет.


Слишком уж разные сценарии. Пиши я такой плагин, мне бы в принципе не могло прийти в голову как-то ориентироваться на состояние дерева каталогов в Проводнике.
Тем более, что в десятке он не просто так свёрнут, а потому что там акцент смещён на Быстрый доступ (или как они его там обозвали), и он теперь развёрнут вместо Уже Не Моего Этого компьютера. А в плагине никаких замен нет и не предполагалось.
То есть, да, я теоретически допускаю, что автор мог так поверхностно рассуждать (там Компьютер свёрнут — дай и я сверну зависимости), но больно уж странные мозги должны быть для этого.

W>Есть же форум TC-шный, там и спрашивай.


Спросил, естественно. Но автор уже несколько лет там не появлялся, и неизвестно даже, жив ли он. А другие участники просто подтвердили, что да, есть такое. Людей, разбирающихся в глубинах программ, там в процентном соотношении не так много, это же форум для пользователей в первую очередь.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[2]: Авторазворачивание Tree control в разных системах
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 21.10.22 11:34
Оценка:
Здравствуйте, Carc, Вы писали:

CF>>Есть графическая программа (точнее, плагин к программе), где отображается динамически конструируемый Tree control. Обнаружилось, что на Win7 этот контрол автоматически разворачивается на один уровень от корневого элемента, тогда как на Win10 такого не происходит, всё дерево полностью свёрнутое. Прогнав через Spy++, обнаружил, что, действительно, в Win7 после создания дерева и наполнения его элементами контролу прилетает сообщение TVM_EXPAND, тогда как в десятке его нет. (Разумеется, запускалась одна и та же версия с одним и тем же конфигом.)


C>А посмотреть чего там в TVM_EXPAND? Какие WPARAM, LPARAM? И вообще оно (TVM_EXPAND) в 10-ке прилетает или вовсе нет?


Параметры обычные, TVE_EXPAND в wParam, какой-то хэндл в lParam (видимо, корневого узла, больше некого). А в десятке это сообщение не прилетает вообще.

C>Отсабклассить TreeCtrl, да и в момент Икс, проверить состояние корневого узла TreeView_GetRoot и TreeView_GetItemState + TVIS_EXPANDED

C>и развернуть корневой узел, если ну очень нада
C>Ну, как-то так…

Ну да, это уже обходные пути по адаптации. Мне хочется сначала понять, кто виноват, и лишь во вторую очередь — что делать. Просто чтобы для своих будущих программ знать, надо ли мне учитывать особенности такого рода, или это всё-таки плагин так странно написан.
Почему же, ё-моё, ты нигде не пишешь «ё»?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.