在WM_LBUTTONDOWN消息中获取鼠标坐标

时间:2012-05-07 05:49:45

标签: c++ winapi

MSG的结构如下:

typedef struct tagMSG {
  HWND   hwnd; 
  UINT   message; 
  WPARAM wParam; 
  LPARAM lParam; 
  DWORD  time; 
  POINT  pt; 
} MSG, *PMSG; 


消息程序如下:

long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)

我的问题:在邮件过程中,为什么它没有将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;
}

2 个答案:

答案 0 :(得分:5)

  

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

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

  

通过GetCursorPos()?

没有。 GetCursorPos将返回光标的当前位置,该位置可能与生成消息时的位置不同。你想要GetMessagePos。 (这类似于GetAsyncKeyState versus GetKeyState。)

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

答案 1 :(得分:4)

坐标不会消失。他们在lParam。见WM_MOUSEMOVE message on MSDN

A window receives this message through its WindowProc function.
...
lParam

    The low-order word specifies the x-coordinate of the cursor.
The coordinate is relative to the upper-left corner of the client area.

    The high-order word specifies the y-coordinate of the cursor.
The coordinate is relative to the upper-left corner of the client area.
...
Use the following code to obtain the horizontal and vertical position:

xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);