Sdílet prostřednictvím


Názorný postup: Přidání animace do projektu aplikace MFC

Uživatelům tento návod jak přidat do jazyka Visual C++, Microsoft Foundation Class knihovny MFC () projektu základní animovaný objekt.

Návod ukazuje, jak lze provádět tyto úkoly:

  • Vytvořte aplikaci MFC.

  • Přidat nabídku a poté přidat příkazy ke spuštění a zastavení animace.

  • Vytvoření obslužné rutiny pro příkazy spustit a zastavit.

  • Do projektu přidáte animovaný objekt.

  • Animovaný objekt v okně Centrum.

  • Ověřte výsledky.

[!POZNÁMKA]

Ve vašem počítači se pro některé z prvků uživatelského rozhraní sady Visual Studio mohou zobrazit jiné názvy a umístění, než jsou uvedeny v následujících pokynech. Tyto prvky jsou určeny verzí aplikace Visual Studio a použitým nastavením. Další informace naleznete v tématu Nastavení aplikace Visual Studio.

Požadavky

K dokončení tohoto postupu musíte mít aplikaci Visual Studio.

Vytvoření aplikace MFC

  1. V nabídce Soubor přejděte na příkaz Nový a klikněte na Projekt.

  2. V Nový projekt dialogové okno v levém panelu pod Nainstalované šablony, rozbalte položku Visual C++ a vyberte MFC.V prostředním podokně vyberte Aplikace MFC.V název zadejte MFCAnimationWalkthrough.Klikněte na tlačítko OK.

  3. V Průvodce aplikace MFC dialogovém okně pole, zkontrolujte, zda Typ aplikace je Více dokumentů, Projektu styl je Visual Studioa Architektura/zobrazení dokumentu podporu možnost.Klepněte na tlačítko Dokončit.

Přidat nabídku a poté přidat příkazy ke spuštění a zastavení animace

  1. Na zobrazení nabídce přejděte na Jiné Windows a klepněte na tlačítko Zobrazení zdrojů.

  2. V Zobrazení zdrojů, přejděte nabídky složky a otevřete jej.Poklepejte IDR_MFCAnimationWalTYPE prostředku otevřete pro úpravy.

  3. Na panelu nabídek v Zde typ zadejte A & nimation k vytvoření animace nabídky.

  4. Pod animacev Zde typ zadejte Start & dopředu vytvořit příkaz Start vpřed.

  5. Pod Start dopředuv Zde typ zadejte Start & Zpět.

  6. Pod Start zpětněv Zde typ zadejte S & horní vytvořit příkaz Stop.

  7. MFCAnimationWalkthrough.rc ji uložit a zavřít.

  8. V Aplikaci Solution Explorer, poklepejte na MainFrm.cpp otevřete pro úpravy.V CMainFrame::OnCreate metodou, vyhledejte oddíl, který má několik volání na lstBasicCommands.AddTail.Následující kód přidejte pouze po této části.

        lstBasicCommands.AddTail(ID_ANIMATION_STARTFORWARD);
        lstBasicCommands.AddTail(ID_ANIMATION_STARTBACKWARD);
        lstBasicCommands.AddTail(ID_ANIMATION_STOP);
    
  9. Soubor uložte a zavřete.

Vytvoření obslužné rutiny pro zahájení a ukončení příkazů

  1. Na projektu nabídky, klepněte na tlačítko Třídy Průvodce.

  2. V Průvodce třídy MFCpod název třídy, vyberte CMFCAnimationWalkthroughView.

  3. Na Příkazy v kartě ID objektů vyberte položku ID_ANIMATION_STARTFORWARDa poté v zprávy vyberte položku COMMAND.Klepněte na tlačítko Přidat ukazatel.

  4. V Přidat členské funkce dialogové okno, klepněte na tlačítko OK.

  5. V ID objektů vyberte položku ID_ANIMATION_STARTBACKWARDa pak zprávy vyberte položku COMMAND.Klepněte na tlačítko Přidat ukazatel.

  6. V Přidat členské funkce dialogové okno, klepněte na tlačítko OK.

  7. V ID objektů vyberte položku ID_ANIMATION_STOPa pak zprávy vyberte položku COMMAND.Klepněte na tlačítko Přidat popisovač a klepněte na tlačítko OK.

  8. V Přidat členské funkce dialogové okno, klepněte na tlačítko OK.

  9. V Průvodce třídy MFC, klepněte na tlačítko OK.

  10. Uložit MFCAnimationWalkthroughView.cpp, což je otevřít v editoru, ale nelze ho zavřít.

