Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 29.07.14 12:07
Оценка:
Привет,

Есть окно со стилем 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 окна происходил одновременно с отрисовкой нового фронтбуфера без лагов или пусть даже ресайз с некоторой задержкой но главное чтобы одновременно?
Re: Проблема с отрисовкой при resize окна
От: saf_e  
Дата: 29.07.14 12:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет,


А>Есть окно со стилем 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[3]: Проблема с отрисовкой при resize окна
От: saf_e  
Дата: 29.07.14 12:49
Оценка:
Здравствуйте, Аноним, Вы писали:

_>>Это в релизе? Обычно в дебаге есть небольшие лаги...


А>Дебаг. При ресайзе окна из меньшего в большый размер — лага не наблюдается. А вот из большего размера окна в меньший выходит заметно неприятный эффект.


На так, а в релизе что? Если нет бага, не вижу причин для страданий
Re[4]: Проблема с отрисовкой при resize окна
От: Аноним  
Дата: 29.07.14 12:56
Оценка:
_>На так, а в релизе что? Если нет бага, не вижу причин для страданий
Тоже самое только менее заметно. Я думал может я что то накосячил или есть выбор как вести себе окну при ресайзе — мне предпочтительнее ресайз с задержкой но чтобы видеть сразу то что нужно.
Re: Проблема с отрисовкой при resize окна
От: kero Россия  
Дата: 29.07.14 16:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть окно со стилем WS_POPUPWINDOW & ~WS_VSCROLL & ~WS_HSCROLL & ~WS_CAPTION & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX & ~WS_THICKFRAME


WS_SIZEBOX и WS_THICKFRAME — одно и то же
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: Проблема с отрисовкой при resize окна
От: VladFein США  
Дата: 29.07.14 19:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть окно со стилем 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 не шлется вообще потому как нет смысла его слать.
Re[3]: Проблема с отрисовкой при resize окна
От: VladFein США  
Дата: 29.07.14 20:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>WM_SIZING не шлется вообще потому как нет смысла его слать.


Прошу прощения, прозевал "Делаю вручную resize окна с помощью функции MoveWindow".

Тогда похоже, что задержка вызвана длительной отрисовкой второго буфера? Значит, надо отрисовать его ДО MoveWindow, поскольку размер известен заранее.
Re: Проблема с отрисовкой при resize окна
От: CEMb  
Дата: 30.07.14 10:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Делаю вручную resize окна с помощью функции MoveWindow c флашком repaint == true


Лучше использовать SetWindowPos
Re: Проблема с отрисовкой при resize окна
От: Pavel Dvorkin Россия  
Дата: 30.07.14 12:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А> — 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. Не уверен, что поможет.

Не помогло.
Re[3]: Проблема с отрисовкой при resize окна
От: CEMb  
Дата: 30.07.14 16:18
Оценка:
Здравствуйте, Аноним, Вы писали:

CEM>>Лучше использовать SetWindowPos

А>Чем лучше?
Глюков с отрисовкой не бывает
Re[4]: Проблема с отрисовкой при resize окна
От: VladFein США  
Дата: 30.07.14 16:30
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>>>Лучше использовать SetWindowPos

А>>Чем лучше?
CEM>Глюков с отрисовкой не бывает

Дело, похоже, не в глюках. Просто Windows быстро перерисовывает "свою" часть, а клиент — долго.
Не понятно, что нужно перерисовывать при уменьшении размера. Масштабировать? Тогда можно на WM_ERASEBKGND не просто возвращать 1, а перерисовать прошлый буфер в нужном размере, например StretchBlt(). А потом, когда будет время, перерисовать правильно.
Re: Проблема с отрисовкой при resize окна
От: c-smile Канада http://terrainformatica.com
Дата: 30.07.14 22:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет,


А> — WM_SIZE: меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.

А> — WM_ERASEBKGND: return 1;
А> — WM_PAINT: ложу бэкбуффер на фронтбуффер;


case WM_SIZE:
     // ... меняю размеры фронтбуффера и бэкбуффера под новый размер окна, перерисовываю бэкбуффер.
     ::InvalidateRect(hwnd,NULL,FALSE);
     ::UpdateWindow(hwnd);
     return 0;
Re[5]: Проблема с отрисовкой при resize окна
От: CEMb  
Дата: 31.07.14 02:51
Оценка:
Здравствуйте, 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 таким вот образом:
::SetWindowPos(get_hwnd(), NULL, get_desktop_left(), get_desktop_top(), get_width(), get_height(), SWP_NOZORDER);

Не помогло. Глюк с отрисовкой остался.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.