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

#c #windows #winapi

#c #Windows #winapi

Вопрос:

У меня есть Win32 HWND, и я хотел бы разрешить пользователю удерживать управление и левую кнопку мыши для перетаскивания окна по экрану. Учитывая (1), что я могу определить, когда пользователь удерживает управление, левую кнопку мыши и перемещает мышь, и (2) у меня есть новое и старое положение мыши, как мне использовать Win32 API и мой 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..
}
  

Комментарии:

1. Мало того, вы можете, например, вернуть одно из краевых значений, например HTBOTTOMRIGHT, и теперь вы получаете курсор изменения размера и можете сделать его больше или меньше, перетащив угол. Мощность.

Ответ №2:

Извините, что немного опоздал с ответом, но вот код, который вы хотите

Сначала вы объявляете эти глобальные переменные:

 bool mousedown = false;
POINT lastLocation;
  

bool mousedown сообщает нам, удерживает ли пользователь левую кнопку мыши или нет

Затем в функции обратного вызова вы пишете эти строки кода

 case WM_LBUTTONDOWN: {
    mousedown = true;
    GetCursorPos(amp;lastLocation);
    RECT rect;
    GetWindowRect(hwnd, amp;rect);
    lastLocation.x = lastLocation.x - rect.left;
    lastLocation.y = lastLocation.y - rect.top;
    break;
}
case WM_LBUTTONUP: {
    mousedown = false;
    break;
}
case WM_MOUSEMOVE: {
    if (mousedown) {
        POINT currentpos;
        GetCursorPos(amp;currentpos);
        int x =  currentpos.x - lastLocation.x;
        int y =  currentpos.y - lastLocation.y;
        MoveWindow(hwnd, x, y, window_lenght, window_height, false);
    }
    break;
}
  

Комментарии:

1. хорошо; Я искал такой ответ