今天项目中遇到处理单双击事件的问题,找到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,使用信号量等等,但是我想既然微软提供了双击的事件,一定是有原因的,它肯定是为了解决双击速度过快的问题的。