1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
#include "wxPNGAnimation.h"
#include <wx/dcbuffer.h>
wxPNGAnimation::wxPNGAnimation(wxWindow* parent, const wxBitmap& pngSprite, wxOrientation spriteOrientation,
const wxSize& singleImageSize, wxWindowID id)
: wxPanel(parent, id)
, m_index(0)
{
m_bgColour = GetParent()->GetBackgroundColour();
Hide();
m_timer = new wxTimer(this);
if(spriteOrientation == wxVERTICAL) {
int numImages = pngSprite.GetHeight() / singleImageSize.GetHeight();
wxPoint copyFromPt;
for(int i = 0; i < numImages; ++i) {
copyFromPt.x = 0;
copyFromPt.y = i * singleImageSize.GetHeight();
wxBitmap bmp = pngSprite.GetSubBitmap(wxRect(copyFromPt, singleImageSize));
m_bitmaps.push_back(bmp);
}
} else {
int numImages = pngSprite.GetWidth() / singleImageSize.GetWidth();
wxPoint copyFromPt;
for(int i = 0; i < numImages; ++i) {
copyFromPt.x = i * singleImageSize.GetWidth();
copyFromPt.y = 0;
wxBitmap bmp = pngSprite.GetSubBitmap(wxRect(copyFromPt, singleImageSize));
m_bitmaps.push_back(bmp);
}
}
Bind(wxEVT_PAINT, &wxPNGAnimation::OnPaint, this);
Bind(wxEVT_ERASE_BACKGROUND, &wxPNGAnimation::OnEraseBG, this);
Bind(wxEVT_TIMER, &wxPNGAnimation::OnTimer, this, m_timer->GetId());
SetSizeHints(singleImageSize);
SetSize(singleImageSize);
}
wxPNGAnimation::~wxPNGAnimation()
{
Unbind(wxEVT_TIMER, &wxPNGAnimation::OnTimer, this, m_timer->GetId());
Unbind(wxEVT_PAINT, &wxPNGAnimation::OnPaint, this);
Unbind(wxEVT_ERASE_BACKGROUND, &wxPNGAnimation::OnEraseBG, this);
m_timer->Stop();
wxDELETE(m_timer);
}
void wxPNGAnimation::OnEraseBG(wxEraseEvent& event) { wxUnusedVar(event); }
void wxPNGAnimation::OnPaint(wxPaintEvent& event)
{
wxBufferedPaintDC dc(this);
wxRect rect = GetClientRect();
#ifdef __WXOSX__
rect.Inflate(1);
#endif
dc.SetPen(m_bgColour);
dc.SetBrush(m_bgColour);
dc.DrawRectangle(rect);
dc.DrawBitmap(m_bitmaps.at(m_index), wxPoint(0, 0), true);
}
void wxPNGAnimation::OnTimer(wxTimerEvent& event)
{
++m_index;
if(m_index >= m_bitmaps.size()) {
m_index = 0;
}
Refresh();
}
void wxPNGAnimation::Start(int refereshRate)
{
m_timer->Start(refereshRate);
Show();
}
void wxPNGAnimation::Stop()
{
m_timer->Stop();
Hide();
}
void wxPNGAnimation::SetPanelColour(const wxColour& colour) { m_bgColour = colour; }
|