Страница 1 из 2

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

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

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

Добавлено: 16 мар 2017, 18:08
Artem.spb
Юрий писал(а): события Cursor Grab не очень привлекает, поскольку это событие идёт с некой задержкой по отношению к событию нажатия на график
Откуда такая информация?
Максимальная задержка 1 мс.
cursor.jpg

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

Добавлено: 16 мар 2017, 18:40
Юрий
Artem.spb, не важно какая задержка, главное, что она есть и события Mouse Down и Cursor Grab разнесены. А нужно то что? Если есть только Mouse Down а Cursor Grab нет, то производиться некое действие, например, в приложенном примере вызывается палитра выбора цветов. Если есть Mouse Down и Cursor Grab, то ничего не делается, вернее производится стандартная работа с курсором графика. Как я уже упоминал, этот вариант мне не нравится, хотя он и работает, см. вложение.
Курсор+.png
Курсор+.png (8.2 КБ) 8304 просмотра

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

Добавлено: 16 мар 2017, 18:46
Artem.spb
выбор цвета чего?

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 16 мар 2017, 22:07
Artem.spb
Задачи интересные, но я не знаю варианта без ожидания.
В одном из проектов отлавливаю одно/два нажатия по listbox (как раз нужна разная реакция). Приходится ставить флаги и таймауты.
да, подождать, а потом делать или нет.
Можно поиграть с динамическими событиями и обрабатывать mouse up, а не нажатие. И при грабе курсора выключать ожидание
m_up.png
ну и я бы не стал делать две event-структуры в одном цикле. лучше менять таймаут в одной.

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

Добавлено: 16 мар 2017, 23:35
Юрий
Artem.spb, Спасибо за вариант. Действительно, если действие формировать по UP, то всё ложиться более логично, правда использование динамических событий мне показалось вычурным. Всё то же самое, только без них см. во вложении. С другой стороны увидел в Вашем примере нечто для себя новенькое.
На счёт "но я не знаю варианта без ожидания" можно повториться. Если в событии Mouse Down анализировать картинку курсора, то тут же можно принять решение будет он захвачен или нет. Только вот как это делать - не знаю.

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

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

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

Добавлено: 17 мар 2017, 06:11
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-е.
Либо меню с цветами вызывайте по нажатию правой кнопки мыши. А работу с курсором левой.

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

Добавлено: 17 мар 2017, 11:11
Юрий
Vitekkz88, Всё это так. И мысли эти крутились в голове, но, как всегда, больная голова - ногам спокоя не даёт. Хочется, ведь, попроще, покрасивее, покомпактнее и т.д..

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

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

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