Отображение в ToolTip строк, не поместившихся в поле
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 27.02.23 17:22
Оценка:
В интерфейсах многих программ вижу, что при наведении на поле, в которое не поместилась длинная строка (где в конце многоточие), в ToolTip показывается строка полностью. Хочу такое приделать к List View (Report), но нигде не могу найти в документации подходящих стилей. Я где-то не там ищу, или стандартных средств нет, и все делают это руками?

Если руками, то есть ли кошерный способ определить, что строка обрезана? Когда-то это обсуждалось
Автор: serg_fork
Дата: 25.10.07
, но и там предлагались только ненадежные косвенные решения.
Re: Отображение в ToolTip строк, не поместившихся в поле
От: Carc Россия https://vk.com/gosha_mazov
Дата: 27.02.23 17:41
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>В интерфейсах многих программ вижу, что при наведении на поле, в которое не поместилась длинная строка (где в конце многоточие), в ToolTip показывается строка полностью. Хочу такое приделать к List View (Report), но нигде не могу найти в документации подходящих стилей. Я где-то не там ищу, или стандартных средств нет, и все делают это руками?


ЕМ>Если руками, то есть ли кошерный способ определить, что строка обрезана? Когда-то это обсуждалось
Автор: serg_fork
Дата: 25.10.07
, но и там предлагались только ненадежные косвенные решения.

LVM_SETEXTENDEDLISTVIEWSTYLE + LVS_EX_INFOTIP + LVS_EX_LABELTIP

Только там не все так просто. Насколько я помню, не получается устанавливать разные тултипы для разных столбцов. Т.к. нотификация LVN_GETINFOTIP генерируется один раз на индекс ListView, и не генерится повторно для того же индекса, но другого столбца.

Второе, что подмечалось: в виртуальном режиме ListView кеширует запрошенный в LVN_GETINFOTIP тултип. И "упросить" его перезапросить еще раз тултип для того же самого индекса штатными средствами у меня так и не получилось. Повторно ListView сгенерит LVN_GETINFOTIP, только после того как повозить мышом по айтемам.... Всякие разные хаки я пробовал, но а) ненадежно и недокументировано и б) большинство так и не сработало (хотя ну очень было нужно)...
Aml Pages Home
Re[2]: Отображение в ToolTip строк, не поместившихся в поле
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 27.02.23 17:51
Оценка:
Здравствуйте, Carc, Вы писали:

C>LVS_EX_INFOTIP


Это я знаю, но это и получается "руками". Думал, что со времен XP это хоть как-то окультурили.

C>Т.к. нотификация LVN_GETINFOTIP генерируется один раз на индекс ListView, и не генерится повторно для того же индекса, но другого столбца.


Хм, как же тогда это везде реализовано? Совсем вручную?
Re[3]: Отображение в ToolTip строк, не поместившихся в поле
От: Carc Россия https://vk.com/gosha_mazov
Дата: 27.02.23 18:02
Оценка: 18 (1)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Carc, Вы писали:


C>>LVS_EX_INFOTIP


ЕМ>Это я знаю, но это и получается "руками". Думал, что со времен XP это хоть как-то окультурили.

Стоит посмотреть на стиль LVS_EX_LABELTIP — он что-то подобное делает вроть.

C>>Т.к. нотификация LVN_GETINFOTIP генерируется один раз на индекс ListView, и не генерится повторно для того же индекса, но другого столбца.


ЕМ>Хм, как же тогда это везде реализовано? Совсем вручную?

Ну по идее можно получить HWND Тултипа от самого ListView: LVM_GETTTOOLTIPS или через NMLVGETINFOTIP::hwndFrom, а потом уж ручками на WM_mouseMove делать что-нить вроть TTM_UPDATETIPTEXT. Как-то так...

Для какого столбца будет проситься тултип можно манипулировать через LVM_SETCOLUMNORDERARRAY, но все равно имхо на остальные столбцы, но того же самого индекса автоматом LVN_GETINFOTIP не запросится. Сугубое имхо, но личное — ручками: в основном WinXP, 7-ка, 10-ка...
Aml Pages Home
Re[4]: Отображение в ToolTip строк, не поместившихся в поле
От: Carc Россия https://vk.com/gosha_mazov
Дата: 30.04.23 18:01
Оценка: +1
Здравствуйте, Carc, Вы писали:

C>Для какого столбца будет проситься тултип можно манипулировать через LVM_SETCOLUMNORDERARRAY, но все равно имхо на остальные столбцы, но того же самого индекса автоматом LVN_GETINFOTIP не запросится. Сугубое имхо, но личное — ручками: в основном WinXP, 7-ка, 10-ка...

Про повторный запрос тултипа для айтема, для которого уже ListView уже только что запрашивал тултип через LVN_GETINFOTIP.

Бинго! Я все-таки её трахнул нашел таки способ уломать ListView запросить повторно тултип через LVN_GETINFOTIP.
Хак простой: перед LVM_SETITEMCOUNT, делаем ListView`ю LVM_DELETEALLITEMS.

Идея простая: раз ListView в виртуальном режиме все эти LVM_DELETEALLITEMS ему как-бы пофиг. Но заставляют его сбрасывать кешированный тултип. Ну, а уж после зовем дефолтный стандартный LVM_SETITEMCOUNT. После этого возим мышом заново по тому же самому айтему ListView, и о магия!
Фигакс прилетает повторный LVN_GETINFOTIP.
Aml Pages Home
Отредактировано 30.04.2023 18:02 Carc . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.