virtual bool OnInit();
};
+class MyWizard;
class MyFrame : public wxFrame
{
public:
void OnWizardCancel(wxWizardEvent& event);
void OnWizardFinished(wxWizardEvent& event);
+ // Only required for modeless wizards, to implement destruction;
+ // if using modal wizards, you can rely on the default behaviour.
+ void OnCancel(wxCommandEvent& event);
private:
// any class wishing to process wxWidgets events must use this macro
DECLARE_EVENT_TABLE()
+
+ MyWizard* m_wizard;
};
// ----------------------------------------------------------------------------
{
public:
MyWizard(wxFrame *frame);
+
void RunIt(bool modal);
+ // Is the wizard being invoked modally?
+ bool GetModalWizard() const { return m_isModal; }
+
private:
wxWizardPageSimple *m_page1;
+ bool m_isModal;
};
// ----------------------------------------------------------------------------
EVT_WIZARD_CANCEL(wxID_ANY, MyFrame::OnWizardCancel)
EVT_WIZARD_FINISHED(wxID_ANY, MyFrame::OnWizardFinished)
+
+ EVT_BUTTON(wxID_CANCEL, MyFrame::OnCancel)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxRadioboxPage, wxWizardPageSimple)
// ----------------------------------------------------------------------------
// MyWizard
// ----------------------------------------------------------------------------
-
+
MyWizard::MyWizard(wxFrame *frame)
:wxWizard(frame,wxID_ANY,_T("Absolutely Useless Wizard"),
wxBitmap(wiztest_xpm),wxDefaultPosition,
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
+ m_isModal = false;
+
// a wizard page may be either an object of predefined class
m_page1 = new wxWizardPageSimple(this);
void MyWizard::RunIt(bool modal)
{
+ m_isModal = modal;
if ( modal )
{
if ( RunWizard(m_page1) )
{
- wxMessageBox(_T("The wizard successfully completed"), _T("That's all"),
- wxICON_INFORMATION | wxOK);
+ // Success
}
Destroy();
:wxFrame((wxFrame *)NULL, wxID_ANY, title,
wxDefaultPosition, wxSize(250, 150)) // small frame
{
+ m_wizard = NULL;
+
wxMenu *menuFile = new wxMenu;
menuFile->Append(Wizard_RunModal, _T("&Run wizard modal...\tCtrl-R"));
menuFile->Append(Wizard_RunModeless, _T("&Run wizard modeless..."));
void MyFrame::OnRunWizard(wxCommandEvent& event)
{
- MyWizard *wizard = new MyWizard(this);
+ m_wizard = new MyWizard(this);
- wizard->RunIt( event.GetId() == Wizard_RunModal );
+ m_wizard->RunIt( event.GetId() == Wizard_RunModal );
}
void MyFrame::OnWizardFinished(wxWizardEvent& WXUNUSED(event))
{
+ if (!m_wizard->GetModalWizard())
+ m_wizard->Destroy();
+ m_wizard = NULL;
+
wxMessageBox(wxT("The wizard finished successfully."), wxT("Wizard notification"));
}
{
wxMessageBox(wxT("The wizard was cancelled."), wxT("Wizard notification"));
}
+
+void MyFrame::OnCancel(wxCommandEvent& WXUNUSED(event))
+{
+ // Destroy a modeless wizard here - we can't destroy it in OnWizardCancel
+ // since the wxWizard object is still in use when that event is sent.
+
+ if (!m_wizard->GetModalWizard())
+ m_wizard->Destroy();
+ else
+ m_wizard->EndModal(wxID_CANCEL);
+
+ m_wizard = NULL;
+}