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 делает что-то очень похожее внутри, хотя я предполагаю, что это намного надежнее.

вам также, очевидно, нужно убедиться, что таймер делает правильную вещь, если другая строка добавлена или удалена в текстовое поле, или его иначе изменен, прежде чем он закончит анимацию.

а также серьезно подумайте о том, чтобы сделать анимацию низким приоритетом, если это неудобно кодировать.