2009-08-15 17 views
7

I Ho un controllo di modifica (un campo di testo) che desidero animare. L'animazione che voglio è che scivola fuori, creando una linea aggiuntiva per questo campo di testo. Sono in grado di animare il mio campo di testo e renderlo più grande, tuttavia per mostrare l'animazione scorrevole devo prima nasconderlo. Ciò significa che l'intero campo di testo scorre come se fosse stato creato per la prima volta dal nulla, invece di aggiungere una nuova riga.WIN32, C++: è possibile animare una finestra senza nasconderlo?

Questo è il codice che ho ora:

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

ShowWindow(hwnd, SW_HIDE); 

AnimateWindow(hwnd, 300, AW_SLIDE | AW_VER_NEGATIVE); 

E 'possibile mostrare questa animazione, senza nasconderlo?

risposta

6

Per espandere su Nick D's risposta, ecco il codice per ottenere quello che stai cercando ...

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

Non dimenticare di impostare la proprietà multilinea sul controllo di modifica (m_edtExpand)

3

Un modo alternativo è simulare l'animazione con SetTimer function che chiamerà una routine per ridimensionare la finestra, in modo incrementale.

0

Penso che non sia possibile fare con l'API AnimateWindow integrata. La voce MSDN di AnimateWindow http://msdn.microsoft.com/en-us/library/ms632669(VS.85).aspx dice che è usata per "produrre effetti speciali quando mostra o nasconde finestre", e il flag AW_HIDE determina che la funzione mostra o nasconde una finestra. E non riesco a vedere alcuna funzione integrata alternativa per fare ciò che vuoi.

Così, Nick D. e Alan hanno il giusto approccio per codificare il ridimensionamento. Questa è spesso la soluzione. (Non avevo mai sentito parlare di AnimateWindow prima.) Presumo che AnimateWindow faccia qualcosa di molto simile internamente, anche se presumo che sia molto più affidabile.

Ovviamente è necessario assicurarsi che il timer faccia la cosa giusta se un'altra riga viene aggiunta o rimossa nella casella di testo, o se viene ridimensionata in altro modo, prima che sia terminata l'animazione.

E anche riflettere seriamente sul fatto che l'animazione abbia priorità bassa, se è scomodo codificare.

Problemi correlati