Есть окно со стилем WS_POPUPWINDOW & ~WS_VSCROLL & ~WS_HSCROLL & ~WS_CAPTION & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX & ~WS_THICKFRAME
Делаю вручную resize окна с помощью функции MoveWindow c флашком repaint == true
Отрабатываю:
— WM_SIZE: меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.
— WM_ERASEBKGND: return 1;
— WM_PAINT: ложу бэкбуффер на фронтбуффер;
В итоге неприятный эффект при ресайзе окна выходит, а именно если ресайзить окно из большего размера в меньший размер то сначала окно ресайзится пользователь видит несколько долей секунды обрезанную часть старого фронт буффера и затем только новый фронт буффер с новым содержимым под новый размер окна.
Как исправить? Как сделать чтобы видимый ресайз windows окна происходил одновременно с отрисовкой нового фронтбуфера без лагов или пусть даже ресайз с некоторой задержкой но главное чтобы одновременно?
Здравствуйте, Аноним, Вы писали:
А>Привет,
А>Есть окно со стилем WS_POPUPWINDOW & ~WS_VSCROLL & ~WS_HSCROLL & ~WS_CAPTION & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX & ~WS_THICKFRAME А>Делаю вручную resize окна с помощью функции MoveWindow c флашком repaint == true А>Отрабатываю: А> — WM_SIZE: меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер. А> — WM_ERASEBKGND: return 1; А> — WM_PAINT: ложу бэкбуффер на фронтбуффер;
А>В итоге неприятный эффект при ресайзе окна выходит, а именно если ресайзить окно из большего размера в меньший размер то сначала окно ресайзится пользователь видит несколько долей секунды обрезанную часть старого фронт буффера и затем только новый фронт буффер с новым содержимым под новый размер окна.
А>Как исправить? Как сделать чтобы видимый ресайз windows окна происходил одновременно с отрисовкой нового фронтбуфера без лагов или пусть даже ресайз с некоторой задержкой но главное чтобы одновременно?
Это в релизе? Обычно в дебаге есть небольшие лаги...
Попробуйте WS_EX_COMPOSITED...
Re[2]: Проблема с отрисовкой при resize окна
От:
Аноним
Дата:
29.07.14 12:32
Оценка:
_>Это в релизе? Обычно в дебаге есть небольшие лаги...
Дебаг. При ресайзе окна из меньшего в большый размер — лага не наблюдается. А вот из большего размера окна в меньший выходит заметно неприятный эффект.
_>Попробуйте WS_EX_COMPOSITED...
Не годится — добавляет к окну системный заголовок и бордеры.
Здравствуйте, Аноним, Вы писали:
_>>Это в релизе? Обычно в дебаге есть небольшие лаги...
А>Дебаг. При ресайзе окна из меньшего в большый размер — лага не наблюдается. А вот из большего размера окна в меньший выходит заметно неприятный эффект.
На так, а в релизе что? Если нет бага, не вижу причин для страданий
Re[4]: Проблема с отрисовкой при resize окна
От:
Аноним
Дата:
29.07.14 12:56
Оценка:
_>На так, а в релизе что? Если нет бага, не вижу причин для страданий
Тоже самое только менее заметно. Я думал может я что то накосячил или есть выбор как вести себе окну при ресайзе — мне предпочтительнее ресайз с задержкой но чтобы видеть сразу то что нужно.
Здравствуйте, Аноним, Вы писали:
А>Есть окно со стилем WS_POPUPWINDOW & ~WS_VSCROLL & ~WS_HSCROLL & ~WS_CAPTION & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX & ~WS_THICKFRAME А>Делаю вручную resize окна с помощью функции MoveWindow c флашком repaint == true А>Отрабатываю: А> — WM_SIZE: меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер. А> — WM_ERASEBKGND: return 1; А> — WM_PAINT: ложу бэкбуффер на фронтбуффер;
А>В итоге неприятный эффект при ресайзе окна выходит, а именно если ресайзить окно из большего размера в меньший размер то сначала окно ресайзится пользователь видит несколько долей секунды обрезанную часть старого фронт буффера и затем только новый фронт буффер с новым содержимым под новый размер окна.
А>Как исправить? Как сделать чтобы видимый ресайз windows окна происходил одновременно с отрисовкой нового фронтбуфера без лагов или пусть даже ресайз с некоторой задержкой но главное чтобы одновременно?
WM_SIZE приходит довольно редко.
Если нужна моментальная реакция — смотрите на WM_SIZING
Re[2]: Проблема с отрисовкой при resize окна
От:
Аноним
Дата:
29.07.14 19:34
Оценка:
VF>WM_SIZE приходит довольно редко.
Как оно может приходить чаще, чем количество вызов MoveWindow? VF>Если нужна моментальная реакция — смотрите на WM_SIZING
MoveWindow sends the WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, WM_MOVE, WM_SIZE, and WM_NCCALCSIZE messages to the window.
WM_SIZING не шлется вообще потому как нет смысла его слать.
Здравствуйте, Аноним, Вы писали:
А> — WM_PAINT: ложу бэкбуффер на фронтбуффер;
Имеется в виду, что WM_PAINT придет автоматически ? Попробуй его вызывать принудительно, то есть UpdateWindow на WM_SIZE, естественно, после переделки backbuffer. Не уверен, что поможет.
With best regards
Pavel Dvorkin
Re[4]: Проблема с отрисовкой при resize окна
От:
Аноним
Дата:
30.07.14 13:18
Оценка:
VF>Тогда похоже, что задержка вызвана длительной отрисовкой второго буфера? Значит, надо отрисовать его ДО MoveWindow, поскольку размер известен заранее.
Не универсальный метод потому как еще есть MAXIMIZE, RESTORE, MINIMIZE там я не контролирую размеры окна вместо операционной системы но в самом крайнем случае попробую взять на себя такую ответственность.
Re[2]: Проблема с отрисовкой при resize окна
От:
Аноним
Дата:
30.07.14 13:24
Оценка:
CEM>Лучше использовать SetWindowPos
Чем лучше?
Re[2]: Проблема с отрисовкой при resize окна
От:
Аноним
Дата:
30.07.14 13:37
Оценка:
PD>Имеется в виду, что WM_PAINT придет автоматически ?
Да.
PD>Попробуй его вызывать принудительно, то есть UpdateWindow на WM_SIZE, естественно, после переделки backbuffer. Не уверен, что поможет.
Не помогло.
Здравствуйте, CEMb, Вы писали:
CEM>>>Лучше использовать SetWindowPos А>>Чем лучше? CEM>Глюков с отрисовкой не бывает
Дело, похоже, не в глюках. Просто Windows быстро перерисовывает "свою" часть, а клиент — долго.
Не понятно, что нужно перерисовывать при уменьшении размера. Масштабировать? Тогда можно на WM_ERASEBKGND не просто возвращать 1, а перерисовать прошлый буфер в нужном размере, например StretchBlt(). А потом, когда будет время, перерисовать правильно.
Здравствуйте, Аноним, Вы писали:
А>Привет,
А> — WM_SIZE: меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер. А> — WM_ERASEBKGND: return 1; А> — WM_PAINT: ложу бэкбуффер на фронтбуффер;
case WM_SIZE:
// ... меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.
::InvalidateRect(hwnd,NULL,FALSE);
::UpdateWindow(hwnd);
return 0;
Здравствуйте, VladFein, Вы писали:
CEM>>>>Лучше использовать SetWindowPos А>>>Чем лучше? CEM>>Глюков с отрисовкой не бывает
VF>Дело, похоже, не в глюках. Просто Windows быстро перерисовывает "свою" часть, а клиент — долго. VF>Не понятно, что нужно перерисовывать при уменьшении размера. Масштабировать? Тогда можно на WM_ERASEBKGND не просто возвращать 1, а перерисовать прошлый буфер в нужном размере, например StretchBlt(). А потом, когда будет время, перерисовать правильно.
Ничё не понял но у нас были проблемы с перерисовкой, с MoveWindow, с уменьшением окна, со следами под окном. Решилось просто заменой на SetWindowPos.
Re[2]: Проблема с отрисовкой при resize окна
От:
Аноним
Дата:
31.07.14 10:43
Оценка:
CS>
CS>case WM_SIZE:
CS> // ... меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.
CS> ::InvalidateRect(hwnd,NULL,FALSE);
CS> ::UpdateWindow(hwnd);
CS> return 0;
CS>
Никакого эффекта. Не работает.
Re[4]: Проблема с отрисовкой при resize окна
От:
Аноним
Дата:
31.07.14 10:49
Оценка:
CEM>Глюков с отрисовкой не бывает
Заменил MoveWindow на SetWindowPos таким вот образом: