Пошаговое руководство. Добавление анимации в проект MFC
В этом пошаговом руководстве показано, как добавить базовый анимированный объект в проект Visual C++, библиотеки классов Microsoft Foundation (MFC).
В пошаговом руководстве показано, как выполнить следующие задачи:
Создайте приложение MFC.
Добавьте меню и добавьте команды для запуска и остановки анимации.
Создайте обработчики для команд запуска и остановки.
Добавьте в проект анимированный объект.
Центр анимированного объекта в окне.
Проверьте результаты.
Примечание.
Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.
Необходимые компоненты
Чтобы выполнить это пошаговое руководство, необходимо иметь Visual Studio.
Создание приложения MFC
Используйте мастер приложений MFC для создания приложения MFC. См . пошаговое руководство. Использование новых элементов управления оболочки MFC для инструкций по открытию мастера для вашей версии Visual Studio.
В поле "Имя" введите MFCAnimationWalkthrough. Щелкните OK.
В диалоговом окне мастера приложений MFC убедитесь, что тип приложения — несколько документов, стиль проекта — Visual Studio, а выбран параметр поддержки архитектуры document/View. Нажмите кнопку Готово.
Добавление меню и добавление команд для запуска и остановки анимации
В меню "Вид" наведите указатель мыши на другие окна и выберите пункт "Представление ресурсов".
В представлении ресурсов перейдите в папку меню и откройте ее. Дважды щелкните ресурс IDR_MFCAnimationWalkthroughTYPE , чтобы открыть его для изменения.
В строке меню в поле "Тип здесь" введите A&nimation, чтобы создать меню анимации.
В разделе "Анимация" в поле "Тип здесь" введите "Пуск и вперед", чтобы создать команду "Пуск вперед".
В разделе "Пуск вперед" в поле "Тип здесь" введите "Пуск назад".
В разделе "Назад" в поле "Тип здесь" введите "S&top", чтобы создать команду Stop.
Сохраните MFCAnimationWalkthrough.rc и закройте его.
В Обозреватель решений дважды щелкните MainFrm.cpp, чтобы открыть его для изменения. В методе
CMainFrame::OnCreate
найдите раздел с несколькими вызовамиlstBasicCommands.AddTail
. Сразу после этого раздела добавьте следующий код.lstBasicCommands.AddTail(ID_ANIMATION_STARTFORWARD); lstBasicCommands.AddTail(ID_ANIMATION_STARTBACKWARD); lstBasicCommands.AddTail(ID_ANIMATION_STOP);
Сохраните файл и закройте его.
Создание обработчиков для команд запуска и остановки
В меню "Проект" выберите мастер классов.
В мастере классов MFC в разделе "Имя класса" выберите CMFCAnimationWalkthroughView.
На вкладке "Команды" в поле "Идентификаторы объектов" выберите ID_ANIMATION_STARTFORWARD, а затем в поле "Сообщения" выберите COMMAND. Нажмите кнопку "Добавить обработчик".
В диалоговом окне "Добавить функцию-член" нажмите кнопку "ОК".
В поле идентификаторов объектов выберите ID_ANIMATION_STARТБ ACKWARD, а затем в поле "Сообщения" выберите COMMAND. Нажмите кнопку "Добавить обработчик".
В диалоговом окне "Добавить функцию-член" нажмите кнопку "ОК".
В поле идентификаторов объектов выберите ID_ANIMATION_STOP, а затем в поле "Сообщения" выберите COMMAND. Нажмите кнопку "Добавить обработчик" и нажмите кнопку "ОК".
В диалоговом окне "Добавить функцию-член" нажмите кнопку "ОК".
В мастере классов MFC нажмите кнопку "ОК".
Сохраните MFCAnimationWalkthroughView.cpp, который открыт в редакторе, но не закрывайте его.
Добавление анимированного объекта в проект
В Обозреватель решений дважды щелкните MFCAnimationWalkthroughView.h, чтобы открыть его для изменения. Непосредственно перед определением
CMFCAnimationWalkthroughView
класса добавьте следующий код, чтобы создать пользовательский контроллер анимации, который будет обрабатывать конфликты планирования с объектом анимации.class CCustomAnimationController : public CAnimationController { public: CCustomAnimationController() { } virtual BOOL OnHasPriorityTrim(CAnimationGroup* pGroupScheduled, CAnimationGroup* pGroupNew, UI_ANIMATION_PRIORITY_EFFECT priorityEffect) { return TRUE; } };
В конце
CMFCAnimationWalkthroughView
класса добавьте следующий код.CCustomAnimationController m_animationController; CAnimationColor m_animationColor; CAnimationRect m_animationRect;
DECLARE_MESSAGE_MAP()
После строки добавьте следующий код.void Animate(BOOL bDirection);
Сохраните файл и закройте его.
В MFCAnimationWalkthroughView.cpp в верхней части файла после
#include
инструкций, но перед любыми методами класса добавьте следующий код.static int nAnimationGroup = 0; static int nInfoAreaHeight = 40;
В конце конструктора
CMFCAnimationWalkthroughView
добавьте следующий код.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);
CAnimationWalthroughView::PreCreateWindow
Найдите метод и замените его следующим кодом.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); }
CAnimationWalkthroughView::OnDraw
Найдите метод и замените его следующим кодом.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); }
В конце файла добавьте следующий код.
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); }
В меню "Проект" выберите мастер классов.
В мастере классов MFC в разделе "Имя класса" выберите CMFCAnimationWalkthroughView.
На вкладке "Сообщения" в поле "Сообщения" выберите WM_ERASEBKGND, нажмите кнопку "Добавить обработчик" и нажмите кнопку "ОК".
В MFCAnimationWalkthroughView.cpp замените реализацию следующего
OnEraseBkgnd
кода, чтобы уменьшить мерцание в анимированном объекте при повторном удалении.BOOL CMFCAnimationWalkthroughView::OnEraseBkgnd(CDC* /*pDC*/) { return TRUE; }
Замените реализации
CMFCAnimationWalkthroughView::OnAnimationStartforward
,CMFCAnimationWalkthroughView::OnAnimationStartbackward
аCMFCAnimationWalkthroughView::OnAnimationStop
также следующим кодом.void CMFCAnimationWalkthroughView::OnAnimationStartforward() { Animate(TRUE); } void CMFCAnimationWalkthroughView::OnAnimationStartbackward() { Animate(FALSE); } void CMFCAnimationWalkthroughView::OnAnimationStop() { IUIAnimationManager* pManager = m_animationController.GetUIAnimationManager(); if (pManager != NULL) { pManager->AbandonAllStoryboards(); } }
Сохраните файл и закройте его.
Центр анимированного объекта в окне
В Обозреватель решений дважды щелкните MFCAnimationWalkthroughView.h, чтобы открыть его для изменения. В конце
CMFCAnimationWalkthroughView
класса сразу после определенияm_animationRect
добавьте следующий код.BOOL m_bCurrentDirection;
Сохраните файл и закройте его.
В меню "Проект" выберите мастер классов.
В мастере классов MFC в разделе "Имя класса" выберите CMFCAnimationWalkthroughView.
На вкладке "Сообщения" в поле "Сообщения" выберите WM_SIZE, нажмите кнопку "Добавить обработчик" и нажмите кнопку "ОК".
В MFCAnimationWalkthroughView.cpp замените код
CMFCAnimationWalkthroughView::OnSize
следующим кодом.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); } }
В начале конструктора
CMFCAnimationWalkthroughView
добавьте следующий код.m_bCurrentDirection = TRUE;
В начале
CMFCAnimationWalkthroughView::Animate
метода добавьте следующий код.m_bCurrentDirection = bDirection;
Сохраните файл и закройте его.
Проверка результатов
- Выполните сборку приложения и запустите его. В меню "Анимация" нажмите кнопку "Пуск вперед". Прямоугольник должен появиться, а затем заполнить центральную область. При нажатии кнопки "Пуск назад" анимация должна измениться и при нажатии кнопки "Остановить", она должна остановиться. Цвет заливки прямоугольника должен изменяться по мере выполнения анимации, а текущий цвет должен отображаться в верхней части окна анимации.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по