MyException - 我的异常网
当前位置:我的异常网» VC/MFC » WM_MOUSEMOVE的lParam参数有关问题

WM_MOUSEMOVE的lParam参数有关问题

www.MyException.Cn  网友分享于:2013-01-12  浏览:121次
WM_MOUSEMOVE的lParam参数问题
本帖最后由 ProgrammingRing 于 2012-12-16 00:34:59 编辑
WM_MOUSEMOVE的lParam参数的高低位是相对于工作区的x和y,用ClientToScreen把它转换为屏幕的,为啥和用GetCursorPos获得的屏幕的坐标不同呢?
比如下面的代码,点住鼠标左键拖到想要获取的窗口上,如果注释那里用lParam和ClientToScreen就不正常获取,GetCursorPos则一切正常
	
case WM_LBUTTONDOWN:
SetCapture(hDlg);
bDown = TRUE;
break;

case WM_MOUSEMOVE:
if (bDown)
{
POINT pt;
GetCursorPos(&pt);
//pt.x = LOWORD(lParam);
// pt.y = HIWORD(lParam);
// ClientToScreen(hDlg, &pt);
HWND hWnd = WindowFromPoint(pt);
if (hWnd != hDlg) {
GetWindowText(hWnd, szBuff, 256);
SetDlgItemText(hDlg, IDC_CAPTION, szBuff);
GetClassName(hWnd, szBuff, sizeof(szBuff));
SetDlgItemText(hDlg, IDC_CLASS, szBuff);
}
}
break;

case WM_LBUTTONUP:
ReleaseCapture();
bDown = FALSE;
break;

------解决方案--------------------
LOWORD和HIWORD得到的是WORD,即unsigned short,无符号的
你应该用GET_X_LPARAM和GET_Y_LPARAM

pt.x = GET_X_LPARAM(lParam); 
pt.y = GET_Y_LPARAM(lParam); 

------解决方案--------------------
WM_MOUSEMOVE的lParam参数的高低位是相对于工作区的x和y,此时的坐标是消息发生时的坐标;
GetCursorPos是此时此刻鼠标的位置坐标。
考虑到Windows处理消息有先后顺序和时间滞后,两者的坐标会有微差。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有