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