case WM_LBUTTONDOWN:
initPos.x = LOWORD(lParam);
initPos.y = HIWORD(lParam);
break;
case WM_MOUSEMOVE:
{
POINT realPos;
RECT clientRect;
int rSect = 0;
GetClientRect(hWnd, &clientRect);
realPos.x = (int)(short) LOWORD(lParam);
realPos.y = (int)(short) HIWORD(lParam);
ClientToScreen(hWnd, reinterpret_cast<POINT*>(&clientRect.left));
ClientToScreen(hWnd, reinterpret_cast<POINT*>(&clientRect.right));
if(wParam == MK_LBUTTON)
{
if(!rSect)
{
MoveWindow(hWnd, clientRect.left + (realPos.x - initPos.x), clientRect.top + (realPos.y - initPos.y), width, height, TRUE);
}
}
break;
}
这是我程序的基本代码段,允许我的自定义窗口在屏幕上拖动。它很完美,我很满意。
但是当我无辜地尝试将realPos和initPos坐标转换为屏幕位置时,每次拖动它时窗口都会出现故障,源代码在这里:
case WM_LBUTTONDOWN:
initPos.x = LOWORD(lParam);
initPos.y = HIWORD(lParam);
ClientToScreen(hWnd, &initPos);
break;
case WM_MOUSEMOVE:
{
POINT realPos;
RECT clientRect;
int rSect = 0;
GetClientRect(hWnd, &clientRect);
realPos.x = (int)(short) LOWORD(lParam);
realPos.y = (int)(short) HIWORD(lParam);
ClientToScreen(hWnd, reinterpret_cast<POINT*>(&clientRect.left));
ClientToScreen(hWnd, reinterpret_cast<POINT*>(&clientRect.right));
ClientToScreen(hWnd, &realPos);
if(wParam == MK_LBUTTON)
{
if(!rSect)
{
MoveWindow(hWnd, clientRect.left + (realPos.x - initPos.x), clientRect.top + (realPos.y - initPos.y), width, height, TRUE);
}
}
break;
}
initPos和realPos应相对于彼此,只要它们都是相同的网格,无论是客户区还是一般的屏幕。任何人都可以告诉我为什么这样做不起作用?我觉得我错过了一些明显的东西......