Пересчёт позиции мыши в номер элемента списка DI_LISTBOX Topic is solved

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by buniak_a_h »

Здравствуйте, уважаемые знатоки!
Есть ли у кого-нить опыт (или, возможно, готовый кусок кода), при помощи которого можно по координата клика мыши определить строку ListBox-а? В статье, посвященной DM_GETDLGRECT, есть пример, при помощи которого можно пересчитать координату Y в номер видимой строки. При этом есть ограничение: это не будет работать, если (а) части строк выставлен флаг DIF_HIDDEN и (б) некоторые строки к тому же отфильтрованы.
Можно сделать цикл по всем строкам и считать видимый номер - для DIF_HIDDEN это получится. А вот как определить отфильтрованные строки, не прибегая к недокументированным возможностям - подскажите, пожалуйста!
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by citRiks »

Читать с экрана текст? как вы это умеете делать собсна :)
еще тот изврат получается, зато "документированно"
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by buniak_a_h »

citRiks wrote: Sat 06 Mar, 2021 10:38 Читать с экрана текст?
Не-не! Хотел по ПКМ сделать отметку как по Ins (в сохранении контекстов).
Есть вариант установить флаг DIF_LISTTRACKMOUSEINFOCUS. Но мне не нравится, когда программа решает за юзера, где быть указателю.
Ладно, я, кажется, придумал. Самая верхняя видимая строка определяется легко, от неё отсчитаю с учётом в т.ч. и недокументированных флагов.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by John Doe »

buniak_a_h wrote: Sat 06 Mar, 2021 06:16 Есть ли у кого-нить опыт (или, возможно, готовый кусок кода), при помощи которого можно по координата клика мыши определить строку ListBox-а?
У меня для вас два ответа:
1. На первый взгляд похоже как какой-то изврат. Сильно подозреваю что можно использовать события листбокса/комбобокса.
2. Но сама по себе задача адресации элементов списка - вполне реальна. Я в своё время тоже сталкивался с этой проблемой (может даже на мантис писал).
Возможно в апи чего-то не хватает.
Также, можете попробовать через апи макросов - там обратная проблема (всё адресуется через видимые позиции)
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by buniak_a_h »

John Doe wrote: Sat 06 Mar, 2021 13:45 На первый взгляд похоже как какой-то изврат
Возможно. Принимаются любые советы. Тема такая: нужно по ПКМ отмечать строку в 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.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by John Doe »

buniak_a_h wrote: Sat 06 Mar, 2021 14:21 Тема такая: нужно по ПКМ отмечать строку в ListBox-е (аналогично как это происходит в панелях)
Без извратов это могло бы быть реализовано так.
1. Нажатие ПКМ сейчас просто игнорируется, отсюда и недостаток контроля.
Возможное решение: ввести флаг, который будет заставлять листбокс реагировать на все клавиши.
2. Далее просто обрабатываем DN_LISTCHANGE, проверяем состояние клавиш мыши (любым способом, можно и через предварительный анализ DN_CONTROLINPUT), делаем своё дело, и возвращаем FALSE.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by John Doe »

buniak_a_h wrote: Sat 06 Mar, 2021 14:21 Принимаются любые советы.
Альтернативно (с извратами, поскольку без усовершенствования апи иначе пока не получится).
Используем DN_CONTROLINPUT (как вы вероятно сейчас и делаете).
С элементом списка работаем посредством апи макросов, которое как раз и предполагает указание видимых позиций.
Но там могут быть и свои подводные камни (поскольку изврат).
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by John Doe »

John Doe wrote: Sat 06 Mar, 2021 15:58 С элементом списка работаем посредством апи макросов
Альтернативно: FarListItem мог бы содержать дополнительные данные, такие как индекс среди видимых элементов, и/или положение элемента относительно самого листбокса (для невидимых -1).
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by John Doe »

Ещё альтернатива: DM_LISTGETITEM можно было бы научить получать элемент по видимому индексу, добавив для этого спецфлаг в структуру FarListGetItem.
Или же реализовать это отдельным сообщением, типа DM_LISTGETITEM_VISIBLE.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by buniak_a_h »

John Doe, спасибо большое. Вы укрепили меня в понимании, что без либо извратов, либо дописывания АПИ не реализовать. А то я уж думал, что я чего-то не узнал …
John Doe wrote: Sat 06 Mar, 2021 16:04 Альтернативно: FarListItem мог бы содержать дополнительные данные, такие как индекс среди видимых элементов
Увы, эта величина зависит от внешних, неподконтрольных скрипту, условий. Я - про фильтр: не запрещать же юзеру нажимать CtrlAltF (или RAlt)!
К сожалению, главный автор АПИ - Shmuel - отошёл от дел, а выпавшее знамя никто, по-моему, не подхватил. Поэтому Ваше предложениезамечание про научить получать элемент по видимому индексу, или даже ввести флаг, который будет заставлять листбокс реагировать на все клавиши было бы решением, но делать некому. Ну, правда, аргумент DrKnS-а, приведённый в цитате выше (что флаг может измениться), становится без разработчика неактуальным. :-)
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by John Doe »

buniak_a_h wrote: Sat 06 Mar, 2021 16:42 Увы, эта величина зависит от внешних, неподконтрольных скрипту, условий.
А при чём тут скрипт, имелось ввиду что эту величину мог бы фар возвращать.
buniak_a_h wrote: Sat 06 Mar, 2021 16:42 К сожалению, главный автор АПИ - Shmuel - отошёл от дел
Но сейчас речь об апи плагинов, а не luafar.
Другой вопрос что вообще у нас с авторами плохо..
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Пересчёт позиции мыши в номер элемента списка DI_LISTBOX

Post by buniak_a_h »

Спасибо всем, проявившим участие. Задача решена с минимальными потерями.
Post Reply

Return to “Нужна помощь”