4

结构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;
}
4

2 回答 2

8

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

如果您真的需要,可以使用单独的函数来检索该信息。大多数消息处理程序不处理鼠标输入,并且为几乎永远不会使用它们的消息处理程序传递额外的参数是没有意义的。(可以说WndProc可以定义为MSG*;我不知道其设计的原因,但我猜随着时间的MSG推移,成员被添加到结构中。)

通过 GetCursorPos() ?

No.GetCursorPos将返回光标的当前位置,该位置可能与生成消息时的位置不同。你反而想要GetMessagePos. (这类似于GetAsyncKeyStatevsGetKeyState。)

类似地,消息处理程序可以通过 获取消息时间GetMessageTime

于 2012-05-07T07:31:27.537 回答
4

坐标不会消失。他们在lParam. 请参阅MSDN 上的 WM_MOUSEMOVE 消息

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);
于 2012-05-07T06:10:22.223 回答