Я пытаюсь изменить размер окна, как в стиле WS_OVERLAPPED, используя WS_POPUP. С правой стороны все получилось, но с левой есть проблемы. Я не могу понять, почему, когда я тяну левый край окна, курсор мыши оказывается дальше, чем край окна, который я тяну. При этом окно по краям начинает мерцать, а кнопки в неклиентской области как будто находятся в двух положениях одновременно. А если потянуть за правый край, то сам край перемещается сразу за курсором (как изменить размер папки в представлении). Не понимаю, где проблема, в вычислении новой ширины окна или позиции, или вообще где-то в коде.
case WM_MOUSEMOVE:
{
if (dragging)
{
POINT currentPoint = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
GetCursorPos(¤tPoint);
ScreenToClient(hwnd, ¤tPoint);
// Offset for THE RIGHT SIDE OF THE WINDOW
int deltaXRight = currentPoint.x - startPoint.x;
// New width OF THE RIGHT SIDE OF THE WINDOW
int newWidth = startRect.right - startRect.left + deltaXRight;
// Maybe I'm not doing the calculation correctly
// Offset for the left SIDE of the WINDOW
int deltaXLeft = startPoint.x - currentPoint.x;
// New width OF THE LEFT SIDE OF THE WINDOW
int newWidthLeft = startRect.right - startRect.left - deltaXRight;
// New position of the left side
int newCurrentWidthLeft = startRect.left + deltaXRight;
if (startPoint.x > startRect.right - startRect.left - BORDERWIDTH)
{
SetWindowPos(hwnd, NULL, 0, 0, newWidth, startRect.bottom - startRect.top, SWP_NOZORDER | SWP_NOMOVE);
}
else if (startPoint.x < BORDERWIDTH && newWidthLeft > MIN_WIDTH)
{
SetWindowPos(hwnd, NULL, newCurrentWidthLeft, startRect.top, newWidthLeft, startRect.bottom - startRect.top, SWP_NOZORDER | SWP_NOACTIVATE);
}
}
break;
}
Я пытаюсь изменить размер окна, как в стиле WS_OVERLAPPED, используя WS_POPUP. С правой стороны все получилось, но с левой есть проблемы. Я не могу понять, почему, когда я тяну левый край окна, курсор мыши оказывается дальше, чем край окна, который я тяну. При этом окно по краям начинает мерцать, а кнопки в неклиентской области как будто находятся в двух положениях одновременно. А если потянуть за правый край, то сам край перемещается сразу за курсором (как изменить размер папки в представлении). Не понимаю, где проблема, в вычислении новой ширины окна или позиции, или вообще где-то в коде. [code]case WM_MOUSEMOVE: { if (dragging) { POINT currentPoint = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; GetCursorPos(¤tPoint); ScreenToClient(hwnd, ¤tPoint);
// Offset for THE RIGHT SIDE OF THE WINDOW int deltaXRight = currentPoint.x - startPoint.x; // New width OF THE RIGHT SIDE OF THE WINDOW int newWidth = startRect.right - startRect.left + deltaXRight;
// Maybe I'm not doing the calculation correctly // Offset for the left SIDE of the WINDOW int deltaXLeft = startPoint.x - currentPoint.x; // New width OF THE LEFT SIDE OF THE WINDOW int newWidthLeft = startRect.right - startRect.left - deltaXRight; // New position of the left side int newCurrentWidthLeft = startRect.left + deltaXRight;
RECT closeButton = GetCloseButtonRect(hwnd); RECT maximizeButton = GetMaximizeButtonRect(hwnd); RECT minimizeButton = GetMinimizeButtonRect(hwnd);
if (PtInRect(&closeButton, pt)) { return HTCLOSE; } else if (PtInRect(&maximizeButton, pt)) { return HTMAXBUTTON; } else if (PtInRect(&minimizeButton, pt)) { return HTMINBUTTON; } // Если курсор в заголовке, возвращаем HTCAPTION if (pt.y < GetTitleBarHeight()) { return HTCAPTION; // Указываем, что курсор в заголовке }
LRESULT hit = DefWindowProc(hwnd, message, wParam, lParam); if (hit == HTCLIENT) {
RECT rc; GetClientRect(hwnd, &rc); if (pt.x > rc.right - 10) { return HTRIGHT; // Правый край } else if (pt.x < 10) { return HTLEFT; // Левый край } } return hit; } case WM_NCLBUTTONDOWN: { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; ScreenToClient(hwnd, &pt);
RECT closeButton = GetCloseButtonRect(hwnd); RECT maximizeButton = GetMaximizeButtonRect(hwnd); RECT minimizeButton = GetMinimizeButtonRect(hwnd);
Я пытаюсь решить следующую проблему. Верхний левый угол моего окна имеет отрицательные координаты при максимизации (и x, и y равны -9), и его размер на самом деле больше, чем доступная область.
Я использую WinAPI, чтобы получить некоторые...
У меня есть приложение Winapi, и я хочу, чтобы пользователь мог изменить размер окна с помощью RMB.
sendmessage (hwnd, wm_syscommand, sc_size + wmsz_bottomright, 0); в wm_rbuttondown Сообщение .
Поиск Google по этой теме, но ничто не найдено -...
У меня есть простое приложение для Windows, которое использует Vulkan для рендеринга в клиентской области окна. Когда я изменяю размер окна, появляется желоб (как показано на скриншоте). Эффект наиболее заметен при сокращении окна, а не увеличивает...