在WM_LBUTTONDOWN消息中获取鼠标坐标

Mr.*_*.Tu 2 c++ winapi

结构MSG如下:

typedef struct tagMSG {
  HWND   hwnd; 
  UINT   message; 
  WPARAM wParam; 
  LPARAM lParam; 
  DWORD  time; 
  POINT  pt; 
} MSG, *PMSG; 
Run Code Online (Sandbox Code Playgroud)


消息程序如下:

long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)
Run Code Online (Sandbox Code Playgroud)

我的问题:在消息过程中,为什么它没有将POINT变量传递给窗口过程,以及如何找到鼠标POINT?通过GetCursorPos()?我找到一些例子LOWORD(lParam), HIWORD(lParam)直接得到它..你能告诉我有关它的信息吗?谢谢...

我看到有人写这个,是不是?我不确定:

RECT rect1;
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
    HDC hDC;        
    WORD x,y;   
    PAINTSTRUCT ps;     

    x = LOWORD(lParam); 
    y = HIWORD(lParam);

    switch(iMessage)
    {
    case WM_LBUTTONDOWN:
        if(wParam&MK_CONTROL)
        {
            rect1.left = x; 
            rect1.top = y;
        }
        else if(wParam&MK_SHIFT)
        {
            rect1.left = x; 
            rect1.top = y;
        }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return(DefWindowProc(hWnd,iMessage,wParam,lParam));
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

jam*_*lin 5

在process函数中,为什么它不将POINT变量传递给process函数,以及如何查找鼠标的POINT?

因为如果你真的想要它,函数存在来检索那些信息.传递几乎不会使用它们的消息处理程序的额外参数是没有意义的.(可以说WndProc可以定义为a MSG*;我不知道其设计的原因,但我猜测成员会MSG随着时间的推移被添加到结构中.)

通过GetCursorPos()?

否.GetCursorPos将返回光标的当前位置,这可能与生成消息时的位置不同.你反而想要GetMessagePos.(这与GetAsyncKeyState对比GetKeyState相似.)

同样,消息处理程序可以通过获取消息时间GetMessageTime.