win32(windows.h)中有一个便利函数可以将lParam转换为POINT吗?

bod*_*ydo 5 c++ windows winapi point

我一直在做以下事情:

LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
    mouse.x = LOWORD(lParam);
    mouse.y = HIWORD(lParam);
    // ...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不知道是否有一个方便的方法,将转换LOWORD(lParam)HIWORD(lParam)Point我吗?所以我可以做点什么mouse = ToPoint(lParam)

Rem*_*eau 10

使用GET_X_LPARAM()GET_Y_LPARAM(),或者MAKEPOINTS(),如WM_MOUSEMOVE文档所说:

使用以下代码获取水平和垂直位置:

xPos = GET_X_LPARAM(lParam);

yPos = GET_Y_LPARAM(lParam);

如上所述,x坐标是在低次的返回值; y坐标是高阶短路(两者都代表有符号值,因为它们可以在具有多个监视器的系统上取负值).如果将返回值赋给变量,则可以使用MAKEPOINTSPOINTS从返回值中获取结构.您还可以使用GET_X_LPARAMGET_Y_LPARAM宏来提取x坐标或y坐标.

要点 :不要使用LOWORDHIWORD宏来提取光标位置的x坐标和y坐标,因为这些宏在具有多个监视器的系统上返回不正确的结果.具有多个监视器的系统可以具有负x和y坐标,而LOWORDHIWORD将坐标视为无符号量.


Mic*_*eyn 6

不,但滚动你自己将是微不足道的:

POINT ToPoint(LPARAM lParam)
{
  POINT p={GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam)};

  return p;
}
Run Code Online (Sandbox Code Playgroud)

  • `WM_MOUSEMOVE`文档明确指出不应使用`LOWORD` /`HIWORD`来获取坐标. (3认同)

mar*_*ark 5

使用CPoint,像CPoint p(lParam);

  • 是的,我们很了解,谢谢.但是,由于这个问题被标记为winapi而不是MFC,因此我采取了自由选择,因为它没有解决问题.有了这些新获得的洞察力,如果您只是删除了非答案并回馈了我必须花在您身上的声誉,我将不胜感激. (2认同)