Sdílet prostřednictvím


Návod: Přidání animace do projektu MFC

V tomto názorném postupu se naučíte přidat základní animovaný objekt do projektu Knihovny tříd Microsoft Foundation (MFC) visual C++.

Tento návod ukazuje, jak provádět tyto úlohy:

  • Vytvořte aplikaci MFC.

  • Přidejte nabídku a pak přidejte příkazy pro spuštění a zastavení animace.

  • Vytvořte obslužné rutiny pro příkazy start a stop.

  • Přidejte do projektu animovaný objekt.

  • Zacentrujte animovaný objekt v okně.

  • Ověřte výsledky.

Poznámka:

Váš počítač může v následujících pokynech zobrazovat odlišné názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Tyto prvky jsou určeny edicí sady Visual Studio a použitým nastavením. Další informace najdete v tématu Přizpůsobení integrovaného vývojového prostředí.

Požadavky

K dokončení tohoto návodu musíte mít Visual Studio.

Vytvoření aplikace MFC

  1. Pomocí Průvodce aplikací MFC vytvořte aplikaci MFC. Viz Návod: Použití nových ovládacích prvků prostředí MFC pro pokyny k otevření průvodce pro vaši verzi sady Visual Studio.

  2. Do pole Název zadejte MFCAnimationWalkthrough. Klikněte na OK.

  3. V dialogovém okně Průvodce aplikací MFC ověřte, zda je typ aplikace více dokumentů, styl projektu je Visual Studio a je vybrána možnost podpora architektury dokumentů a zobrazení. Klikněte na Finish (Dokončit).

Přidání nabídky a následné přidání příkazů pro spuštění a zastavení animace

  1. V nabídce Zobrazení přejděte na položku Ostatní okna a klepněte na tlačítko Zobrazení zdrojů.

  2. V zobrazení prostředků přejděte do složky Nabídky a otevřete ji. Poklikáním na prostředek IDR_MFCAnimationWalkthroughTYPE ho otevřete a upravte ho.

  3. Na řádku nabídek do pole Typ sem zadejte A&nimation a vytvořte nabídku Animace.

  4. V části Animace zadejte do pole Typ sem příkaz Start &Forward a vytvořte příkaz Spustit vpřed.

  5. V části Začít vpřed do pole Typ sem zadejte Začátek &zpět.

  6. V části Začít zpět zadejte do pole Typ sem příkaz S&top a vytvořte příkaz Stop.

  7. Uložte mfcAnimationWalkthrough.rc a zavřete ho.

  8. V Průzkumník řešení poklikáním na MainFrm.cpp ho otevřete pro úpravy. CMainFrame::OnCreate V metodě vyhledejte oddíl, který má několik volání lstBasicCommands.AddTail. Těsně za tímto oddílem přidejte následující kód.

    lstBasicCommands.AddTail(ID_ANIMATION_STARTFORWARD);
    lstBasicCommands.AddTail(ID_ANIMATION_STARTBACKWARD);
    lstBasicCommands.AddTail(ID_ANIMATION_STOP);
    
  9. Uložte soubor a zavřete ho.

Vytvoření obslužných rutin pro příkazy start a stop

  1. V nabídce Projekt klikněte na Průvodce třídou.

  2. V Průvodci třídou MFC v části Název třídy vyberte CMFCAnimationWalkthroughView.

  3. Na kartě Příkazy v poli ID objektů vyberte ID_ANIMATION_STARTFORWARD a potom v poli Zprávy vyberte PŘÍKAZ. Klepněte na tlačítko Přidat obslužnou rutinu.

  4. V dialogovém okně Přidat členovou funkci klepněte na tlačítko OK.

  5. V poli ID objektů vyberte ID_ANIMATION_STARTBACKWARD a potom v poli Zprávy vyberte PŘÍKAZ. Klepněte na tlačítko Přidat obslužnou rutinu.

  6. V dialogovém okně Přidat členovou funkci klepněte na tlačítko OK.

  7. V poli ID objektů vyberte ID_ANIMATION_STOP a potom v poli Zprávy vyberte PŘÍKAZ. Klepněte na tlačítko Přidat obslužnou rutinu a klepněte na tlačítko OK.

  8. V dialogovém okně Přidat členovou funkci klepněte na tlačítko OK.

  9. V Průvodci třídou MFC klepněte na tlačítko OK.

  10. Uložte mfcAnimationWalkthroughView.cpp, který je otevřený v editoru, ale nezavírejte ho.

Přidání animovaného objektu do projektu

  1. V Průzkumník řešení poklikáním MFCAnimationWalkthroughView.h ho otevřete pro úpravy. Těsně před definici CMFCAnimationWalkthroughView třídy přidejte následující kód, který vytvoří vlastní animační kontroler, který bude zpracovávat konflikty plánování s objektem animace.

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

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

    void Animate(BOOL bDirection);
    
  4. Uložte soubor a zavřete ho.

  5. V MFCAnimationWalkthroughView.cpp, v horní části souboru za #include příkazy, ale před všechny metody třídy přidejte následující kód.

    static int nAnimationGroup = 0;
    static int nInfoAreaHeight = 40;
    
  6. Na konec konstruktoru pro CMFCAnimationWalkthroughViewpř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 metodu CAnimationWalthroughView::PreCreateWindow a pak ji nahraďte následujícím kódem.

    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 metodu CAnimationWalkthroughView::OnDraw a pak ji nahraďte následujícím kódem.

    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. V nabídce Projekt klikněte na Průvodce třídou.

  11. V Průvodci třídou MFC v části Název třídy vyberte CMFCAnimationWalkthroughView.

  12. On the Messages tab, in the Messages box, select WM_ERASEBKGND, click Add Handler, and then click OK.

  13. V MFCAnimationWalkthroughView.cpp nahraďte implementaci OnEraseBkgnd následujícím kódem, aby se snížila blikající v animovaném objektu při překreslení.

    BOOL CMFCAnimationWalkthroughView::OnEraseBkgnd(CDC* /*pDC*/)
    {
        return TRUE;
    }
    
  14. Nahraďte implementace , CMFCAnimationWalkthroughView::OnAnimationStartforwardCMFCAnimationWalkthroughView::OnAnimationStartbackwarda CMFCAnimationWalkthroughView::OnAnimationStop 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. Uložte soubor a zavřete ho.

Na střed animovaného objektu v okně

  1. V Průzkumník řešení poklikáním MFCAnimationWalkthroughView.h ho otevřete pro úpravy. Na konec CMFCAnimationWalkthroughView třídy přidejte následující kód hned za definici m_animationRecttřídy.

    BOOL m_bCurrentDirection;
    
  2. Uložte soubor a zavřete ho.

  3. V nabídce Projekt klikněte na Průvodce třídou.

  4. V Průvodci třídou MFC v části Název třídy vyberte CMFCAnimationWalkthroughView.

  5. On the Messages tab, in the Messages box, select WM_SIZE, click Add Handler, and then click OK.

  6. V prostředí MFCAnimationWalkthroughView.cpp nahraďte kód CMFCAnimationWalkthroughView::OnSize 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čátek konstruktoru pro CMFCAnimationWalkthroughViewpřidejte následující kód.

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

    m_bCurrentDirection = bDirection;
    
  9. Uložte soubor a zavřete ho.

Ověření výsledků

  1. Sestavte a spusťte aplikaci. V nabídce Animace klepněte na tlačítko Spustit vpřed. Měl by se zobrazit obdélník a pak vyplnit středovou oblast. Když kliknete na Spustit zpět, animace by se měla vrátit zpět a po kliknutí na Zastavit by se měla zastavit. Barva výplně obdélníku by se měla při průběhu animace změnit a aktuální barva by se měla zobrazit v horní části okna animace.

Viz také

Návody