MFC消息处理时,双击鼠标左键响应单击左键消息的处理

          今天做老师留下来的作业题,莫名其妙出现Bug,然后发现是MFC消息处理机制的问题,在响应鼠标双击前,会先产生一个单击鼠标消息,这里是我的解决方法。

单击响应:

void CMouseView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	MSG message;
	//CString str1;
	//CString str2;
	//str1.Format(_T("%ld"), point.x);
	//str2.Format(_T("%ld"), point.y);
	DWORD st = GetTickCount();
	while (1)
	{
		if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&message);
			DispatchMessage(&message);
			if (message.message == WM_LBUTTONDBLCLK)
			{
			/*	if (num != 5)
				{
					num++;
					MessageBox(_T("(") + str1 + _T(",") + str2 + _T(")"));
					break;
				}
				else*/
					break;
			}
		}
		DWORD et = GetTickCount();
		if (et - st > 200)
		{
			num = 0;
			MessageBox(_T("one"));
			break;
		}
	}
	CView::OnLButtonDown(nFlags, point);
}
双击响应:

void CMouseView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	CString str1;
	CString str2;
	str1.Format(_T("%ld"), point.x);
	str2.Format(_T("%ld"), point.y);
	CString str3;
	str3.Format(_T("%ld"), num+1);
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	if (num != 5)
	{
		num++;
		MessageBox(_T("第")+str3+_T("次")+_T("(") + str1 + _T(",") + str2 + _T(")"));
		//break;
	}
	CView::OnLButtonDblClk(nFlags, point);
}
其中
PeekMessage(&message, NULL, 0, 0, PM_REMOVE)
用来得到消息队列里的消息

TranslateMessage(&message);
DispatchMessage(&message);
用来解释和重新分发消息。当然你也可以不重新分发。

只用一个单击响应也可以得到。

具体思路就是一直得到消息队列的消息判定一下是不是双击消息知道200毫秒后还是没有得到双击消息

我们才执行单击的响应。

你可能感兴趣的:(MFC消息处理时,双击鼠标左键响应单击左键消息的处理)