转载地址:http://blog.csdn.net/nanfeiyannan/article/details/6212090

今天修改一程序的Bug,修改了半天,终无头绪。后猛然发现是因为双击的时候,也是响应单击消息函数。遂google,发现:Windows系统在系统的双击时间限制里双击鼠标左键调用OnLButtonDBlClk,双击鼠标左键实际上产生4个事件:WM_LBUTTONDOWN WM_LBUTTONUP,然后WM_LBUTTONDBLCK被调用,鼠标释放时的WM_LBUTTONUP消息。

最后还是实现了所需功能,但是感觉还不理想,如果能在PreTranslateMessage函数里面实现就更好了......

void CClickOrDBDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
 // TODO: Add your message handler code here and/or call default
// AfxMessageBox("one"); 
 MSG message; 
 DWORD st = GetTickCount(); 
 while(1) 
 { 
  if(::PeekMessage(&message, NULL, 0 ,0 , PM_REMOVE)) 
  { 
   ::TranslateMessage(&message); 
   ::DispatchMessage(&message); 
   if(message.message == WM_LBUTTONDBLCLK) 
   {
    AfxMessageBox("two");
    break;
   } 
  } 
  DWORD et = GetTickCount(); 
  if(et - st > 200) 
  {
   AfxMessageBox("one");
   break;
  } 
 } 
 CDialog::OnLButtonDown(nFlags, point);
}


注意:

如果在窗口风格中未包含CS_DBLCLKS,而使用者在短时间内双击了鼠标按键,那么窗口消息处理程序会接收到下面这些消息:       
      
  WM_LBUTTONDOWN       
      
  WM_LBUTTONUP       
      
  WM_LBUTTONDOWN       
      
  WM_LBUTTONUP       
      
 如果您的窗口类别风格中包含了CS_DBLCLKS,那么双击时窗口消息处理程序将收到如下消息:       
      
  WM_LBUTTONDOWN       
      
  WM_LBUTTONUP       
      
  WM_LBUTTONDBLCLK       
      
  WM_LBUTTONUP  

所以要想实现双击响应,则窗口类需包含CS_DBLCLKS格式。可以在WM_CREATE里进行添加,

SetClassLongPtr(hwnd,GCL_STYLE,GetWindowLongPtr(hwnd,GCL_STYLE)|CS_DBLCLKS));