Когда (и как) выкладывать дочерние элементы окна Win32 в ответ на изменение размера?

Windows отправляет несколько сообщений при изменении размера окна:

  • WM_GETMINMAXINFO
  • WM_ENTERSIZEMOVE
  • WM_EXITSIZEMOVE
  • WM_NCCALCSIZE
  • WM_SIZING
  • WM_SIZE
  • WM_WINDOWPOSCHANGING
  • WM_WINDOWPOSCHANGED

и, возможно, больше.

Если я хочу переместить дочерние элементы при изменении размера окна, где и как мне это сделать?
Я ищу "лучший" вариант. метод -- то есть метод с наименьшим количеством ошибок и наименьшим мерцанием.

Мой текущий метод состоит в том, чтобы выполнить все изменения внутри WM_NCCALCSIZE, используя DeferWindowPos.
Однако я также пытался обработать его внутри WM_WINDOWPOSCHANGED... но независимо от того, где я это обрабатываю, кажется, что существует всегда по крайней мере один "момент", когда окно рисуется в промежуточном состоянии, когда размер окна изменился, но его содержимое еще не было изменено .

Еще один эффект, которого я тоже хотел бы избежать: перемещение дочернего элемента после его перемещения. Я не хочу, чтобы пользователь видел, как элемент управления скользит вниз, а затем возвращается вверх из-за моего изменения — у него должно быть как можно меньше временных эффектов.

Я делаю это правильно? Есть ли лучшее место, где я могу выложить детей окна?


person user541686    schedule 03.06.2012    source источник
comment
Нет особого смысла изменять размер дочернего окна, если изменилось только позиция родителя. WM_SIZE обеспечивает наименьшее количество мерцания.   -  person Hans Passant    schedule 03.06.2012
comment
@HansPassant: Ах да, я этого не делал. WM_WINDOWPOSCHANGED на самом деле также является уведомлением о размере. (Хотя исправлена ​​опечатка.) Спасибо за информацию о WM_SIZE.   -  person user541686    schedule 04.06.2012


Ответы (1)


Вы должны переместить окно в сообщении WM_SIZE, потому что это последнее, что окно получает перед завершением своей задачи... Чтобы переместить окно, вы можете использовать MoveWindow

person João Marcelo Brito    schedule 03.06.2012