C + + Win32 спливаюче вікно "трясеться" на зміну розміру

Я пишу програму c + + з найвищим вікном, тому у вас немає способу зміни розміру за замовчуванням або, принаймні, не до моїх знань. Таким чином, я застосував розмір зміни, який добре працює, за винятком 1 деталі. Коли я змінюю розмір вікна справа або знизу, він ідеально працює, але коли я змінюю розмір вліво або зверху, то права або нижня частина залежно від того, яким чином ви змінюєте розмір, коливається. Я вже "фіксував" це частково, тому, коли ви зменшуєте, це добре виглядає, але коли ви збільшуєте вікно, він все ще трясе.

Я також вже намагався вимкнути і включити перемальовування при зміні розміру, але що пов'язує все: p

Ось код, який я використовую в даний час

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;
}

and here's an example of how it looks know for people who don't exactly understand the problem http://www.megaupload.com/?d=4AXXPFKI

Натисніть Ctrl і клацніть, щоб перемістити вікно та Натисніть Alt і клацніть біля кордону, щоб змінити розмір

1
Я не виглядав надто близько, звичайна проблема в тому, що відносна позиція миші змінюється, коли ви переміщаєте ліву або верхню частину вікна. Просто не робіть це таким чином, замість цього напишіть обробнику повідомлень для WM_NCHITTEST.
додано Автор Hans Passant, джерело
(будь-ласка, розмістіть нове запитання з вашою новою проблемою. Стійка переповнення найкраще працює з одним питанням, а потім з кількома відповідями - це не форум)
додано Автор Joel Spolsky, джерело
Тому що, коли ви змінюєте розмір знизу/праворуч, буфер не перефарбується, коли ви змінюєте розмір вгорі/вліво, він перефарбується. Дізнайтеся, як робити подвійну буферизацію у вашому графічному інтерфейсі.
додано Автор Gene Bushuyev, джерело

1 Відповіді

Ганс правий ... ти йдеш про це важким шляхом.

Напишіть обробнику повідомлень для WM_NCHITTEST (в MFC, замінити :: OnNcHitTest ), який повертає HT_BOTTOM, HT_LEFT та ін тощо залежно від того, куди ви хочете "кордони" свого вікна Бути, і дозвольте Windows обробляти все це.

2
додано
Я зробив це таким самим, не використовуючи стиль WS_SYSMENU , але це не дозволяє вирішити проблему, коли користувач змінює розмір вікна, який можна переглянути, тут це збірка реліз megaupload.com/?d=JNAAVFWG
додано Автор ColmanJ, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147

ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram