Когда я нажимаю двойной щелчок мышью, я всегда получаю два сообщения NM_CLICK
а потом NM_DBLCLK
, Зачем?
Вы знаете, как я могу различить оба?
Когда я нажимаю двойной щелчок мышью, я всегда получаю два сообщения NM_CLICK и затем NM_DBLCLK. Зачем?
Краткий ответ: потому что система не реализует машину времени.
Когда вы щелкаете мышью, система генерирует NM_CLICK
уведомление, так как он еще не знает, является ли это началом последовательности двойного щелчка или нет. Это позволяет приложениям мгновенно реагировать на события щелчка мышью, не дожидаясь истечения времени ожидания двойного щелчка.
Чтобы различить одиночные и двойные щелчки, вы должны отложить NM_CLICK
обработки, пока вы не знаете, это не является частью NM_DBLCLK
последовательность. Для этого установите таймер в NM_CLICK
обработчик и убить таймер из NM_DBLCLK
, Когда таймер истекает, вы знаете, что нет NM_DBLCLK
трейлинг, и вы можете приступить к обработке одного клика.
Следующее должно дать вам представление, как это реализовать:
enum TimerId {
TimerId_ListCtrlDblClk = 1
};BOOL CMyDialog::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult ) {
const NMHDR& hdr = *(const NMHDR*)lParam;
switch ( hdr.code ) {
case NM_CLICK:
SetTimer( TimerId_ListCtrlDblClk, ::GetDoubleClickTime(), nullptr );
*pResult = 0;
return TRUE;
case NM_DBLCLK:
KillTimer( TimerId_ListCtrlDblClk );
// Handle double-clicks here.
*pResult = 0;
return TRUE;
default:
break;
}
return CDialogEx::OnNotify( wParam, lParam, pResult );
}
void CMyDialog::OnTimer( UINT_PTR nIDEvent ) {
if ( nIDEvent == TimerId_ListBoxDblClk ) {
// If this timer expires, there is no NM_DBLCLK trailing the NM_CLICK.
// Handle the regular NM_CLICK notification.
}
CDialogEx::OnTimer( nIDEvent );
}