WIN32, C++: действительно ли возможно анимировать окно, не скрывая его?

  1. Используя #defines вместо функций для предотвращения штрафа вызова функции. Я видел код, где расширения определяют, оказалось, сгенерировал огромный и действительно медленный код. Конечно, было невозможно отладить также. Подставляемые функции являются способом сделать это, но они должны использоваться с осторожностью также.

  2. я видел код, где независимые тесты были преобразованы в биты, одним словом, которые могут использоваться в операторе переключения. Переключатель может быть действительно быстрым, но когда люди превращают серию независимых тестов в битовую маску, и начинает писать приблизительно 256 оптимизированных особых случаев, у них должен быть очень хороший сравнительный тест, доказывающий, что это дает увеличение производительности. Это - действительно боль с точки зрения обслуживания, и обработка различных тестов независимо делает код значительно уменьшенным, который также важен для производительности.

7
задан Matthew Murdoch 15 August 2009 в 17:52
поделиться

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);
}

Не забудьте установить свойство Multiline в элементе управления редактирования (m_edtExpand)

6
ответ дан 7 December 2019 в 03:18
поделиться

Я думаю, что это невозможно сделать с помощью встроенного API AnimateWindow. В записи MSDN для AnimateWindow http://msdn.microsoft.com/en-us/library/ms632669 (VS.85) .aspx говорится, что она используется для «создания специальных эффектов при отображении или скрытии окон» , а флаг AW_HIDE определяет, что функция либо показывает, либо скрывает окно. И я не вижу никакой альтернативной встроенной функции, которая бы делала то, что вы хотите.

Таким образом, Ник Д. и Алан имеют правильный подход к написанию кода изменения размера самостоятельно. Часто это решение. (Я никогда раньше не слышал об AnimateWindow.) Я предполагаю, что AnimateWindow делает что-то очень похожее внутри, хотя я предполагаю, что это намного надежнее.

Очевидно, вам также необходимо убедиться, что таймер делает правильные вещи, если другая строка добавляется или удаляется в текстовое поле,

0
ответ дан 7 December 2019 в 03:18
поделиться

Альтернативный способ - имитировать анимацию с помощью функции SetTimer , которая будет вызывать процедуру для постепенного изменения размера окна.

3
ответ дан 7 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: