Я пишу программу на C ++ с верхним окном, чтобы у вас не было способа изменения размера по умолчанию, или, по крайней мере, насколько мне известно. Итак, я реализовал изменение размера, которое работает нормально, за исключением 1 детали.
Когда я изменяю размер окна справа или снизу, оно работает отлично, но когда я изменяю размер влево или вверх, тогда правая или нижняя часть, в зависимости от того, как вы изменяете размер, дрожит. Я уже «исправил» это частично, поэтому, когда вы уменьшаете размер, он выглядит нормально, но когда вы увеличиваете размер окна, оно все равно дрожит.
Я также уже пытался отключить и включить перерисовку при изменении размера, но это все испортило,
Вот код, который я сейчас использую
GetCursorPos(&m_MousePos);
int x( m_rWindowStart.left ),
y( m_rWindowStart.top ),
w( m_pWindow->GetWidth() ),
h( m_pWindow->GetHeight() );
//sizing
switch (m_SizingDir)
{
case SIZING_DIR_LEFT:
//x += m_MousePos.x - m_MousePosOld.x;
w = m_rWindowStart.right - m_MousePos.x - m_MousePosOld.x + x;
w /= m_SnapSizing;
w *= m_SnapSizing;
x = m_rWindowStart.right - w;
break;
case SIZING_DIR_TOP:
y += m_MousePos.y - m_MousePosOld.y;
h = m_rWindowStart.bottom - y;
break;
case SIZING_DIR_RIGHT:
w = m_rWindowStart.right - m_rWindowStart.left + m_MousePos.x - m_MousePosOld.x;
break;
case SIZING_DIR_BOTTOM:
h = m_rWindowStart.bottom - m_rWindowStart.top + m_MousePos.y - m_MousePosOld.y;
break;
case SIZING_DIR_LEFTTOP:
x += m_MousePos.x - m_MousePosOld.x;
w = m_rWindowStart.right - x;
y += m_MousePos.y - m_MousePosOld.y;
h = m_rWindowStart.bottom - y;
break;
case SIZING_DIR_LEFTBOTTOM:
x += m_MousePos.x - m_MousePosOld.x;
w = m_rWindowStart.right - x;
h = m_rWindowStart.bottom - m_rWindowStart.top + m_MousePos.y - m_MousePosOld.y;
break;
case SIZING_DIR_RIGHTTOP:
w = m_rWindowStart.right - m_rWindowStart.left + m_MousePos.x - m_MousePosOld.x;
y += m_MousePos.y - m_MousePosOld.y;
h = m_rWindowStart.bottom - y;
break;
case SIZING_DIR_RIGHTBOTTOM:
w = m_rWindowStart.right - m_rWindowStart.left + m_MousePos.x - m_MousePosOld.x;
h = m_rWindowStart.bottom - m_rWindowStart.top + m_MousePos.y - m_MousePosOld.y;
break;
}
//window size snaps
w /= m_SnapSizing;
w *= m_SnapSizing;
h /= m_SnapSizing;
h *= m_SnapSizing;
//limit sizing
if (h < 20)
h = 20;
if (w < 20)
w = 20;
//move window ( x, y, w, h, repaint)
m_pWindow->SetPosAndSize(x, y, w, h, true);
И методы, которые вызываются из m_pWindow
void Window::SetPosAndSize(int x, int y, int w, int h, bool repaint)
{
ASSERT( w >= 0, _T("w(Width) must be greater than 0") );
ASSERT( h >= 0, _T("h(Height) must be greater than 0") );
m_Width = w;
m_Height = h;
if( m_hWnd )
{
RECT rPos;
GetRect( rPos );
AdjustFromClient(w, h);
MoveWindow(m_hWnd, x, y, w, h, repaint);
}
}
void Window::GetRect( RECT& r ) const
{
::GetWindowRect( m_hWnd, &r );
}
void Window::AdjustFromClient(int& w, int& h) const
{
RECT rSize2be = { 0, 0, w, h };
AdjustWindowRect(&rSize2be, m_Style, false);
w = rSize2be.right-rSize2be.left;
h = rSize2be.bottom-rSize2be.top;
}