#include "sample.xpm"
#endif
+#include "wx/aboutdlg.h"
+#include "wx/artprov.h"
+#include "wx/colordlg.h"
+#include "wx/wfstream.h"
+
#include "anitest.h"
+#if !wxUSE_ANIMATIONCTRL
+ #error Cannot compile this sample if wxAnimationCtrl is not enabled
+#endif
+
+
IMPLEMENT_APP(MyApp)
// ---------------------------------------------------------------------------
enum
{
- ID_PLAY = 1
+ ID_PLAY = 1,
+ ID_SET_NULL_ANIMATION,
+ ID_SET_INACTIVE_BITMAP,
+ ID_SET_NO_AUTO_RESIZE,
+ ID_SET_BGCOLOR
};
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_PLAY, MyFrame::OnPlay)
+ EVT_MENU(ID_SET_NULL_ANIMATION, MyFrame::OnSetNullAnimation)
+ EVT_MENU(ID_SET_INACTIVE_BITMAP, MyFrame::OnSetInactiveBitmap)
+ EVT_MENU(ID_SET_NO_AUTO_RESIZE, MyFrame::OnSetNoAutoResize)
+ EVT_MENU(ID_SET_BGCOLOR, MyFrame::OnSetBgColor)
+
EVT_MENU(wxID_STOP, MyFrame::OnStop)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
// Initialise this in OnInit, not statically
bool MyApp::OnInit()
{
- // Create the main frame window
-
- MyFrame* frame = new MyFrame((wxFrame *)NULL, -1, _T("Animation Demo"),
- wxPoint(-1, -1), wxSize(500, 400),
- wxDEFAULT_FRAME_STYLE);
-
- // Give it an icon
- frame->SetIcon(wxICON(sample));
-
- // Make a menubar
- wxMenu *file_menu = new wxMenu;
-
-#if wxUSE_FILEDLG
- file_menu->Append(wxID_OPEN, _T("&Open Animation...\tCtrl+O"), _T("Loads an animation"));
-#endif // wxUSE_FILEDLG
- file_menu->Append(wxID_EXIT);
-
- wxMenu *play_menu = new wxMenu;
- play_menu->Append(ID_PLAY, _T("Play\tCtrl+P"), _T("Play the animation"));
- play_menu->Append(wxID_STOP, _T("Stop\tCtrl+P"), _T("Stop the animation"));
-
- wxMenu *help_menu = new wxMenu;
- help_menu->Append(wxID_ABOUT);
-
- wxMenuBar *menu_bar = new wxMenuBar;
-
- menu_bar->Append(file_menu, _T("&File"));
- menu_bar->Append(play_menu, _T("&Animation"));
- menu_bar->Append(help_menu, _T("&Help"));
-
- // Associate the menu bar with the frame
- frame->SetMenuBar(menu_bar);
+ if ( !wxApp::OnInit() )
+ return false;
-#if wxUSE_STATUSBAR
- frame->CreateStatusBar();
-#endif // wxUSE_STATUSBAR
+ // Create the main frame window
+ MyFrame* frame = new MyFrame((wxFrame *)NULL, wxID_ANY, wxT("Animation Demo"),
+ wxDefaultPosition, wxSize(500, 400),
+ wxDEFAULT_FRAME_STYLE);
frame->Show(true);
SetTopWindow(frame);
// MyFrame
// ---------------------------------------------------------------------------
-#include "wx/wfstream.h"
-
// Define my frame constructor
MyFrame::MyFrame(wxWindow *parent,
const wxWindowID id,
: wxFrame(parent, id, title, pos, size,
style | wxNO_FULL_REPAINT_ON_RESIZE)
{
- //m_canvas = new MyCanvas(this, wxPoint(0, 0), wxDefaultSize);
+ SetIcon(wxICON(sample));
+
+ // Make a menubar
+ wxMenu *file_menu = new wxMenu;
+
+#if wxUSE_FILEDLG
+ file_menu->Append(wxID_OPEN, wxT("&Open Animation...\tCtrl+O"), wxT("Loads an animation"));
+#endif // wxUSE_FILEDLG
+ file_menu->Append(wxID_EXIT);
+
+ wxMenu *play_menu = new wxMenu;
+ play_menu->Append(ID_PLAY, wxT("Play\tCtrl+P"), wxT("Play the animation"));
+ play_menu->Append(wxID_STOP, wxT("Stop\tCtrl+S"), wxT("Stop the animation"));
+ play_menu->AppendSeparator();
+ play_menu->Append(ID_SET_NULL_ANIMATION, wxT("Set null animation"),
+ wxT("Sets the empty animation in the control"));
+ play_menu->AppendCheckItem(ID_SET_INACTIVE_BITMAP, wxT("Set inactive bitmap"),
+ wxT("Sets an inactive bitmap for the control"));
+ play_menu->AppendCheckItem(ID_SET_NO_AUTO_RESIZE, wxT("Set no autoresize"),
+ wxT("Tells the control not to resize automatically"));
+ play_menu->Append(ID_SET_BGCOLOR, wxT("Set background colour..."),
+ wxT("Sets the background colour of the control"));
+
+ wxMenu *help_menu = new wxMenu;
+ help_menu->Append(wxID_ABOUT);
+
+ wxMenuBar *menu_bar = new wxMenuBar;
- //wxSizer *sz = new wxBoxSizer(wxVERTICAL);
+ menu_bar->Append(file_menu, wxT("&File"));
+ menu_bar->Append(play_menu, wxT("&Animation"));
+ menu_bar->Append(help_menu, wxT("&Help"));
- m_animationCtrl = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation,
- wxPoint(0,0),wxSize(100,100));
+ // Associate the menu bar with this frame
+ SetMenuBar(menu_bar);
+
+#if wxUSE_STATUSBAR
+ CreateStatusBar();
+#endif // wxUSE_STATUSBAR
+
+ // use a wxBoxSizer otherwise wxFrame will automatically
+ // resize the m_animationCtrl to fill its client area on
+ // user resizes
+ wxSizer *sz = new wxBoxSizer(wxVERTICAL);
+ sz->Add(new wxStaticText(this, wxID_ANY, wxT("wxAnimationCtrl:")),
+ wxSizerFlags().Centre().Border());
+
+ m_animationCtrl = new wxAnimationCtrl(this, wxID_ANY);
if (m_animationCtrl->LoadFile(wxT("throbber.gif")))
m_animationCtrl->Play();
- //sz->Add(m_animationCtrl, 1, wxGROW);
-
- //SetSizer(sz);
+ sz->Add(m_animationCtrl, wxSizerFlags().Centre().Border());
+ SetSizer(sz);
}
MyFrame::~MyFrame()
void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event))
{
if (!m_animationCtrl->Play())
+ {
wxLogError(wxT("Invalid animation"));
+ }
}
void MyFrame::OnStop(wxCommandEvent& WXUNUSED(event))
m_animationCtrl->Stop();
}
+void MyFrame::OnSetNullAnimation(wxCommandEvent& WXUNUSED(event))
+{
+ m_animationCtrl->SetAnimation(wxNullAnimation);
+}
+
+void MyFrame::OnSetInactiveBitmap(wxCommandEvent& event)
+{
+ if (event.IsChecked())
+ {
+ // set a dummy bitmap as the inactive bitmap
+ wxBitmap bmp = wxArtProvider::GetBitmap(wxART_MISSING_IMAGE);
+ m_animationCtrl->SetInactiveBitmap(bmp);
+ }
+ else
+ m_animationCtrl->SetInactiveBitmap(wxNullBitmap);
+}
+
+void MyFrame::OnSetNoAutoResize(wxCommandEvent& event)
+{
+ // recreate the control with the new flag if necessary
+ long style = wxAC_DEFAULT_STYLE |
+ (event.IsChecked() ? wxAC_NO_AUTORESIZE : 0);
+
+ if (style != m_animationCtrl->GetWindowStyle())
+ {
+ // save status of the control before destroying it
+ wxAnimation curr = m_animationCtrl->GetAnimation();
+ wxBitmap inactive = m_animationCtrl->GetInactiveBitmap();
+ wxColour bg = m_animationCtrl->GetBackgroundColour();
+
+ // destroy & rebuild
+ wxAnimationCtrl *old = m_animationCtrl;
+ m_animationCtrl = new wxAnimationCtrl(this, wxID_ANY, curr,
+ wxDefaultPosition, wxDefaultSize,
+ style);
+
+ GetSizer()->Replace(old, m_animationCtrl);
+ delete old;
+
+ // load old status in new control
+ m_animationCtrl->SetInactiveBitmap(inactive);
+ m_animationCtrl->SetBackgroundColour(bg);
+
+ GetSizer()->Layout();
+ }
+}
+
+void MyFrame::OnSetBgColor(wxCommandEvent& WXUNUSED(event))
+{
+ wxColour clr = wxGetColourFromUser(this, m_animationCtrl->GetBackgroundColour(),
+ wxT("Choose the background colour"));
+
+ if (clr.IsOk())
+ m_animationCtrl->SetBackgroundColour(clr);
+}
+
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close();
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
{
- /*
-
- FIXME: on wxGTK at least using File->About command it shows
- the message dialog but does not focus it
+ wxAboutDialogInfo info;
+ info.SetName(_("wxAnimationCtrl and wxAnimation sample"));
+ info.SetDescription(_("This sample program demonstrates the usage of wxAnimationCtrl"));
+ info.SetCopyright(wxT("(C) 2006 Julian Smart"));
- */
+ info.AddDeveloper(wxT("Julian Smart"));
+ info.AddDeveloper(wxT("Guillermo Rodriguez Garcia"));
+ info.AddDeveloper(wxT("Francesco Montorsi"));
- (void)wxMessageBox(_T("wxWidgets 2 Animation Demo\n")
- _T("Author: Julian Smart (c) 2001\n"),
- _T("About Animation Demo"));
+ wxAboutBox(info);
}
#if wxUSE_FILEDLG
void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
{
- wxFileDialog dialog(this, _T("Please choose an animation"),
+ wxFileDialog dialog(this, wxT("Please choose an animation"),
wxEmptyString, wxEmptyString, wxT("*.gif;*.ani"), wxFD_OPEN);
if (dialog.ShowModal() == wxID_OK)
{
if (m_animationCtrl->LoadFile(filename))
m_animationCtrl->Play();
else
- wxMessageBox(_T("Sorry, this animation is not a valid format for wxAnimation."));
+ wxMessageBox(wxT("Sorry, this animation is not a valid format for wxAnimation."));
#else
#if 0
wxAnimation temp;
m_animationCtrl->Play();
#endif
#endif
+
+ GetSizer()->Layout();
}
}
#endif // wxUSE_FILEDLG
{
GetMenuBar()->FindItem(wxID_STOP)->Enable(m_animationCtrl->IsPlaying());
GetMenuBar()->FindItem(ID_PLAY)->Enable(!m_animationCtrl->IsPlaying());
+ GetMenuBar()->FindItem(ID_SET_NO_AUTO_RESIZE)->Enable(!m_animationCtrl->IsPlaying());
}
-// ---------------------------------------------------------------------------
-// MyCanvas
-// ---------------------------------------------------------------------------
-
-BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
- //EVT_PAINT(MyCanvas::OnPaint)
-END_EVENT_TABLE()
-
-// Define a constructor for my canvas
-MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size)
- : wxScrolledWindow(parent, -1, pos, size,
- wxSUNKEN_BORDER |
- wxNO_FULL_REPAINT_ON_RESIZE |
- wxVSCROLL | wxHSCROLL)
-{
- SetBackgroundColour(wxColour(_T("YELLOW")));
-}
-
-void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
-{
- //wxPaintDC dc(this);
-
- //dc.DrawRotatedText(wxT("Background"),
-}