Курсор графика. Отследить нажатие.

Простейшие вопросы в области инженерной разработки

Курсор графика. Отследить нажатие.

Postby Юрий on 16 Mar 2017, 17:05

Есть XY график и в нём курсор. При нажатии на график требуется отследить было ли нажатие на свободном месте графика или нажатие произведено когда курсор был захвачен (общий курсор изменил свою картинку, появился или крестик или параллельные отрезки). В свойствах курсора не нашёл параметра, указывающего на захват курсора. Вариант с использованием события Cursor Grab не очень привлекает, поскольку это событие идёт с некой задержкой по отношению к событию нажатия на график и требует анализа тайм аута. Захотел попробовать отследить в каком состоянии курсор, но что то не смог этого сделать просто по не знанию. У кого какие идеи, поделитесь, пожалуйста.
Юрий
adviser
adviser
 
Posts: 246
Joined: 28 Feb 2010, 18:04
LabVIEW Version: LV2011
Karma: 52

Re: Курсор графика. Отследить нажатие.

Postby Artem.spb on 16 Mar 2017, 18:08

Юрий wrote: события Cursor Grab не очень привлекает, поскольку это событие идёт с некой задержкой по отношению к событию нажатия на график

Откуда такая информация?
Максимальная задержка 1 мс.
cursor.jpg
Artem.spb
expert
expert
 
Posts: 1206
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

Re: Курсор графика. Отследить нажатие.

Postby Юрий on 16 Mar 2017, 18:40

Artem.spb, не важно какая задержка, главное, что она есть и события Mouse Down и Cursor Grab разнесены. А нужно то что? Если есть только Mouse Down а Cursor Grab нет, то производиться некое действие, например, в приложенном примере вызывается палитра выбора цветов. Если есть Mouse Down и Cursor Grab, то ничего не делается, вернее производится стандартная работа с курсором графика. Как я уже упоминал, этот вариант мне не нравится, хотя он и работает, см. вложение.
Курсор+.png
Курсор+.png (8.2 KiB) Viewed 1269 times
Attachments
Курсор+.vi
(21.37 KiB) Downloaded 25 times
Юрий
adviser
adviser
 
Posts: 246
Joined: 28 Feb 2010, 18:04
LabVIEW Version: LV2011
Karma: 52

Re: Курсор графика. Отследить нажатие.

Postby Artem.spb on 16 Mar 2017, 18:46

выбор цвета чего?
Artem.spb
expert
expert
 
Posts: 1206
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

Re: Курсор графика. Отследить нажатие.

Postby Юрий on 16 Mar 2017, 18:55

Artem.spb, Ну, пусть будет галстука. При чём тут это? Вопрос не в том, какое действие производится - это же пример. А вопрос в том как сформировать вызов этого действия. Даже использование события Cursor Grab лишнее, не очень хорошо и т.д., поскольку оно возникает только по нажатию мыши, а необходимая информация для принятия решения уже есть до нажатия, это то, что общий курсор принял иное значение, а именно: крестик или параллельные отрезки.
Last edited by Юрий on 16 Mar 2017, 19:06, edited 1 time in total.
Юрий
adviser
adviser
 
Posts: 246
Joined: 28 Feb 2010, 18:04
LabVIEW Version: LV2011
Karma: 52

Re: Курсор графика. Отследить нажатие.

Postby Artem.spb on 16 Mar 2017, 19:05

При том, что может существовать другой путь определения необходимости выполнить действие
Artem.spb
expert
expert
 
Posts: 1206
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

Re: Курсор графика. Отследить нажатие.

Postby Юрий on 16 Mar 2017, 19:11

Artem.spb wrote:При том, что может существовать другой путь определения необходимости выполнить действие

Честно говоря, не понял мысль. Если речь идёт о других вариантов решения поставленной в начале задачи, то я буду премного благодарен, если они будут изложены.
Юрий
adviser
adviser
 
Posts: 246
Joined: 28 Feb 2010, 18:04
LabVIEW Version: LV2011
Karma: 52

Re: Курсор графика. Отследить нажатие.

Postby Artem.spb on 16 Mar 2017, 19:25

А задача-от в чём? с какой целью пользователь будет тыркать в график, если ему не надо курсор перетянуть?
Artem.spb
expert
expert
 
Posts: 1206
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

Re: Курсор графика. Отследить нажатие.

Postby Юрий on 16 Mar 2017, 19:45

Artem.spb wrote:А задача-от в чём? с какой целью пользователь будет тыркать в график, если ему не надо курсор перетянуть?

Если надо перетягивать курсор он и перетягивается. Если тыкается в свободное место от курсора, то формируется действие, зависящее от конкретной для данной программы задачи, например:
1. меняется цвет общего фона графика. Умоляю, не спрашивайте: "Зачем менять общий фон графика?".
2. на месте тычка помещается необходимая фигура.
3. верещащим голосом запускается голосовое сообщение: "Тыкай только в курсор графика", а, может, и текстовое сообщение.
и т.д.
А, если ближе к делу, то как увидеть в каком на данный момент состоянии находится общий курсор (не графика).
Юрий
adviser
adviser
 
Posts: 246
Joined: 28 Feb 2010, 18:04
LabVIEW Version: LV2011
Karma: 52

Re: Курсор графика. Отследить нажатие.

Postby Artem.spb on 16 Mar 2017, 22:07

