WIN32, C++: можно ли анимировать окно, не скрывая его?
У меня есть элемент управления редактированием (текстовое поле), который я хочу анимировать. Анимация, которую я хочу, заключается в том, что она выскальзывает, создавая дополнительную строку для этого текстового поля. Я могу анимировать свое текстовое поле и сделать его больше, однако, чтобы показать скользящую анимацию, я сначала должен скрыть ее. Это означает, что все текстовые поля выскальзывают, как будто создаются впервые из ничего, а не просто добавляют новую строку.
Это код у меня есть сейчас:
SetWindowPos(hwnd, HWND_TOP, x, y, newWidth, newHeight, SWP_DRAWFRAME);
ShowWindow(hwnd, SW_HIDE);
AnimateWindow(hwnd, 300, AW_SLIDE | AW_VER_NEGATIVE);
Is можно ли показать эту анимацию не скрывая этого?
3 ответов
чтобы расширить ответ Ника D, Вот код для достижения того, что вы ищете...
.h
#define ANIMATION_TIMER 1234
#define ANIMATION_LIMIT 8
#define ANIMATION_OFFSET 4
int m_nAnimationCount;
.cpp
void CExampleDlg::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == ANIMATION_TIMER)
{
if (++m_nAnimationCount > ANIMATION_LIMIT)
KillTimer(EXPAND_TIMER);
else
{
CRect rcExpand;
m_edtExpand.GetWindowRect(rcExpand);
ScreenToClient(rcExpand);
rcExpand.bottom += ANIMATION_OFFSET;
m_edtExpand.MoveWindow(rcExpand);
}
}
CDialog::OnTimer(nIDEvent);
}
void CExampleDlg::OnStartAnimation()
{
m_nAnimationCount = 0;
SetTimer(ANIMATION_TIMER, 20, NULL);
}
Не забудьте установить многострочный свойство элемента управления edit (m_edtExpand)
альтернативный способ-имитировать анимацию с помощью функции SetTimer который вызовет процедуру для изменения размера окна, постепенно.
Я думаю, что это невозможно сделать со встроенным API AnimateWindow. Запись MSDN в AnimateWindow http://msdn.microsoft.com/en-us/library/ms632669 (VS.85).aspx говорит, что он используется для" создания специальных эффектов при отображении или скрытии окон", а флаг AW_HIDE определяет, что функция показывает или скрывает окно. И я не вижу никакой альтернативной встроенной функции, чтобы делать то, что вы хотите.
таким образом, Ник Д. и Алан имеют правильный подход кодирования изменение размера. Часто это решение. (Я никогда раньше не слышал об AnimateWindow.) Я предполагаю, что AnimateWindow делает что-то очень похожее внутри, хотя я предполагаю, что это намного надежнее.
вам также, очевидно, нужно убедиться, что таймер делает правильную вещь, если другая строка добавлена или удалена в текстовое поле, или его иначе изменен, прежде чем он закончит анимацию.
а также серьезно подумайте о том, чтобы сделать анимацию низким приоритетом, если это неудобно кодировать.