C++ 在WM_LBUTTONDOWN消息中获取鼠标坐标
C++ 在WM_LBUTTONDOWN消息中获取鼠标坐标,c++,winapi,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) 消息过程如下所示: typedef struct
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)
消息过程如下所示:
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)
我的问题:在消息过程中,为什么不将点
变量传递给窗口过程,以及如何找到鼠标的点
?通过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;
}
坐标不会消失。它们位于
lParam
中。见:
在process函数中,为什么不将POINT变量传递给process函数,以及如何找到鼠标的点
如果您确实需要,可以使用单独的函数来检索该信息。大多数消息处理程序不处理鼠标输入,为几乎永远不会使用它们的消息处理程序传递额外参数也没有意义。(可以说,WndProc
可以定义为采用MSG*
;我不知道其设计的原因,但我猜随着时间的推移,成员被添加到MSG
结构中。)
通过GetCursorPos()实现
否。GetCursorPos
将返回光标的当前位置,该位置可能与生成消息时的位置不同。你反而想要。(这类似于。)
类似地,消息处理程序可以通过获取消息时间。问题的前半部分与第二部分有什么关系?我只想说,当我们获取消息(xx)时,我们得到了鼠标点,但在处理函数中,它消失了,windows为什么这样做?我的英语很差,我说的很清楚吗?谢谢你…我可以根据你的头衔投反对票吗;我还把你的“进程函数”改成了“窗口过程”,因为它只会让事情变得更加混乱。是的,它是对的,因为它仅限于WM_MOUSEMOVE,它不属于鼠标的消息,比如WM_KEYDOWN,WM_CHAR,那么我也可以这样做吗?xPos=GET_X_LPARAM(LPARAM);yPos=获取Y LPARAM(LPARAM);谢谢你的回答…你为什么不读一下和?这个更新如何使问题不同?如果我们不知道代码应该做什么,如果
rect1
未定义,我们如何知道代码是否正确?哦,对不起,我忘了rect1是在进程函数RECT rect1之前定义的@Tu先生:在您的示例中,lParam
和wParam
的含义取决于消息类型,因此在检查消息类型之前尝试提取坐标数据是非常误导的。使用LOWORD
和HIWORD
提取坐标也是错误的;您需要使用GET_X_LPARAM
和GET_Y_LPARAM
正确处理多监视器系统上的负坐标。。做这件事是没有办法的。。LPRAM的高位是x,低位是y(如果内存正常)。看@johnathon:嗯?是的,这些宏是GET_X_LPARAM
和GET_Y_LPARAM
,正如我在评论中提到的(以及您链接到的页面上提到的)。