Как можно различить одиночный и двойной щелчок в .Net? - PullRequest
8 голосов
/ 20 октября 2008

Я хочу переопределить OnMouseClick и OnMouseDoubleClick и выполнять различные действия в зависимости от того, какой стиль нажатия использовался.

Проблема в том, что OnMouseClick происходит как для одиночного, так и для двойного щелчка, и вызывается до OnMouseDoubleClick.

Я уверен, что это должно быть обычным требованием, поэтому я предполагаю, что упускаю что-то довольно очевидное. Может кто-нибудь заполнить меня?

Изменить, чтобы добавить: MouseEventArgs.Clicks count не помогает. В случае двойного щелчка первый щелчок обрабатывается как один щелчок в OnMouseClick с MouseEventArgs.Clicks == 1.

Изменить, чтобы добавить: объекты представляют собой миниатюры изображений. Один клик должен включать и выключать выбор для экспорта. Двойной щелчок должен сделать эскиз на весь экран. Действия выбора и «активации» являются ортогональными. Это может указывать на основную проблему с двумя действиями ...

Cheers, Роб

Ответы [ 4 ]

12 голосов
/ 20 октября 2008

Это происходит во всей Windows. Я не думаю, что они добавили что-то особенное, чтобы справиться с этим в .Net.

Обычные средства обработки это

  • а) просто сделать один щелчок вы хотели бы случиться до двойной нажмите, как выберите.
  • б) если это не вариант, то при событии щелчка запустите таймер. На отметке таймера выполните действие одним щелчком мыши. Если событие двойного щелчка происходит первым, убейте таймер и выполните действие двойного щелчка.

Количество времени, для которого вы устанавливаете время, должно быть равно времени двойного щелчка системы (которое пользователь может указать на панели управления). Это доступно от System.Windows.Forms.SystemInformation.DoubleClickTime. Полная информация в MSDN, здесь

0 голосов
/ 20 октября 2008

Другим возможным решением является вызов функции OnMouseDoubleClick OnMouseClick. Поскольку действие в OnMouseClick является бинарным переключателем, его вызов дважды сбрасывает его в одно и то же состояние.

Таким образом, когда пользователь дважды щелкает, Windows вызывает OnMouseClick, а затем OnMouseDoubleClick. OnMouseDoubleClick вызывает OnMouseClick (снова) для восстановления состояния, а затем обрабатывает двойной щелчок.

Это решение кажется неудовлетворительным, но оно работает.

Использование таймера (чтобы проглотить первый щелчок по двойному щелчку) в равной степени неудовлетворительно и сопряжено с дополнительными сложностями при обработке пользовательских настроек двойного щелчка.

Ура, Rob

0 голосов
/ 20 октября 2008

Вы можете запустить таймер в обработчике события OnMouseClick.

  • Если время таймера истекло (скажем, 300 мс), то предполагается один щелчок.

прочее

  • Если другое событие OnMouseClick было сгенерировано до истечения времени ожидания, вы можете проверить положение клика по оси x & y и, если оно находится в пределах определенного радиуса первого щелчка, выполнить действие двойного щелчка.

В противном случае

  • Обработка первого клика и повторная инициализация таймера для второго клика

NB. Преимущество этой реализации заключается в том, что время ожидания и радиус «двойного щелчка» можно настраивать независимо от конфигурации системы, что позволяет импортировать ПО на несколько машин /

0 голосов
/ 20 октября 2008

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

...