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
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.
Do pole Název zadejte MFCAnimationWalkthrough. Klikněte na OK.
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
V nabídce Zobrazení přejděte na položku Ostatní okna a klepněte na tlačítko Zobrazení zdrojů.
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.
Na řádku nabídek do pole Typ sem zadejte A&nimation a vytvořte nabídku Animace.
V části Animace zadejte do pole Typ sem příkaz Start &Forward a vytvořte příkaz Spustit vpřed.
V části Začít vpřed do pole Typ sem zadejte Začátek &zpět.
V části Začít zpět zadejte do pole Typ sem příkaz S&top a vytvořte příkaz Stop.
Uložte mfcAnimationWalkthrough.rc a zavřete ho.
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);
Uložte soubor a zavřete ho.
Vytvoření obslužných rutin pro příkazy start a stop
V nabídce Projekt klikněte na Průvodce třídou.
V Průvodci třídou MFC v části Název třídy vyberte CMFCAnimationWalkthroughView.
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.
V dialogovém okně Přidat členovou funkci klepněte na tlačítko OK.
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.
V dialogovém okně Přidat členovou funkci klepněte na tlačítko OK.
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.
V dialogovém okně Přidat členovou funkci klepněte na tlačítko OK.
V Průvodci třídou MFC klepněte na tlačítko OK.
Uložte mfcAnimationWalkthroughView.cpp, který je otevřený v editoru, ale nezavírejte ho.
Přidání animovaného objektu do projektu
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; } };
Na konec
CMFCAnimationWalkthroughView
třídy přidejte následující kód.CCustomAnimationController m_animationController; CAnimationColor m_animationColor; CAnimationRect m_animationRect;
DECLARE_MESSAGE_MAP()
Za řádek přidejte následující kód.void Animate(BOOL bDirection);
Uložte soubor a zavřete ho.
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;
Na konec konstruktoru 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);
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); }
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); }
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); }
V nabídce Projekt klikněte na Průvodce třídou.
V Průvodci třídou MFC v části Název třídy vyberte CMFCAnimationWalkthroughView.
On the Messages tab, in the Messages box, select WM_ERASEBKGND, click Add Handler, and then click OK.
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; }
Nahraďte implementace ,
CMFCAnimationWalkthroughView::OnAnimationStartforward
CMFCAnimationWalkthroughView::OnAnimationStartbackward
aCMFCAnimationWalkthroughView::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(); } }
Uložte soubor a zavřete ho.
Na střed animovaného objektu v okně
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 definicim_animationRect
třídy.BOOL m_bCurrentDirection;
Uložte soubor a zavřete ho.
V nabídce Projekt klikněte na Průvodce třídou.
V Průvodci třídou MFC v části Název třídy vyberte CMFCAnimationWalkthroughView.
On the Messages tab, in the Messages box, select WM_SIZE, click Add Handler, and then click OK.
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); } }
Na začátek konstruktoru pro
CMFCAnimationWalkthroughView
přidejte následující kód.m_bCurrentDirection = TRUE;
Na začátek
CMFCAnimationWalkthroughView::Animate
metody přidejte následující kód.m_bCurrentDirection = bDirection;
Uložte soubor a zavřete ho.
Ověření výsledků
- 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.