Пересчёт позиции мыши в номер элемента списка DI_LISTBOX Topic is solved
- buniak_a_h
- Posts: 4259
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
Здравствуйте, уважаемые знатоки!
Есть ли у кого-нить опыт (или, возможно, готовый кусок кода), при помощи которого можно по координата клика мыши определить строку ListBox-а? В статье, посвященной DM_GETDLGRECT, есть пример, при помощи которого можно пересчитать координату Y в номер видимой строки. При этом есть ограничение: это не будет работать, если (а) части строк выставлен флаг DIF_HIDDEN и (б) некоторые строки к тому же отфильтрованы.
Можно сделать цикл по всем строкам и считать видимый номер - для DIF_HIDDEN это получится. А вот как определить отфильтрованные строки, не прибегая к недокументированным возможностям - подскажите, пожалуйста!
Есть ли у кого-нить опыт (или, возможно, готовый кусок кода), при помощи которого можно по координата клика мыши определить строку ListBox-а? В статье, посвященной DM_GETDLGRECT, есть пример, при помощи которого можно пересчитать координату Y в номер видимой строки. При этом есть ограничение: это не будет работать, если (а) части строк выставлен флаг DIF_HIDDEN и (б) некоторые строки к тому же отфильтрованы.
Можно сделать цикл по всем строкам и считать видимый номер - для DIF_HIDDEN это получится. А вот как определить отфильтрованные строки, не прибегая к недокументированным возможностям - подскажите, пожалуйста!
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
Читать с экрана текст? как вы это умеете делать собсна
еще тот изврат получается, зато "документированно"
еще тот изврат получается, зато "документированно"
- buniak_a_h
- Posts: 4259
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
Не-не! Хотел по
ПКМ
сделать отметку как по Ins
(в сохранении контекстов).Есть вариант установить флаг DIF_LISTTRACKMOUSEINFOCUS. Но мне не нравится, когда программа решает за юзера, где быть указателю.
Ладно, я, кажется, придумал. Самая верхняя видимая строка определяется легко, от неё отсчитаю с учётом в т.ч. и недокументированных флагов.
- John Doe
- Бюрократ
- Posts: 13847
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
У меня для вас два ответа:buniak_a_h wrote: ↑Sat 06 Mar, 2021 06:16 Есть ли у кого-нить опыт (или, возможно, готовый кусок кода), при помощи которого можно по координата клика мыши определить строку ListBox-а?
1. На первый взгляд похоже как какой-то изврат. Сильно подозреваю что можно использовать события листбокса/комбобокса.
2. Но сама по себе задача адресации элементов списка - вполне реальна. Я в своё время тоже сталкивался с этой проблемой (может даже на мантис писал).
Возможно в апи чего-то не хватает.
Также, можете попробовать через апи макросов - там обратная проблема (всё адресуется через видимые позиции)
https://t.me/FarManager — Telegram чат
- buniak_a_h
- Posts: 4259
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
Возможно. Принимаются любые советы. Тема такая: нужно по ПКМ отмечать строку в ListBox-е (аналогично как это происходит в панелях). При этом могут быть строки, скрытые LIF_HIDE и отсеянные фильтрацией. У самого листбокса ни DIF_LISTTRACKMOUSE, ни DIF_LISTTRACKMOUSEINFOCUS не установлены. Мне в голову пришёл только такой изврат. Но пока "наступил на горло собственной гордости" и установил флаг DIF_LISTTRACKMOUSEINFOCUS. Но мне не нравится, что случайное перемещение мышки (просто подвинул, чтоб не мешала, кот задел, ногой за провод потянул) приводит к смене фокусированной строки. Вот это, как раз, по-моему изврат!
Last edited by buniak_a_h on Sat 06 Mar, 2021 14:22, edited 1 time in total.
- John Doe
- Бюрократ
- Posts: 13847
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
Без извратов это могло бы быть реализовано так.buniak_a_h wrote: ↑Sat 06 Mar, 2021 14:21 Тема такая: нужно по ПКМ отмечать строку в ListBox-е (аналогично как это происходит в панелях)
1. Нажатие ПКМ сейчас просто игнорируется, отсюда и недостаток контроля.
Возможное решение: ввести флаг, который будет заставлять листбокс реагировать на все клавиши.
2. Далее просто обрабатываем DN_LISTCHANGE, проверяем состояние клавиш мыши (любым способом, можно и через предварительный анализ DN_CONTROLINPUT), делаем своё дело, и возвращаем FALSE.
https://t.me/FarManager — Telegram чат
- John Doe
- Бюрократ
- Posts: 13847
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
Альтернативно (с извратами, поскольку без усовершенствования апи иначе пока не получится).
Используем DN_CONTROLINPUT (как вы вероятно сейчас и делаете).
С элементом списка работаем посредством апи макросов, которое как раз и предполагает указание видимых позиций.
Но там могут быть и свои подводные камни (поскольку изврат).
https://t.me/FarManager — Telegram чат
- John Doe
- Бюрократ
- Posts: 13847
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
Альтернативно: FarListItem мог бы содержать дополнительные данные, такие как индекс среди видимых элементов, и/или положение элемента относительно самого листбокса (для невидимых -1).
https://t.me/FarManager — Telegram чат
- John Doe
- Бюрократ
- Posts: 13847
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
Ещё альтернатива: DM_LISTGETITEM можно было бы научить получать элемент по видимому индексу, добавив для этого спецфлаг в структуру FarListGetItem.
Или же реализовать это отдельным сообщением, типа DM_LISTGETITEM_VISIBLE.
Или же реализовать это отдельным сообщением, типа DM_LISTGETITEM_VISIBLE.
https://t.me/FarManager — Telegram чат
- buniak_a_h
- Posts: 4259
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
John Doe, спасибо большое. Вы укрепили меня в понимании, что без либо извратов, либо дописывания АПИ не реализовать. А то я уж думал, что я чего-то не узнал …
К сожалению, главный автор АПИ - Shmuel - отошёл от дел, а выпавшее знамя никто, по-моему, не подхватил. Поэтому Ваше предложениезамечание про научить получать элемент по видимому индексу, или даже ввести флаг, который будет заставлять листбокс реагировать на все клавиши было бы решением, но делать некому. Ну, правда, аргумент DrKnS-а, приведённый в цитате выше (что флаг может измениться), становится без разработчика неактуальным.
Увы, эта величина зависит от внешних, неподконтрольных скрипту, условий. Я - про фильтр: не запрещать же юзеру нажимать
CtrlAltF
(или RAlt
)!К сожалению, главный автор АПИ - Shmuel - отошёл от дел, а выпавшее знамя никто, по-моему, не подхватил. Поэтому Ваше предложениезамечание про научить получать элемент по видимому индексу, или даже ввести флаг, который будет заставлять листбокс реагировать на все клавиши было бы решением, но делать некому. Ну, правда, аргумент DrKnS-а, приведённый в цитате выше (что флаг может измениться), становится без разработчика неактуальным.
- John Doe
- Бюрократ
- Posts: 13847
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
А при чём тут скрипт, имелось ввиду что эту величину мог бы фар возвращать.buniak_a_h wrote: ↑Sat 06 Mar, 2021 16:42 Увы, эта величина зависит от внешних, неподконтрольных скрипту, условий.
Но сейчас речь об апи плагинов, а не luafar.
Другой вопрос что вообще у нас с авторами плохо..
https://t.me/FarManager — Telegram чат
- buniak_a_h
- Posts: 4259
- Joined: Sat 20 Apr, 2013 00:17
- Location: Санкт-Петробад
- Has thanked: 222 times
- Been thanked: 644 times
- Contact:
Пересчёт позиции мыши в номер элемента списка DI_LISTBOX
Спасибо всем, проявившим участие. Задача решена с минимальными потерями.