Изменение размера окна через левый или правый край может быть несколько непростым из-за необходимости правильно обновлять позицию окна и его размер. Давайте рассмотрим, как можно автоматически изменять размер окна при перемещении курсора мыши.
Проблема, с которой вы столкнулись, вероятнее всего, связана с неправильным вычислением нового положения окна и курсора мыши. Когда вы обрабатываете движение мыши (WM_MOUSEMOVE), необходимо учитывать как текущую позицию курсора, так и начальную позицию света окна, чтобы правильно вычислить, насколько нужно изменить его размеры.
Ниже приведен пример того, как можно реализовать изменение размера окна с левой стороны:
```cpp
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
static bool dragging = false;
static POINT startPoint;
static RECT startRect;
switch (message) {
case WM_LBUTTONDOWN: {
dragging = true;
SetCapture(hwnd); // Перехватываем события мыши
GetCursorPos(&startPoint);
ScreenToClient(hwnd, &startPoint);
GetWindowRect(hwnd, &startRect);
break;
}
case WM_MOUSEMOVE: {
if (dragging) {
POINT currentPoint;
GetCursorPos(¤tPoint);
ScreenToClient(hwnd, ¤tPoint);
// Рассчитываем изменение ширины
int deltaX = startPoint.x - currentPoint.x;
int newX = startRect.left + deltaX; // Новая позиция левой стороны
int newWidth = startRect.right - newX; // Новая ширина окна
// Установим новое положение и размеры окна
SetWindowPos(hwnd, NULL, newX, startRect.top, newWidth, startRect.bottom - startRect.top, SWP_NOZORDER | SWP_NOACTIVATE);
}
break;
}
case WM_LBUTTONUP: {
dragging = false;
ReleaseCapture(); // Освобождаем захват
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// Регистрация класса окна и создание окна...
// Содержание вашей функции WinMain
}
```
### Объяснение кода:
1. **WM_LBUTTONDOWN**: Когда левая кнопка мыши нажата, мы включаем режим перетаскивания, сохраняем начальную позицию курсора и размер, а также положение окна.
2. **WM_MOUSEMOVE**: Если мы находимся в режиме перетаскивания:
- Получаем текущую позицию курсора.
- Рассчитываем `deltaX`, который представляет собой изменение по X. Мы вычитаем текущую позицию курсора из начальной.
- Устанавливаем новое положение левой стороны окна, добавив `deltaX` к начальному положению.
- Вычисляем новую ширину и используем `SetWindowPos`, чтобы применить изменения положения и размера окна.
3. **WM_LBUTTONUP**: Когда левая кнопка мыши отпущена, мы отключаем режим перетаскивания и освобождаем захват мыши.
Такой подход должен предотвратить "дергание" окна при изменении его размера с левой стороны, поскольку мы правильно вычисляем новую позицию на основе текущего положения курсора и сохранившегося состояния.