У меня возникли проблемы с использованием функции AnimateWindow. Я прочитала все в MSDN и RSDN, что нашла про AnimateWindow. В результате ни один из способов непонятно как правильно использовать (т.к. неправильно работает для моего случая) и какой-то сумбур в голове...
Задача:
сделать плавное появление главного окна, используя AnimateWindow. После этого на главном окне должна отрисоваться картинка (средствами GDI+).
Проблема:
какой бы способ ни пробовала, изображение отрисовывается только после сворачивания/разворачивания окна, в то время, как если вместо AnimateWindow использовать ShowWindow, то такой проблемы нет.
Здравствуйте, kvasya, Вы писали:
K>По вопросу, форсируйте прорисовку просто WM_PAINT, например, RedrawWindow.
Спасибо за совет!
Я пробовала RedrawWindow, но видимо, не в такой комбинации. Сейчас все работает. Обработку WM_PRINTCLIENT убрала, т.к. действительно, вроде пока не нужно.
По идее UpdateWindow должна была посылать WM_PAINT... Видимо не посылала почему-то (неужели считала, что область для обновления была пустой?). А RedrawWindow сработала, т.к. это принудительное обновление и область для обновления была задана как клиентская область целиком.
Здравствуйте, programme-soul, Вы писали:
PS>По идее UpdateWindow должна была посылать WM_PAINT... Видимо не посылала почему-то (неужели считала, что область для обновления была пустой?).
Перед вызовом желательно вызывать Invalidate, иначе область обновления действительно может быть пустой.
Re[4]: Плавное появление окна с помощью AnimateWindow
Здравствуйте, Guard_h4s, Вы писали:
PS>>По идее UpdateWindow должна была посылать WM_PAINT... Видимо не посылала почему-то (неужели считала, что область для обновления была пустой?). G_>Перед вызовом желательно вызывать Invalidate, иначе область обновления действительно может быть пустой.
Действительно, связка InvalidateRect и UpdateWindow работает! Спасибо вам!
WM_PRINT и WM_PRINTCLIENT используются так же для отрисовки при AnimateWindow. Обычно все стандартные контролы автоматически поддерживают обработку этих сообщений, но если есть что-то нестандартное, обработку лучше добавить. Так же, мне кажется, если бы в обработчике у ТС были бы обработаны эти сообщения, то надобности в жёстком апдейте онка не было бы, и код был бы более правильным.
Здравствуйте, CEMb, Вы писали:
CEM>WM_PRINT и WM_PRINTCLIENT используются так же для отрисовки при AnimateWindow. Обычно все стандартные контролы автоматически поддерживают обработку этих сообщений, но если есть что-то нестандартное, обработку лучше добавить. Так же, мне кажется, если бы в обработчике у ТС были бы обработаны эти сообщения, то надобности в жёстком апдейте онка не было бы, и код был бы более правильным.
Дело в том, что я не знаю, как обрабатывать эти сообщения. И как их правильно обрабатывать тоже не знаю. Я пробовала найти примеры с обработкой этих сообщений, но тоже неудачно.
Может быть вы подскажете, как правильнее делать, чтобы все окно целиком не перерисовывать?
Здравствуйте, programme-soul, Вы писали:
PS>Дело в том, что я не знаю, как обрабатывать эти сообщения. И как их правильно обрабатывать тоже не знаю. Я пробовала найти примеры с обработкой этих сообщений, но тоже неудачно.
Эти сообщения посылаются окну(опять же, не системой) для того чтобы окно отрисовало себя в предоставленном контексте. Если вы не пользуетесь, например, отрисовкой вашего контрола в картинку, то смысла реализовывать их нет. Они никак не повлияют на то, каким образом окно перерисовывается при обычном WM_PAINT.
To force a window to draw into a specific device context, use the WM_PRINT or WM_PRINTCLIENT message. Note that this requires the target window to support the WM_PRINTCLIENT message. Most common controls support the WM_PRINTCLIENT message.
PS>Может быть вы подскажете, как правильнее делать, чтобы все окно целиком не перерисовывать?
Инвалидировать не все окно, а только отдельный регион(например с помощью того же InvalidateRect). Но отрисовка ложится на ваши плечи в той же самой WM_PAINT