今天項目中遇到處理單雙擊事件的問題,找到CSDN中這樣一篇帖子 WM_LBUTTONDOWN和WM_LBUTTONDBLCLK之間的事情。
其中strip(阿飛 - Mozilla●CSDN●痛)這樣寫道:
BOOL bShouldTrigger = TRUE;
void CDbClickDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
if( nFlags&0x8000 )
AfxMessageBox("鼠標蛋雞!");
else
{
bShouldTrigger = TRUE;
// UINT aa = GetDoubleClickTime(); // 我的系統是500ms
SetTimer( 109, 200, 0 );
}
CDialog::OnLButtonDown(nFlags, point);
}
void CDbClickDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
bShouldTrigger = FALSE;
AfxMessageBox("鼠標雙機!");
CDialog::OnLButtonDblClk(nFlags, point);
}
void CDbClickDlg::OnTimer(UINT nIDEvent)
{
if( nIDEvent == 109 )
{
KillTimer( 109 );
if( bShouldTrigger )
PostMessage( WM_LBUTTONDOWN, MK_LBUTTON|0x8000 , 0 );
}
CDialog::OnTimer(nIDEvent);
}
在運用時,我自作聰明的省掉bShouldTrigger這個控制符,轉而使用timer變量來作為控制符。省卻雙擊事件,在單擊事件中通過timer變量來判斷是否為雙擊事件。
結果實踐證明我錯了,雙擊如果太快時無法觸發雙擊事件。
后來考慮了一下才想起,SetTimer函數執行時肯定是需要時間的,因此雙擊時,有時發現timer事件依然為NULL,就是因為SetTimer函數仍然未返回,導致timer變量仍然為空。
其實分開雙擊和單擊事件,應該還有其他很多方法,比如使用事件,使用WaitableTimer,使用信號量等等,但是我想既然微軟提供了雙擊的事件,一定是有原因的,它肯定是為了解決雙擊速度過快的問題的。