Обнаружение единственного щелчка мышью в MFC

Вы можете использовать концепцию feature engineering, известную как lag-feature, чтобы сохранить отношение последовательности. Например, метка для координат, вероятно, будет зависеть от последних или 2-х последних координат. Таким образом, вы можете использовать 2 последние строки объектов вместе с текущей строкой, с выводом текущей строки в качестве цели. Это efficient метод для сохранения такой взаимосвязи в данных. Вот ссылка для получения дополнительной информации.

Вы также можете попробовать recurrent-network , это еще один лучший способ отслеживать time-relation в данных.

5
задан Serge Wautier 9 February 2009 в 07:57
поделиться

7 ответов

(Позвольте мне называть эти события Mouse Up и Mouse Down. Мой MFC немного ржав. И существует этот материал под названием.NET, кто портил мою терминологию в последнее время ;-)

Рассказ: Вы просто не хотите знать о Щелчке мышью. Вам нужен больше.

Длинная история:

Хотя это парадоксально, кажется, что просто желание щелчка мышью является довольно редким. Чаще всего Вы захотите выполнить некоторую обработку на Мыши Вниз и сделать некоторую последующую обработку на Мыши. Прием - то, что просто отслеживание Мыши обменивается сообщениями, недостаточно: Мыши Вниз не могло произойти в Вашем окне. Вы считаете это допустимым щелчком затем? Особенно полагая, что Мышь, Вниз обрабатывающая (такая как выбор объекта), не произошла.

Идя далее обоснование, Вы не должны полагаться на получение Мыши после обработки Мыши Вниз: Пользователь, возможно, переместил мышь и отпустил кнопку где-то в другом месте (думайте drag'n'drop), в этом случае Вы не получаете Событие mouseUp..., если Вы не получаете мышь на MouseDown, чтобы удостовериться, что Вы получаете событие от нажатия мыши до Мыши, даже если мышь оставила Ваше окно.

В целом, Вы заканчиваете тем, что разыскали Мышь, получаете мышь и когда Вы получаете Мышь, просто проверьте, владеете ли Вы получением. В противном случае мышью или дважды щелкнули (никакая 2-я мышь вниз), или Мышь Вниз произошла где-то в другом месте следовательно, Вы, скорее всего, не заботитесь об этой Мыши.

В заключении: нет никакого сообщения MouseClick просто, потому что Вы не пошли бы очень далеко с ним: необходимо обработать больше сообщений и реализовать больше механики так или иначе.

О! И если Ваш контакт с существующим управлением, которое уже обрабатывает все это объекты и материал выбора, такие как listview, возможности, является им, предоставляет подобное пользовательское уведомление, такое как Объект, Активируются или Измененный Выбор Объекта.

10
ответ дан 14 December 2019 в 01:19
поделиться

Я просто попробовал это в Delphi, поведение является тем же: даже когда двойной щелчок происходит, событие одиночного нажатия выпущено прямо после первого из двух.

Я решил его с помощью таймера, который работает как это:

  • деактивируйте таймер на WM_LBUTTONDBLCLK (и установить bDbl кому: true)
  • активируйте таймер на WM_LBUTTONUP если bDbl==false
  • деактивируйтесь на WM_LBUTTONUP если bDbl==true (и сброс bDbl)

Я установил интервал таймера ко времени, возвращенному GetDoubleClickTime.

MSDN заявляет:

Функция GetDoubleClickTime получает текущее время двойного щелчка для мыши. Двойной щелчок является серией двух щелчков кнопки мыши, второго появления в течение требуемого времени после первого. Время двойного щелчка является максимальным количеством миллисекунд, которые могут произойти между первым и вторым щелчком двойного щелчка.

Если таймер, оказывается, стреляет затем, у Вас есть реальный щелчок. В моем случае интервал двойного щелчка составляет 500 мс, таким образом, любой "реальный щелчок" будет отложен это долго.

1
ответ дан 14 December 2019 в 01:19
поделиться

Вы могли проверить, что WM_LBUTTONDOWN не назвали несколько раз перед WM_LBUTTONUP. В практике Windows делает это для Вас, в том, что, если Вы получаете WM_LBUTTONDBCLK, Вы склонны не получать WM_LBUTTONUP.

0
ответ дан 14 December 2019 в 01:19
поделиться

Можно использовать PreTranslateMessage () для подсчета сообщений, как они появляются. Если Вы получили только сообщения мыши, соответствующие одиночному нажатию, и настроенное системой время для двойного щелчка истекло, можно безопасно предположить, что это - одиночное нажатие.

Насколько я знаю, что нет никакого способа знать, что дело обстоит так, как это происходит, который имеет смысл - пока время не истекает, нет никакого способа знать, что второй щелчок или не прибывает.

0
ответ дан 14 December 2019 в 01:19
поделиться

это немного хитро.

Я обнаружил бы WM_LBUTTONDOWN и комбинацию WM_LBUTTONUP, сохранил бы то событие где-нибудь и установил бы тайм-аут в течение секунды или около этого. Если нет WM_LBUTTONDBCLK во время того тайм-аута затем, у Вас есть одиночное нажатие.

Это могло бы подразумевать, что у Вас должно быть другое выполнение потока, но я думаю, что Вы могли выполнить его с одним потоком.

0
ответ дан 14 December 2019 в 01:19
поделиться

I think the solution is to start a timer after the first click & then check the elapsed time after at the next immediate click, this will tell you if it is a single click or double click.

0
ответ дан 14 December 2019 в 01:19
поделиться

Вы обычно смотрите на @MLButtonUp, и у Вас не было бы одиночного нажатия и поведения двойного щелчка на той же кнопке мыши.

-2
ответ дан 14 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: