Passo a passo: Adicionando animação para um projeto MFC
Esta explicação passo a passo ensina como adicionar um objeto animado basic para Visual C++, projeto Microsoft Foundation Class Library (MFC).
O passo a passo mostra como realizar estas tarefas:
Crie um aplicativo do MFC.
Adicionar um menu e, em seguida, adicionar comandos para iniciar e interromper uma animação.
Crie manipuladores de comandos start e stop.
Adicione um objeto animado para o projeto.
O objeto animado na janela do centro.
Verificar os resultados.
Observação |
---|
Seu computador pode mostrar nomes ou locais diferentes para alguns dos elementos da interface do usuário do Visual Studio nas instruções a seguir. A edição do Visual Studio que você possui e as configurações que você usa determinam esses elementos. Para obter mais informações, consulte Configurações de Visual Studio. |
Pré-requisitos
Para concluir esta explicação passo a passo, você deve ter Visual Studio.
Para criar um aplicativo MFC
No menu File, aponte para New e clique Project.
No Novo projeto caixa de diálogo, no painel esquerdo, em Modelos instalados, expanda Visual C++ e selecione MFC.No painel central, selecione Aplicativo MFC.No nome , digite MFCAnimationWalkthrough.Clique em OK.
No MFC Application Wizard diálogo Verifique Tipo de aplicativo é Vários documentos, Projeto estilo é Visual Studioe o suporte a arquitetura de exibição do documento opção é selecionada.Clique em Concluir.
Para adicionar um menu e adicionar comandos para iniciar e interromper uma animação
No modo , aponte para Other Windows e clique em Exibição de recurso.
Em Exibição de recurso, navegue até o Menu pasta e abra-o.Clique duas vezes o IDR_MFCAnimationWalTYPE recurso para abri-lo para modificação.
Na barra de menus na Digite aqui , digite a & nimation para criar um animação menu.
Em animação, no Digite aqui , digite Forward & início para criar um comando Iniciar para frente.
Em Iniciar frente, o Digite aqui , digite Iniciar & para trás.
Em Iniciar com versões anteriores, o Digite aqui , digite I & nterromper para criar um comando de parada.
Salve MFCAnimationWalkthrough.rc e fechá-lo.
Em Solution Explorer, clique duas vezes em MainFrm.cpp para abri-lo para modificação.No CMainFrame::OnCreate método, localize a seção que tem várias chamadas para lstBasicCommands.AddTail.Depois dessa seção, adicione o seguinte código.
lstBasicCommands.AddTail(ID_ANIMATION_STARTFORWARD); lstBasicCommands.AddTail(ID_ANIMATION_STARTBACKWARD); lstBasicCommands.AddTail(ID_ANIMATION_STOP);
Salve o arquivo e feche-o.
Para criar manipuladores para iniciar e parar comandos
Sobre o projeto menu, clique em Assistente de classe.
No Assistente de classe do MFC, em o nome da classe, selecione CMFCAnimationWalkthroughView.
No comandos guia, o Identificações de objeto caixa, selecione ID_ANIMATION_STARTFORWARDe na mensagens caixa, selecione COMMAND.Clique em Adicionar manipulador.
No Adicionar função de membro caixa de diálogo, clique em OK.
No Identificações de objeto caixa, selecione ID_ANIMATION_STARTBACKWARDe na mensagens caixa, selecione COMMAND.Clique em Adicionar manipulador.
No Adicionar função de membro caixa de diálogo, clique em OK.
No Identificações de objeto caixa, selecione ID_ANIMATION_STOPe na mensagens caixa, selecione COMMAND.Clique em Adicionar manipulador e clique em OK.
No Adicionar função de membro caixa de diálogo, clique em OK.
No Assistente de classe do MFC, clique OK.
Salvar MFCAnimationWalkthroughView.cpp, que é aberto no editor, mas não a feche.
Para adicionar um objeto animado para o projeto
No Solution Explorer, clique duas vezes em MFCAnimationWalkthroughView.h para abri-lo para modificação.Antes da definição de CMFCAnimationWalkthroughView da classe, adicione o seguinte código para criar um controlador de animação personalizada que manipulará conflitos de agendamento com o objeto de animação.
class CCustomAnimationController : public CAnimationController { public: CCustomAnimationController() { } virtual BOOL OnHasPriorityTrim(CAnimationGroup* pGroupScheduled, CAnimationGroup* pGroupNew, UI_ANIMATION_PRIORITY_EFFECT priorityEffect) { return TRUE; } };
No final de CMFCAnimationWalkthroughView da classe, adicione o seguinte código.
CCustomAnimationController m_animationController; CAnimationColor m_animationColor; CAnimationRect m_animationRect;
Após o DECLARE_MESSAGE_MAP() linha, adicione o seguinte código.
void Animate(BOOL bDirection);
Salve o arquivo e feche-o.
Em MFCAnimationWalkthroughView.cpp, na parte superior do arquivo após o #include declarações, mas antes de qualquer classe métodos, adicione o seguinte código.
static int nAnimationGroup = 0; static int nInfoAreaHeight = 40;
No final do construtor para CMFCAnimationWalkthroughView, adicione o seguinte código.
m_animationController.EnableAnimationTimerEventHandler(); m_animationController.EnablePriorityComparisonHandler(UI_ANIMATION_PHT_TRIM); m_animationColor = RGB(255, 255, 255); m_animationRect = CRect(0, 0, 0, 0); m_animationColor.SetID(-1, nAnimationGroup); m_animationRect.SetID(-1, nAnimationGroup); m_animationController.AddAnimationObject(&m_animationColor); m_animationController.AddAnimationObject(&m_animationRect);
Localize o CAnimationWalthroughView::PreCreateWindow método e substituí-lo com o código a seguir.
BOOL CMFCAnimationWalkthroughView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs m_animationController.SetRelatedWnd(this); return CView::PreCreateWindow(cs); }
Localize o CAnimationWalkthroughView::OnDraw método e substituí-lo com o código a seguir.
void CMFCAnimationWalkthroughView::OnDraw(CDC* pDC) { CMFCAnimationWalkthroughDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: add draw code for native data here CMemDC dcMem(*pDC, this); CDC& dc = dcMem.GetDC(); CRect rect; GetClientRect(rect); dc.FillSolidRect(rect, GetSysColor(COLOR_WINDOW)); CString strRGB; strRGB.Format(_T("Fill Color is: %d; %d; %d"), GetRValue(m_animationColor), GetGValue(m_animationColor), GetBValue(m_animationColor)); dc.DrawText(strRGB, rect, DT_CENTER); rect.top += nInfoAreaHeight; CBrush br; br.CreateSolidBrush(m_animationColor); CBrush* pBrushOld = dc.SelectObject(&br); dc.Rectangle((CRect)m_animationRect); dc.SelectObject(pBrushOld); }
No final do arquivo, adicione o seguinte código.
void CMFCAnimationWalkthroughView::Animate(BOOL bDirection) { static UI_ANIMATION_SECONDS duration = 3; static DOUBLE dblSpeed = 35.; static BYTE nStartColor = 50; static BYTE nEndColor = 255; BYTE nRedColorFinal = bDirection ? nStartColor : nEndColor; BYTE nGreenColorFinal = bDirection ? nStartColor : nEndColor; BYTE nBlueColorFinal = bDirection ? nStartColor : nEndColor; CLinearTransition* pRedTransition = new CLinearTransition(duration, (DOUBLE)nRedColorFinal); CSmoothStopTransition* pGreenTransition = new CSmoothStopTransition(duration, (DOUBLE)nGreenColorFinal); CLinearTransitionFromSpeed* pBlueTransition = new CLinearTransitionFromSpeed(dblSpeed, (DOUBLE)nBlueColorFinal); m_animationColor.AddTransition(pRedTransition, pGreenTransition, pBlueTransition); CRect rectClient; GetClientRect(rectClient); rectClient.top += nInfoAreaHeight; int nLeftFinal = bDirection ? rectClient.left : rectClient.CenterPoint().x; int nTopFinal = bDirection ? rectClient.top : rectClient.CenterPoint().y; int nRightFinal = bDirection ? rectClient.right : rectClient.CenterPoint().x; int nBottomFinal = bDirection ? rectClient.bottom : rectClient.CenterPoint().y; CLinearTransition* pLeftTransition = new CLinearTransition(duration, nLeftFinal); CLinearTransition* pTopTransition = new CLinearTransition(duration, nTopFinal); CLinearTransition* pRightTransition = new CLinearTransition(duration, nRightFinal); CLinearTransition* pBottomTransition = new CLinearTransition(duration, nBottomFinal); m_animationRect.AddTransition(pLeftTransition, pTopTransition, pRightTransition, pBottomTransition); CBaseKeyFrame* pKeyframeStart = CAnimationController::GetKeyframeStoryboardStart(); CKeyFrame* pKeyFrameEnd = m_animationController.CreateKeyframe(nAnimationGroup, pBlueTransition); pLeftTransition->SetKeyframes(pKeyframeStart, pKeyFrameEnd); pTopTransition->SetKeyframes(pKeyframeStart, pKeyFrameEnd); pRightTransition->SetKeyframes(pKeyframeStart, pKeyFrameEnd); pBottomTransition->SetKeyframes(pKeyframeStart, pKeyFrameEnd); m_animationController.AnimateGroup(nAnimationGroup); }
Sobre o projeto menu, clique em Assistente de classe.
No Assistente de classe do MFC, em o nome da classe, selecione CMFCAnimationWalkthroughView.
No mensagens guia, o mensagens caixa, selecione WM_ERASEBKGND, clique Adicionar manipuladore clique em OK.
MFCAnimationWalkthroughView.cpp, substitua a implementação de OnEraseBkgnd com o seguinte código para reduzir oscilação no objeto animado quando é redesenhado.
BOOL CMFCAnimationWalkthroughView::OnEraseBkgnd(CDC* /*pDC*/) { return TRUE; }
Substituir as implementações do CMFCAnimationWalkthroughView::OnAnimationStartforward, CMFCAnimationWalkthroughView::OnAnimationStartbackward, e CMFCAnimationWalkthroughView::OnAnimationStop com o código a seguir.
void CMFCAnimationWalkthroughView::OnAnimationStartforward() { Animate(TRUE); } void CMFCAnimationWalkthroughView::OnAnimationStartbackward() { Animate(FALSE); } void CMFCAnimationWalkthroughView::OnAnimationStop() { IUIAnimationManager* pManager = m_animationController.GetUIAnimationManager(); if (pManager != NULL) { pManager->AbandonAllStoryboards(); } }
Salve o arquivo e feche-o.
Para centralizar o objeto animado na janela
Em Solution Explorer, clique duas vezes em MFCAnimationWalkthroughView.h para abri-lo para modificação.No final de CMFCAnimationWalkthroughView classe, logo após a definição de m_animationRect, adicione o seguinte código.
BOOL m_bCurrentDirection;
Salve o arquivo e feche-o.
Sobre o projeto menu, clique em Assistente de classe.
No Assistente de classe do MFC, em o nome da classe, selecione CMFCAnimationWalkthroughView.
No mensagens guia, o mensagens caixa, selecione WM_SIZE, clique Adicionar manipuladore clique em OK.
Na MFCAnimationWalkthroughView.cpp, substitua o código para CMFCAnimationWalkthroughView::OnSize com o código a seguir.
void CMFCAnimationWalkthroughView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); CRect rect; GetClientRect(rect); rect.top += nInfoAreaHeight; CRect rectAnim = m_animationRect; m_animationRect = CRect(CPoint(rect.CenterPoint().x - rectAnim.Width() / 2, rect.CenterPoint().y - rectAnim.Height() / 2), rectAnim.Size()); if (m_animationController.IsAnimationInProgress()) { Animate(m_bCurrentDirection); } }
No início do construtor para CMFCAnimationWalkthroughView, adicione o seguinte código.
m_bCurrentDirection = TRUE;
No início do CMFCAnimationWalkthroughView::Animate método, adicione o seguinte código.
m_bCurrentDirection = bDirection;
Salve o arquivo e feche-o.
Para verificar os resultados
- Criar e executar o aplicativo.Sobre o animação menu, clique em Iniciar frente.Um retângulo deve aparecer e preencher a área central.Quando você clica em Iniciar para trás, a animação deve reverter e quando você clica em Parar, deve parar.A cor de preenchimento do retângulo deve alterar conforme o andamento da animação e a cor atual deve ser exibida na parte superior da janela de animação.