1
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 应该是相对的,只要它们都相对于同一个网格,无论是客户区还是一般的屏幕。谁能告诉我为什么这不起作用?我觉得我错过了一些明显的东西......

4

0 回答 0