ClientToScreen()导致了神秘的问题,我无法弄清楚原因

时间:2013-10-02 02:32:27

标签: c++

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

0 个答案:

没有答案