如何从 LPARAM 中提取鼠标事件的 X 和 Y 坐标
GET_X_LPARAM 和 GET_Y_LPARAM 是宏定义,用于从 LPARAM 参数中提取鼠标事件的 X 和 Y 坐标。实际上,在 Windows 消息处理函数中,lParam 参数的低 16 位表示 X 坐标,高 16 位表示 Y 坐标。因此,你可以使用以下代码来获取鼠标事件的坐标:
case WM_MOUSEMOVE: {
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
// 遍历所有控件绘制数据,更新鼠标悬停状态并重绘控件
for (auto& data : controlsData) {
data.isHovered = PtInRect(&data.rect, {xPos, yPos});
}
InvalidateRect(hwndDlg, NULL, FALSE);
return TRUE;
}
case WM_LBUTTONDOWN: {
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
// 遍历所有控件绘制数据,更新鼠标按下状态并重绘控件
for (auto& data : controlsData) {
if (PtInRect(&data.rect, {xPos, yPos})) {
data.isPressed = true;
SetCapture(hwndDlg);
}
}
InvalidateRect(hwndDlg, NULL, FALSE);
return TRUE;
}
case WM_LBUTTONUP: {
// 遍历所有控件绘制数据,更新鼠标按下状态并重绘控件
for (auto& data : controlsData) {
if (data.isPressed) {
data.isPressed = false;
ReleaseCapture();
}
}
InvalidateRect(hwndDlg, NULL, FALSE);
return TRUE;
}
使用上述代码替换之前的代码中的对应部分即可。
非常抱歉给你带来的困扰,希望这次的回答能够帮助到你。如果还有其他问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/UZf 著作权归作者所有。请勿转载和采集!