Как отличить OnLButtonUp от OnLButtonDblClk в MFC - PullRequest
0 голосов
/ 20 мая 2011

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

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

Проблема в том, что всякий раз, когда пользователь дважды щелкает, отправляются четыре сообщения:

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

Это происходит только в том случае, если пользователь нажимает второй раз в течение «времени двойного щелчка» (используйте ::GetDoubleClickTime(), чтобы получить его).

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

Если таймер отключается, вы вызываете обработчик кнопок.

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

EDIT: Если вы просто хотите сбросить второй WM_LBUTTONUP, вы можете использовать флаг. Вы устанавливаете его, когда получаете WM_LBUTTONDBLCLK. Затем в обработчике для WM_LBUTTONUP вы ничего не делаете, если он установлен (и затем, конечно, очищаете его).

1 голос
/ 10 августа 2011
OnLButtonUp(UINT nFlags, CPoint point) 
{
     Sleep(::GetDoubleClickTime());
     MSG msg;
     if( ::PeekMessage(&msg, NULL, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, PM_NOREMOVE) )
          return; // LEFT CONTROL TO DBL CLICK ;-)

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