Обнаружение одного щелчка мыши в MFC - PullRequest
5 голосов
/ 03 февраля 2009

В MFC событие двойного щелчка мыши запускает следующую последовательность сообщений

  • WM_LBUTTONDOWN
  • WM_LBUTTONUP
  • WM_LBUTTONDBCLK
  • WM_LBUTTONUP

Таким образом, ответ на сообщение WM_LBUTTONDBCLK позволяет обнаружить двойной щелчок. Но если я просто хочу обнаружить один щелчок, как его отличить?

Но просто посмотреть на сообщение WM_LBUTTONUP недостаточно, поскольку оно может быть одним щелчком или первым щелчком двойного щелчка.

Как я могу успешно идентифицировать только один клик?

Ответы [ 7 ]

10 голосов
/ 03 февраля 2009

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

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

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

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

Продвигаясь дальше рассуждений, вы не должны полагаться на получение Mouse Up после того, как обработали Mouse Down: возможно, пользователь переместил мышь и отпустил кнопку в другом месте (например, drag'n'drop), в этом случае вы не получайте событие MouseUp ... если только вы не захватите мышь на MouseDown, чтобы убедиться, что вы получаете событие мыши вплоть до Mouse Up, даже если мышь покинула ваше окно.

В итоге вы отслеживаете Mouse Down, захватываете мышь и, когда получаете Mouse Up, просто проверяете, владеете ли вы захватом. Если нет, то мышь была либо дважды нажата (без 2-й мыши), либо «Мышь вниз» произошла где-то еще, поэтому вам, скорее всего, не безразлична эта «мышь вверх».

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

Oh! И если вы имеете дело с существующим элементом управления, который уже обрабатывает все эти элементы и элементы выбора, такие как просмотр списка, скорее всего, он предоставит аналогичное настраиваемое уведомление, такое как «Активация элемента» или «Изменение выбора элемента».

1 голос
/ 03 февраля 2009

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

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

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

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

MSDN говорит:

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

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

0 голосов
/ 12 апреля 2009

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

0 голосов
/ 03 февраля 2009

это немного сложно.

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

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

0 голосов
/ 03 февраля 2009

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

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

0 голосов
/ 03 февраля 2009

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

0 голосов
/ 03 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...