В интерфейсах многих программ вижу, что при наведении на поле, в которое не поместилась длинная строка (где в конце многоточие), в ToolTip показывается строка полностью. Хочу такое приделать к List View (Report), но нигде не могу найти в документации подходящих стилей. Я где-то не там ищу, или стандартных средств нет, и все делают это руками?
Если руками, то есть ли кошерный способ определить, что строка обрезана? Когда-то это
обсуждалосьАвтор: serg_fork
Дата: 25.10.07
, но и там предлагались только ненадежные косвенные решения.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>В интерфейсах многих программ вижу, что при наведении на поле, в которое не поместилась длинная строка (где в конце многоточие), в 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, только после того как повозить мышом по айтемам.... Всякие разные хаки я пробовал, но а) ненадежно и недокументировано и б) большинство так и не сработало (хотя ну очень было нужно)...
Здравствуйте, Carc, Вы писали:
C>LVS_EX_INFOTIP
Это я знаю, но это и получается "руками". Думал, что со времен XP это хоть как-то окультурили.
C>Т.к. нотификация LVN_GETINFOTIP генерируется один раз на индекс ListView, и не генерится повторно для того же индекса, но другого столбца.
Хм, как же тогда это везде реализовано? Совсем вручную?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, 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-ка...
Здравствуйте, 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.