Как реализовать перетаскивание окна с помощью его клиентской области?

У меня есть Win32 HWND, и я хотел бы позволить пользователю удерживать элемент управления и левую кнопку мыши, чтобы перетащить окно по экрану. Учитывая (1), что я могу обнаружить, когда пользователь держит управление, левую кнопку мыши и перемещает мышь, и (2) у меня есть новая и старая позиция мыши, как я могу использовать API Win32 и мой HWND для изменения положение окна?

Ответ 1

Внедрить обработчик сообщений для WM_NCHITTEST. Вызовите DefWindowProc() и проверьте, является ли возвращаемое значение HTCLIENT. Верните значение HTCAPTION, если оно есть, в противном случае верните возвращаемое значение DefWindowProc. Теперь вы можете щелкнуть область клиента и перетащить окно, точно так же, как вы перетащили окно, щелкнув надпись.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_NCHITTEST: {
        LRESULT hit = DefWindowProc(hWnd, message, wParam, lParam);
        if (hit == HTCLIENT) hit = HTCAPTION;
        return hit;
    }
    // etc..
}