CListCtrl. При двойном щелчке ВСЕГДА получите NM_CLICK + NM_DBLCLK

Когда я нажимаю двойной щелчок мышью, я всегда получаю два сообщения NM_CLICK а потом NM_DBLCLK, Зачем?

Вы знаете, как я могу различить оба?

1

Решение

Когда я нажимаю двойной щелчок мышью, я всегда получаю два сообщения 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 );
}
7

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector