1///////////////////////////////////////////////////////////////////////////// 2// Name: src/common/animatecmn.cpp 3// Purpose: wxAnimation and wxAnimationCtrl 4// Author: Francesco Montorsi 5// Modified By: 6// Created: 24/09/2006 7// Id: $Id: animatecmn.cpp 43494 2006-11-18 17:46:29Z RR $ 8// Copyright: (c) Francesco Montorsi 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12 13// ---------------------------------------------------------------------------- 14// headers 15// ---------------------------------------------------------------------------- 16 17// For compilers that support precompilation, includes "wx.h". 18#include "wx/wxprec.h" 19 20#if wxUSE_ANIMATIONCTRL 21 22#include "wx/animate.h" 23#include "wx/bitmap.h" 24#include "wx/log.h" 25#include "wx/brush.h" 26#include "wx/image.h" 27#include "wx/dcmemory.h" 28 29const wxChar wxAnimationCtrlNameStr[] = wxT("animationctrl"); 30 31// global object 32wxAnimation wxNullAnimation; 33 34IMPLEMENT_ABSTRACT_CLASS(wxAnimationBase, wxObject) 35IMPLEMENT_ABSTRACT_CLASS(wxAnimationCtrlBase, wxControl) 36 37 38// ---------------------------------------------------------------------------- 39// wxAnimationCtrlBase 40// ---------------------------------------------------------------------------- 41 42void wxAnimationCtrlBase::UpdateStaticImage() 43{ 44 if (!m_bmpStaticReal.IsOk() || !m_bmpStatic.IsOk()) 45 return; 46 47 // if given bitmap is not of the right size, recreate m_bmpStaticReal accordingly 48 const wxSize &sz = GetClientSize(); 49 if (sz.GetWidth() != m_bmpStaticReal.GetWidth() || 50 sz.GetHeight() != m_bmpStaticReal.GetHeight()) 51 { 52 if (!m_bmpStaticReal.IsOk() || 53 m_bmpStaticReal.GetWidth() != sz.GetWidth() || 54 m_bmpStaticReal.GetHeight() != sz.GetHeight()) 55 { 56 // need to (re)create m_bmpStaticReal 57 if (!m_bmpStaticReal.Create(sz.GetWidth(), sz.GetHeight(), 58 m_bmpStatic.GetDepth())) 59 { 60 wxLogDebug(wxT("Cannot create the static bitmap")); 61 m_bmpStatic = wxNullBitmap; 62 return; 63 } 64 } 65 66 if (m_bmpStatic.GetWidth() <= sz.GetWidth() && 67 m_bmpStatic.GetHeight() <= sz.GetHeight()) 68 { 69 // clear the background of m_bmpStaticReal 70 wxBrush brush(GetBackgroundColour()); 71 wxMemoryDC dc; 72 dc.SelectObject(m_bmpStaticReal); 73 dc.SetBackground(brush); 74 dc.Clear(); 75 76 // center the user-provided bitmap in m_bmpStaticReal 77 dc.DrawBitmap(m_bmpStatic, 78 (sz.GetWidth()-m_bmpStatic.GetWidth())/2, 79 (sz.GetHeight()-m_bmpStatic.GetHeight())/2, 80 true /* use mask */ ); 81 } 82 else 83 { 84 // the user-provided bitmap is bigger than our control, strech it 85 wxImage temp(m_bmpStatic.ConvertToImage()); 86 temp.Rescale(sz.GetWidth(), sz.GetHeight(), wxIMAGE_QUALITY_HIGH); 87 m_bmpStaticReal = wxBitmap(temp); 88 } 89 } 90} 91 92void wxAnimationCtrlBase::SetInactiveBitmap(const wxBitmap &bmp) 93{ 94 m_bmpStatic = bmp; 95 m_bmpStaticReal = bmp; 96 97 // if not playing, update the control now 98 // NOTE: DisplayStaticImage() will call UpdateStaticImage automatically 99 if ( !IsPlaying() ) 100 DisplayStaticImage(); 101} 102 103#endif // wxUSE_ANIMATIONCTRL 104