#include <wx/wx.h>

class MyApp : public wxApp {  // Declare the application class
public:
   virtual bool OnInit(); // Called on application startup
};

class MyFrame : public wxFrame { // Declare our main frame class
public:
   MyFrame(const wxString& title); // Constructor
// Event handlers
   void OnQuit(wxCommandEvent& event);
   void OnAbout(wxCommandEvent& event);
private:
   DECLARE_EVENT_TABLE() // This class handles events
};

DECLARE_APP(MyApp) // Implements MyApp& GetApp()

IMPLEMENT_APP(MyApp) // Give wxWidgets the means to create a MyApp object

bool MyApp::OnInit() { // Initialize the application
   // Create the main application window
   MyFrame *frame = new MyFrame( wxT( "Minimal wxWidgets App" ) );
   frame->Show(true); // Show it
   return true; // Start the event loop
}

// Event table for MyFrame
BEGIN_EVENT_TABLE( MyFrame, wxFrame )
EVT_MENU( wxID_ABOUT, MyFrame::OnAbout )
EVT_MENU( wxID_EXIT, MyFrame::OnQuit )
END_EVENT_TABLE()

void MyFrame::OnAbout( wxCommandEvent& event ) {
   wxString msg;
   msg.Printf(wxT("Hello and welcome to %s"), wxVERSION_STRING);
   wxMessageBox(msg, wxT("About Minimal"), wxOK | wxICON_INFORMATION, this);
}

void MyFrame::OnQuit(wxCommandEvent& event) {
   // Destroy the frame
   Close();
}

MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title) {
   // Create a menu bar
   wxMenu *fileMenu = new wxMenu;
   // The "About” item should be in the help menu
   wxMenu *helpMenu = new wxMenu;
   helpMenu->Append(wxID_ABOUT, wxT("&About…\tF1"),
   wxT("Show about dialog"));
   fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"),
   wxT("Quit this program"));
   // Now append the freshly created menu to the menu bar…
   wxMenuBar *menuBar = new wxMenuBar();
   menuBar->Append(fileMenu, wxT("&File"));
   menuBar->Append(helpMenu, wxT("&Help"));
   // … and attach this menu bar to the frame
   SetMenuBar(menuBar);
   // Create a status bar just for fun
   CreateStatusBar(2);
   SetStatusText(wxT("Welcome to wxWidgets!"));
}
