我希望通过检查消息WM_MOVE并使用SetWindowPos函数将窗口保持在显示范围内来防止窗口在监视器之间移动。当我尝试这样做时,窗口会在鼠标所在的位置短暂闪烁,然后捕捉到屏幕底部的一个小区域。我不确定为什么会这样,因为代码就像任何其他碰撞检测一样:
case WM_MOVE:
{
int nX = (int)(short)LOWORD(lParam);
int nY = (int)(short)HIWORD(lParam);
if (nX < pDisplayDevice->getLeft()) {
nX = pDisplayDevice->getLeft();
} else if (nX + int(uNormalWidth) > pDisplayDevice->getRight()) {
nX = pDisplayDevice->getRight() - int(uNormalWidth);
}
if (nY < pDisplayDevice->getTop()) {
nY = pDisplayDevice->getTop();
} else if (nY + int(uNormalHeight) > pDisplayDevice->getBottom()) {
nY = pDisplayDevice->getBottom() - int(uNormalHeight);
}
SetWindowPos(hWnd, 0, nX, nY, uNormalWidth, uNormalHeight, 0);
}
break;
pDisplayDevice基本上是指向包含显示坐标的Rect的指针,而uNormalWidth / uNormalHeight是窗口模式下窗口的宽度和高度。
答案 0 :(得分:1)
lParam 客户端左上角的x和y坐标 窗户的区域。低位字包含x坐标 高阶词包含y坐标。
每次进入WM_MOUSE时,向右移动窗口+8像素,向下移动+30像素(我的代码中没有菜单)。这是左侧大小边框的宽度和顶部大小边框+标题栏的高度。
该移动会触发一个WM_MOVE处理的递归链,最终会产生一些coords。
你能做什么:
1。按照Jonathan的建议。 WM_MOVE不是您要查找的邮件,而是WM_WINDOWPOSCHANGING。
2. 使用非客户端坐标:
int nX = (int)(short)LOWORD(lParam);
int nY = (int)(short)HIWORD(lParam);
RECT rect;
GetWindowRect( hWnd, &rect );
nX = rect.left;
nY = rect.top;
if (nX < pDisplayDevice->getLeft()) {
[...]