2009-08-15 26 views
7

Tengo un control de edición (un campo de texto) que quiero animar. La animación que quiero es que se deslice, creando una línea adicional para este campo de texto. Puedo animar mi campo de texto y hacerlo más grande; sin embargo, para mostrar la animación deslizante primero tengo que ocultarlo. Esto significa que los campos de texto completos se deslizan como si se hubieran creado por primera vez de la nada, en lugar de simplemente agregar una nueva línea.WIN32, C++: ¿Es posible animar una ventana sin ocultarla?

Este es el código que tengo ahora:

SetWindowPos(hwnd, HWND_TOP, x, y, newWidth, newHeight, SWP_DRAWFRAME); 

ShowWindow(hwnd, SW_HIDE); 

AnimateWindow(hwnd, 300, AW_SLIDE | AW_VER_NEGATIVE); 

¿Es posible mostrar esta animación sin ocultarlo?

Respuesta

6

Para ampliar Nick D's respuesta, aquí está el código para lograr lo que está buscando ...

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

No olvide configurar la propiedad Multiline en el control de edición (m_edtExpand)

3

Una manera alternativa es simular la animación con SetTimer function que llamará a una rutina para cambiar el tamaño de la ventana, de forma incremental.

0

Creo que no es posible hacerlo con la API integrada de AnimateWindow. La entrada de MSDN a AnimateWindow http://msdn.microsoft.com/en-us/library/ms632669(VS.85).aspx dice que se usa para "producir efectos especiales al mostrar u ocultar ventanas", y el indicador AW_HIDE determina que la función muestra u oculta una ventana. Y no veo ninguna función alternativa incorporada para hacer lo que quiera.

Por lo tanto, Nick D. y Alan tienen el enfoque correcto de codificar el cambio de tamaño usted mismo. Esta es a menudo la solución. (Nunca antes había oído hablar de AnimateWindow.) Asumo que AnimateWindow hace algo muy similar internamente, aunque supongo que es mucho más confiable.

También es obvio que necesita asegurarse de que el temporizador haga lo correcto si se agrega o elimina otra línea en el cuadro de texto, o su tamaño, antes de que termine de animarse.

Y también piense seriamente en hacer que la animación tenga baja prioridad, si no es conveniente codificarla.

Cuestiones relacionadas