Задачи интересные, но я не знаю варианта без ожидания.
В одном из проектов отлавливаю одно/два нажатия по listbox (как раз нужна разная реакция). Приходится ставить флаги и таймауты.
да, подождать, а потом делать или нет.
Можно поиграть с динамическими событиями и обрабатывать mouse up, а не нажатие. И при грабе курсора выключать ожидание
m_up.png

ну и я бы не стал делать две event-структуры в одном цикле. лучше менять таймаут в одной.
Artem.spb
expert
expert
 
Posts: 1206
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

Re: Курсор графика. Отследить нажатие.

Postby Юрий on 16 Mar 2017, 23:35

Artem.spb, Спасибо за вариант. Действительно, если действие формировать по UP, то всё ложиться более логично, правда использование динамических событий мне показалось вычурным. Всё то же самое, только без них см. во вложении. С другой стороны увидел в Вашем примере нечто для себя новенькое.
На счёт "но я не знаю варианта без ожидания" можно повториться. Если в событии Mouse Down анализировать картинку курсора, то тут же можно принять решение будет он захвачен или нет. Только вот как это делать - не знаю.
Attachments
Курсор++.vi
(22.44 KiB) Downloaded 21 times
Юрий
adviser
adviser
 
Posts: 246
Joined: 28 Feb 2010, 18:04
LabVIEW Version: LV2011
Karma: 52

Re: Курсор графика. Отследить нажатие.

Postby Artem.spb on 17 Mar 2017, 00:18

Можно и локальной переменной, но минус этого в том, что событие всё равно происходит. Да и переменная где-то висит. А с динамическими событиями холостого хода нет, впрочем, дело вкуса.
Как определить тип курсора я не знаю, единственно извращённый вариант, приходящий на ум - определять позицию курсора мыши и курсора графика и пытаться понять, попал ли пользователь. Но тут будет ещё препятствие в виде типа инструмента графика - зум, позиционирование, курсор.
Artem.spb
expert
expert
 
Posts: 1206
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

Re: Курсор графика. Отследить нажатие.

Postby Vitekkz88 on 17 Mar 2017, 06:11

Юрий писал(а):Artem.spb, не важно какая задержка, главное, что она есть и события Mouse Down и Cursor Grab разнесены. А нужно то что? Если есть только Mouse Down а Cursor Grab нет, то производиться некое действие, например, в приложенном примере вызывается палитра выбора цветов. Если есть Mouse Down и Cursor Grab, то ничего не делается, вернее производится стандартная работа с курсором графика.

Задержка у Вас будет в любом случае, даже в самом оптимальном. С другой стороны, мне стало действительно интересно, кто куда торопится? Для пользователя будет одинаково быстро что 100 мс, что 10 мс. Вы по нажатию в свободное место графика менюшку вызываете же, да? Ну так и пусть она появляется через таймаут 100 мс. Либо заведите отдельный поток на обработку события вызова меню, обрабатываться будет со скоростью, которую позволит CPU. В Event-структуру 2 события: "Cursor Grab?" и MoseDown. Заводите по одному флагу на каждое событие. Регистрация события будет в любом случае с некоторым тайм-аутом, но обработка события может занимать микросекунды(флаг закидываете в очередь или уведомитель и шлёте в поток нужный, для вызова меню). Либо, если всё-таки, таймаут будет не критичен, выполняйте обработку прям в текущем event-е.
Либо меню с цветами вызывайте по нажатию правой кнопки мыши. А работу с курсором левой.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
leader
leader
 
Posts: 934
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 257
hardware I/O VIP

Re: Курсор графика. Отследить нажатие.

Postby Юрий on 17 Mar 2017, 11:11

Vitekkz88, Всё это так. И мысли эти крутились в голове, но, как всегда, больная голова - ногам спокоя не даёт. Хочется, ведь, попроще, покрасивее, покомпактнее и т.д..
Юрий
adviser
adviser
 
Posts: 246
Joined: 28 Feb 2010, 18:04
LabVIEW Version: LV2011
Karma: 52

Re: Курсор графика. Отследить нажатие.

Postby dadreamer on 17 Mar 2017, 21:00

Юрий wrote:Захотел попробовать отследить в каком состоянии курсор, но что то не смог этого сделать просто по не знанию.

Юрий wrote:Если в событии Mouse Down анализировать картинку курсора, то тут же можно принять решение будет он захвачен или нет. Только вот как это делать - не знаю.

Похоже, что такое решение "в лоб" единственное, если идти именно таким путём. Может, я что-то упустил, но не нашёл также нигде способа получить текущее состояние захваченного курсора (похоже, не реализовано за ненадобностью). Так что, подобный вариант с захватом иконки курсора имеет право на жизнь. Правда не знаю, какова будет латентность работы такого алгоритма, если речь о каких-то там миллисекундах.

К сожалению, в :labview: нет стандартного :vi: для получения иконки указателя мыши. Придётся обратиться к WinAPI, вот хотя бы: http://stackoverflow.com/questions/1046 ... ursor-icon Если совсем нечем заняться будет, можно будет состряпать какой-нибудь инструментик. :wink:
---
В общем, как-то так получается.
Захват курсора.vi
lv2011
(9.49 KiB) Downloaded 26 times
Get Mouse Cursor Icon.vi
lv2011
(59.11 KiB) Downloaded 22 times
Last edited by dadreamer on 18 Mar 2017, 14:10, edited 1 time in total.
User avatar
dadreamer
doctor
doctor
 
Posts: 2858
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 704
I/O VIP vision internet

Next

Return to Для чайников

Who is online

Users browsing this forum: Andrew Lunev, Baidu, Bing [Bot], Yandex and 2 guests

cron