1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Animation sample
4 // Author: Julian Smart
5 // Modified by: Francesco Montorsi
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ===========================================================================
14 // ===========================================================================
16 // ---------------------------------------------------------------------------
18 // ---------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
35 #include "wx/aboutdlg.h"
36 #include "wx/artprov.h"
37 #include "wx/colordlg.h"
38 #include "wx/wfstream.h"
42 #if !wxUSE_ANIMATIONCTRL
43 #error Cannot compile this sample if wxAnimationCtrl is not enabled
49 // ---------------------------------------------------------------------------
51 // ---------------------------------------------------------------------------
53 // ---------------------------------------------------------------------------
55 // ---------------------------------------------------------------------------
60 ID_SET_NULL_ANIMATION
,
61 ID_SET_INACTIVE_BITMAP
,
62 ID_SET_NO_AUTO_RESIZE
,
66 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
67 EVT_MENU(ID_PLAY
, MyFrame::OnPlay
)
68 EVT_MENU(ID_SET_NULL_ANIMATION
, MyFrame::OnSetNullAnimation
)
69 EVT_MENU(ID_SET_INACTIVE_BITMAP
, MyFrame::OnSetInactiveBitmap
)
70 EVT_MENU(ID_SET_NO_AUTO_RESIZE
, MyFrame::OnSetNoAutoResize
)
71 EVT_MENU(ID_SET_BGCOLOR
, MyFrame::OnSetBgColor
)
73 EVT_MENU(wxID_STOP
, MyFrame::OnStop
)
74 EVT_MENU(wxID_ABOUT
, MyFrame::OnAbout
)
75 EVT_MENU(wxID_EXIT
, MyFrame::OnQuit
)
77 EVT_MENU(wxID_OPEN
, MyFrame::OnOpen
)
78 #endif // wxUSE_FILEDLG
80 EVT_SIZE(MyFrame::OnSize
)
81 EVT_UPDATE_UI(wxID_ANY
, MyFrame::OnUpdateUI
)
84 // ===========================================================================
86 // ===========================================================================
88 // ---------------------------------------------------------------------------
90 // ---------------------------------------------------------------------------
92 // Initialise this in OnInit, not statically
95 if ( !wxApp::OnInit() )
98 // Create the main frame window
100 MyFrame
* frame
= new MyFrame((wxFrame
*)NULL
, wxID_ANY
, wxT("Animation Demo"),
101 wxDefaultPosition
, wxSize(500, 400),
102 wxDEFAULT_FRAME_STYLE
);
110 // ---------------------------------------------------------------------------
112 // ---------------------------------------------------------------------------
114 // Define my frame constructor
115 MyFrame::MyFrame(wxWindow
*parent
,
117 const wxString
& title
,
121 : wxFrame(parent
, id
, title
, pos
, size
,
122 style
| wxNO_FULL_REPAINT_ON_RESIZE
)
124 SetIcon(wxICON(sample
));
127 wxMenu
*file_menu
= new wxMenu
;
130 file_menu
->Append(wxID_OPEN
, wxT("&Open Animation...\tCtrl+O"), wxT("Loads an animation"));
131 #endif // wxUSE_FILEDLG
132 file_menu
->Append(wxID_EXIT
);
134 wxMenu
*play_menu
= new wxMenu
;
135 play_menu
->Append(ID_PLAY
, wxT("Play\tCtrl+P"), wxT("Play the animation"));
136 play_menu
->Append(wxID_STOP
, wxT("Stop\tCtrl+P"), wxT("Stop the animation"));
137 play_menu
->AppendSeparator();
138 play_menu
->Append(ID_SET_NULL_ANIMATION
, wxT("Set null animation"),
139 wxT("Sets the empty animation in the control"));
140 play_menu
->AppendCheckItem(ID_SET_INACTIVE_BITMAP
, wxT("Set inactive bitmap"),
141 wxT("Sets an inactive bitmap for the control"));
142 play_menu
->AppendCheckItem(ID_SET_NO_AUTO_RESIZE
, wxT("Set no autoresize"),
143 wxT("Tells the control not to resize automatically"));
144 play_menu
->Append(ID_SET_BGCOLOR
, wxT("Set background colour..."),
145 wxT("Sets the background colour of the control"));
147 wxMenu
*help_menu
= new wxMenu
;
148 help_menu
->Append(wxID_ABOUT
);
150 wxMenuBar
*menu_bar
= new wxMenuBar
;
152 menu_bar
->Append(file_menu
, wxT("&File"));
153 menu_bar
->Append(play_menu
, wxT("&Animation"));
154 menu_bar
->Append(help_menu
, wxT("&Help"));
156 // Associate the menu bar with this frame
157 SetMenuBar(menu_bar
);
161 #endif // wxUSE_STATUSBAR
163 // use a wxBoxSizer otherwise wxFrame will automatically
164 // resize the m_animationCtrl to fill its client area on
166 wxSizer
*sz
= new wxBoxSizer(wxVERTICAL
);
167 sz
->Add(new wxStaticText(this, wxID_ANY
, wxT("wxAnimationCtrl:")),
168 wxSizerFlags().Centre().Border());
170 m_animationCtrl
= new wxAnimationCtrl(this, wxID_ANY
);
171 if (m_animationCtrl
->LoadFile(wxT("throbber.gif")))
172 m_animationCtrl
->Play();
174 sz
->Add(m_animationCtrl
, wxSizerFlags().Centre().Border());
182 void MyFrame::OnPlay(wxCommandEvent
& WXUNUSED(event
))
184 if (!m_animationCtrl
->Play())
186 wxLogError(wxT("Invalid animation"));
190 void MyFrame::OnStop(wxCommandEvent
& WXUNUSED(event
))
192 m_animationCtrl
->Stop();
195 void MyFrame::OnSetNullAnimation(wxCommandEvent
& WXUNUSED(event
))
197 m_animationCtrl
->SetAnimation(wxNullAnimation
);
200 void MyFrame::OnSetInactiveBitmap(wxCommandEvent
& event
)
202 if (event
.IsChecked())
204 // set a dummy bitmap as the inactive bitmap
205 wxBitmap bmp
= wxArtProvider::GetBitmap(wxART_MISSING_IMAGE
);
206 m_animationCtrl
->SetInactiveBitmap(bmp
);
209 m_animationCtrl
->SetInactiveBitmap(wxNullBitmap
);
212 void MyFrame::OnSetNoAutoResize(wxCommandEvent
& event
)
214 // recreate the control with the new flag if necessary
215 long style
= wxAC_DEFAULT_STYLE
|
216 (event
.IsChecked() ? wxAC_NO_AUTORESIZE
: 0);
218 if (style
!= m_animationCtrl
->GetWindowStyle())
220 // save status of the control before destroying it
221 wxAnimation curr
= m_animationCtrl
->GetAnimation();
222 wxBitmap inactive
= m_animationCtrl
->GetInactiveBitmap();
223 wxColour bg
= m_animationCtrl
->GetBackgroundColour();
226 wxAnimationCtrl
*old
= m_animationCtrl
;
227 m_animationCtrl
= new wxAnimationCtrl(this, wxID_ANY
, curr
,
228 wxDefaultPosition
, wxDefaultSize
,
231 GetSizer()->Replace(old
, m_animationCtrl
);
234 // load old status in new control
235 m_animationCtrl
->SetInactiveBitmap(inactive
);
236 m_animationCtrl
->SetBackgroundColour(bg
);
238 GetSizer()->Layout();
242 void MyFrame::OnSetBgColor(wxCommandEvent
& WXUNUSED(event
))
244 wxColour clr
= wxGetColourFromUser(this, m_animationCtrl
->GetBackgroundColour(),
245 wxT("Choose the background colour"));
248 m_animationCtrl
->SetBackgroundColour(clr
);
251 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
256 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
) )
258 wxAboutDialogInfo info
;
259 info
.SetName(_("wxAnimationCtrl and wxAnimation sample"));
260 info
.SetDescription(_("This sample program demonstrates the usage of wxAnimationCtrl"));
261 info
.SetCopyright(wxT("(C) 2006 Julian Smart"));
263 info
.AddDeveloper(wxT("Julian Smart"));
264 info
.AddDeveloper(wxT("Guillermo Rodriguez Garcia"));
265 info
.AddDeveloper(wxT("Francesco Montorsi"));
271 void MyFrame::OnOpen(wxCommandEvent
& WXUNUSED(event
))
273 wxFileDialog
dialog(this, wxT("Please choose an animation"),
274 wxEmptyString
, wxEmptyString
, wxT("*.gif;*.ani"), wxFD_OPEN
);
275 if (dialog
.ShowModal() == wxID_OK
)
277 wxString
filename(dialog
.GetPath());
279 // enable one of the two chunk of codes to test different parts of wxAnimation/wxAnimationCtrl
281 if (m_animationCtrl
->LoadFile(filename
))
282 m_animationCtrl
->Play();
284 wxMessageBox(wxT("Sorry, this animation is not a valid format for wxAnimation."));
288 if (!temp
.LoadFile(filename
))
290 wxLogError(wxT("Sorry, this animation is not a valid format for wxAnimation."));
294 m_animationCtrl
->SetAnimation(temp
);
295 m_animationCtrl
->Play();
297 wxFileInputStream
stream(filename
);
300 wxLogError(wxT("Sorry, this animation is not a valid format for wxAnimation."));
305 if (!temp
.Load(stream
))
307 wxLogError(wxT("Sorry, this animation is not a valid format for wxAnimation."));
311 m_animationCtrl
->SetAnimation(temp
);
312 m_animationCtrl
->Play();
316 GetSizer()->Layout();
319 #endif // wxUSE_FILEDLG
321 void MyFrame::OnUpdateUI(wxUpdateUIEvent
& WXUNUSED(event
) )
323 GetMenuBar()->FindItem(wxID_STOP
)->Enable(m_animationCtrl
->IsPlaying());
324 GetMenuBar()->FindItem(ID_PLAY
)->Enable(!m_animationCtrl
->IsPlaying());
325 GetMenuBar()->FindItem(ID_SET_NO_AUTO_RESIZE
)->Enable(!m_animationCtrl
->IsPlaying());