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

Простейшие вопросы в области инженерной разработки
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

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

Сообщение Юрий »

Есть XY график и в нём курсор. При нажатии на график требуется отследить было ли нажатие на свободном месте графика или нажатие произведено когда курсор был захвачен (общий курсор изменил свою картинку, появился или крестик или параллельные отрезки). В свойствах курсора не нашёл параметра, указывающего на захват курсора. Вариант с использованием события Cursor Grab не очень привлекает, поскольку это событие идёт с некой задержкой по отношению к событию нажатия на график и требует анализа тайм аута. Захотел попробовать отследить в каком состоянии курсор, но что то не смог этого сделать просто по не знанию. У кого какие идеи, поделитесь, пожалуйста.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение Artem.spb »

Юрий писал(а): события Cursor Grab не очень привлекает, поскольку это событие идёт с некой задержкой по отношению к событию нажатия на график
Откуда такая информация?
Максимальная задержка 1 мс.
cursor.jpg
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

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

Сообщение Юрий »

Artem.spb, не важно какая задержка, главное, что она есть и события Mouse Down и Cursor Grab разнесены. А нужно то что? Если есть только Mouse Down а Cursor Grab нет, то производиться некое действие, например, в приложенном примере вызывается палитра выбора цветов. Если есть Mouse Down и Cursor Grab, то ничего не делается, вернее производится стандартная работа с курсором графика. Как я уже упоминал, этот вариант мне не нравится, хотя он и работает, см. вложение.
Курсор+.png
Курсор+.png (8.2 КБ) 8297 просмотров
Вложения
Курсор+.vi
(21.37 КБ) 99 скачиваний
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение Artem.spb »

выбор цвета чего?
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

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

Сообщение Юрий »

Artem.spb, Ну, пусть будет галстука. При чём тут это? Вопрос не в том, какое действие производится - это же пример. А вопрос в том как сформировать вызов этого действия. Даже использование события Cursor Grab лишнее, не очень хорошо и т.д., поскольку оно возникает только по нажатию мыши, а необходимая информация для принятия решения уже есть до нажатия, это то, что общий курсор принял иное значение, а именно: крестик или параллельные отрезки.
Последний раз редактировалось Юрий 16 мар 2017, 19:06, всего редактировалось 1 раз.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение Artem.spb »

При том, что может существовать другой путь определения необходимости выполнить действие
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

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

Сообщение Юрий »

Artem.spb писал(а):При том, что может существовать другой путь определения необходимости выполнить действие
Честно говоря, не понял мысль. Если речь идёт о других вариантов решения поставленной в начале задачи, то я буду премного благодарен, если они будут изложены.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение Artem.spb »

А задача-от в чём? с какой целью пользователь будет тыркать в график, если ему не надо курсор перетянуть?
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

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

Сообщение Юрий »

Artem.spb писал(а):А задача-от в чём? с какой целью пользователь будет тыркать в график, если ему не надо курсор перетянуть?
Если надо перетягивать курсор он и перетягивается. Если тыкается в свободное место от курсора, то формируется действие, зависящее от конкретной для данной программы задачи, например:
1. меняется цвет общего фона графика. Умоляю, не спрашивайте: "Зачем менять общий фон графика?".
2. на месте тычка помещается необходимая фигура.
3. верещащим голосом запускается голосовое сообщение: "Тыкай только в курсор графика", а, может, и текстовое сообщение.
и т.д.
А, если ближе к делу, то как увидеть в каком на данный момент состоянии находится общий курсор (не графика).
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение Artem.spb »

Задачи интересные, но я не знаю варианта без ожидания.
В одном из проектов отлавливаю одно/два нажатия по listbox (как раз нужна разная реакция). Приходится ставить флаги и таймауты.
да, подождать, а потом делать или нет.
Можно поиграть с динамическими событиями и обрабатывать mouse up, а не нажатие. И при грабе курсора выключать ожидание
m_up.png
ну и я бы не стал делать две event-структуры в одном цикле. лучше менять таймаут в одной.
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

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

Сообщение Юрий »

Artem.spb, Спасибо за вариант. Действительно, если действие формировать по UP, то всё ложиться более логично, правда использование динамических событий мне показалось вычурным. Всё то же самое, только без них см. во вложении. С другой стороны увидел в Вашем примере нечто для себя новенькое.
На счёт "но я не знаю варианта без ожидания" можно повториться. Если в событии Mouse Down анализировать картинку курсора, то тут же можно принять решение будет он захвачен или нет. Только вот как это делать - не знаю.
Вложения
Курсор++.vi
(22.44 КБ) 109 скачиваний
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение Artem.spb »

Можно и локальной переменной, но минус этого в том, что событие всё равно происходит. Да и переменная где-то висит. А с динамическими событиями холостого хода нет, впрочем, дело вкуса.
Как определить тип курсора я не знаю, единственно извращённый вариант, приходящий на ум - определять позицию курсора мыши и курсора графика и пытаться понять, попал ли пользователь. Но тут будет ещё препятствие в виде типа инструмента графика - зум, позиционирование, курсор.
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

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

Сообщение Vitekkz88 »

Юрий писал(а):Artem.spb, не важно какая задержка, главное, что она есть и события Mouse Down и Cursor Grab разнесены. А нужно то что? Если есть только Mouse Down а Cursor Grab нет, то производиться некое действие, например, в приложенном примере вызывается палитра выбора цветов. Если есть Mouse Down и Cursor Grab, то ничего не делается, вернее производится стандартная работа с курсором графика.
Задержка у Вас будет в любом случае, даже в самом оптимальном. С другой стороны, мне стало действительно интересно, кто куда торопится? Для пользователя будет одинаково быстро что 100 мс, что 10 мс. Вы по нажатию в свободное место графика менюшку вызываете же, да? Ну так и пусть она появляется через таймаут 100 мс. Либо заведите отдельный поток на обработку события вызова меню, обрабатываться будет со скоростью, которую позволит CPU. В Event-структуру 2 события: "Cursor Grab?" и MoseDown. Заводите по одному флагу на каждое событие. Регистрация события будет в любом случае с некоторым тайм-аутом, но обработка события может занимать микросекунды(флаг закидываете в очередь или уведомитель и шлёте в поток нужный, для вызова меню). Либо, если всё-таки, таймаут будет не критичен, выполняйте обработку прям в текущем event-е.
Либо меню с цветами вызывайте по нажатию правой кнопки мыши. А работу с курсором левой.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

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

Сообщение Юрий »

Vitekkz88, Всё это так. И мысли эти крутились в голове, но, как всегда, больная голова - ногам спокоя не даёт. Хочется, ведь, попроще, покрасивее, покомпактнее и т.д..
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

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

К сожалению, в :labview: нет стандартного :vi: для получения иконки указателя мыши. Придётся обратиться к WinAPI, вот хотя бы: http://stackoverflow.com/questions/1046 ... ursor-icon Если совсем нечем заняться будет, можно будет состряпать какой-нибудь инструментик. :wink:
---
В общем, как-то так получается.
Захват курсора.vi
lv2011
(9.49 КБ) 135 скачиваний
Get Mouse Cursor Icon.vi
lv2011
(59.11 КБ) 113 скачиваний
Последний раз редактировалось dadreamer 18 мар 2017, 14:10, всего редактировалось 1 раз.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»