Animovaný objekt přidat do projektu

  1. V aplikaci Solution Explorer poklepejte na MFCAnimationWalkthroughView.h otevřete pro úpravy.Těsně před definice CMFCAnimationWalkthroughView třídy, přidejte následující kód, vytvoření vlastní animace řadič, který bude zpracovávat konflikty plánování animaci objektu.

    class CCustomAnimationController : public CAnimationController
    {
    public:
        CCustomAnimationController()
        {
        }
    
        virtual BOOL OnHasPriorityTrim(CAnimationGroup* pGroupScheduled, CAnimationGroup* pGroupNew, UI_ANIMATION_PRIORITY_EFFECT priorityEffect)
        {
            return TRUE;
        }
    };
    
  2. Na konci CMFCAnimationWalkthroughView třídy, přidejte následující kód.

        CCustomAnimationController m_animationController;
        CAnimationColor m_animationColor; 
        CAnimationRect m_animationRect;
    
  3. Po DECLARE_MESSAGE_MAP() řádek, přidejte následující kód.

        void Animate(BOOL bDirection);
    
  4. Soubor uložte a zavřete.

  5. V MFCAnimationWalkthroughView.cpp na začátku souboru po #include příkazy ale před libovolné třídy, metody, přidejte následující kód.

    static int nAnimationGroup = 0;
    static int nInfoAreaHeight = 40;
    
  6. Na konci konstruktor pro CMFCAnimationWalkthroughView, přidejte následující kód.

        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);
    
  7. Vyhledejte CAnimationWalthroughView::PreCreateWindow metoda a nahradit ji následující kód.

    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);
    }
    
  8. Vyhledejte CAnimationWalkthroughView::OnDraw metoda a nahradit ji následující kód.

    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);
    }
    
  9. Na konec souboru přidejte následující kód.

    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);
    }
    
  10. Na projektu nabídky, klepněte na tlačítko Třídy Průvodce.

  11. V Průvodce třídy MFCpod název třídy, vyberte CMFCAnimationWalkthroughView.

  12. Na zprávy karta v zprávy vyberte položku WM_ERASEBKGND, klepněte na Přidat popisovača klepněte na tlačítko OK.

  13. Nahraďte provádění v MFCAnimationWalkthroughView.cpp, OnEraseBkgnd s následujícím kódem snížit blikání animovaného objektu, když se překreslí.

    BOOL CMFCAnimationWalkthroughView::OnEraseBkgnd(CDC* /*pDC*/)
    {
        return TRUE;
    }
    
  14. Implementacích nahradit CMFCAnimationWalkthroughView::OnAnimationStartforward, CMFCAnimationWalkthroughView::OnAnimationStartbackward, a CMFCAnimationWalkthroughView::OnAnimationStop s následujícím kódem.

    void CMFCAnimationWalkthroughView::OnAnimationStartforward()
    {
        Animate(TRUE);
    }
    
    void CMFCAnimationWalkthroughView::OnAnimationStartbackward()
    {
        Animate(FALSE);
    }
    
    void CMFCAnimationWalkthroughView::OnAnimationStop()
    {
        IUIAnimationManager* pManager = m_animationController.GetUIAnimationManager();
        if (pManager != NULL)
        {
            pManager->AbandonAllStoryboards();
        }
    }
    
  15. Soubor uložte a zavřete.

Na střed animovaný objekt v okně

  1. V Aplikaci Solution Explorer, poklepejte na MFCAnimationWalkthroughView.h otevřete pro úpravy.Na konci CMFCAnimationWalkthroughView třídy právě po vymezení m_animationRect, přidejte následující kód.

        BOOL m_bCurrentDirection;
    
  2. Soubor uložte a zavřete.

  3. Na projektu nabídky, klepněte na tlačítko Třídy Průvodce.

  4. V Průvodce třídy MFCpod název třídy, vyberte CMFCAnimationWalkthroughView.

  5. Na zprávy karta v zprávy vyberte položku WM_SIZE, klepněte na Přidat popisovača klepněte na tlačítko OK.

  6. Nahraďte kód v MFCAnimationWalkthroughView.cpp, CMFCAnimationWalkthroughView::OnSize s následujícím kódem.

    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);
        }
    }
    
  7. Na začátku konstruktor pro CMFCAnimationWalkthroughView, přidejte následující kód.

        m_bCurrentDirection = TRUE;
    
  8. Na začátku CMFCAnimationWalkthroughView::Animate metodou, přidejte následující kód.

        m_bCurrentDirection = bDirection;
    
  9. Soubor uložte a zavřete.

Ověření výsledků

  • Sestavte a spusťte aplikaci.Na animace nabídky, klepněte na tlačítko Start dopředu.Obdélník by se zobrazují a poté vyplňte střed oblasti.Po klepnutí na tlačítko Start zpětně, měla obrátit animace a když klepnete na Stop, měli zastavit.Barva výplně obdélníku by změnit v průběhu animace a aktuální barva by měl být zobrazen v horní části okna animace.

Viz také

Další zdroje

Návody (MFC)