]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/mdi/mdi.cpp
Don't use GetThreadId() in wxMSW code.
[wxWidgets.git] / samples / mdi / mdi.cpp
index e4b581a2c42a6882c79b13dc8c047d1c57c0b65b..c65e285682fa48d1ef3b750c45989a3a0a67f29b 100644 (file)
@@ -7,7 +7,7 @@
 // RCS-ID:      $Id$
 // Copyright:   (c) 1997 Julian Smart
 //              (c) 2008 Vadim Zeitlin
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ===========================================================================
@@ -32,7 +32,7 @@
 
 #include "wx/toolbar.h"
 
-#if !defined(__WXMSW__)
+#ifndef wxHAS_IMAGES_IN_RESOURCES
     #include "../sample.xpm"
     #include "chart.xpm"
 #endif
@@ -99,6 +99,10 @@ BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
     EVT_MOUSE_EVENTS(MyCanvas::OnEvent)
 END_EVENT_TABLE()
 
+BEGIN_EVENT_TABLE(MyChild::EventHandler, wxEvtHandler)
+    EVT_MENU(MDI_REFRESH, MyChild::EventHandler::OnRefresh)
+END_EVENT_TABLE()
+
 // ===========================================================================
 // implementation
 // ===========================================================================
@@ -135,22 +139,8 @@ MyFrame::MyFrame()
 
     // Make a menubar
 #if wxUSE_MENUS
-    wxMenu *file_menu = new wxMenu;
-
-    file_menu->Append(wxID_NEW, "&New window\tCtrl-N", "Create a new child window");
-    file_menu->AppendCheckItem(MDI_FULLSCREEN, "Show &fullscreen\tCtrl-F");
-    file_menu->Append(wxID_EXIT, "&Exit\tAlt-X", "Quit the program");
-
-    wxMenu *help_menu = new wxMenu;
-    help_menu->Append(wxID_ABOUT, "&About\tF1");
-
-    wxMenuBar *menu_bar = new wxMenuBar;
-
-    menu_bar->Append(file_menu, "&File");
-    menu_bar->Append(help_menu, "&Help");
-
     // Associate the menu bar with the frame
-    SetMenuBar(menu_bar);
+    SetMenuBar(CreateMainMenubar());
 
 
     // This shows that the standard window menu may be customized:
@@ -216,6 +206,27 @@ MyFrame::~MyFrame()
     Disconnect(wxEVT_SIZE, wxSizeEventHandler(MyFrame::OnSize));
 }
 
+#if wxUSE_MENUS
+/* static */
+wxMenuBar *MyFrame::CreateMainMenubar()
+{
+    wxMenu *menuFile = new wxMenu;
+
+    menuFile->Append(wxID_NEW, "&New window\tCtrl-N", "Create a new child window");
+    menuFile->AppendCheckItem(MDI_FULLSCREEN, "Show &full screen\tCtrl-F");
+    menuFile->Append(wxID_EXIT, "&Exit\tAlt-X", "Quit the program");
+
+    wxMenu *menuHelp = new wxMenu;
+    menuHelp->Append(wxID_ABOUT, "&About\tF1");
+
+    wxMenuBar *mbar = new wxMenuBar;
+    mbar->Append(menuFile, "&File");
+    mbar->Append(menuHelp, "&Help");
+
+    return mbar;
+}
+#endif // wxUSE_MENUS
+
 void MyFrame::OnClose(wxCloseEvent& event)
 {
     unsigned numChildren = MyChild::GetChildrenCount();
@@ -329,7 +340,7 @@ MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size)
                            wxNO_FULL_REPAINT_ON_RESIZE |
                            wxVSCROLL | wxHSCROLL)
 {
-    SetBackgroundColour(wxColour("WHITE"));
+    SetBackgroundColour(*wxWHITE);
     SetCursor(wxCursor(wxCURSOR_PENCIL));
 
     SetScrollbars(20, 20, 50, 50);
@@ -412,53 +423,48 @@ MyChild::MyChild(wxMDIParentFrame *parent)
 
     const bool canBeResized = !IsAlwaysMaximized();
 
-    // create our menubar: it will be shown instead of the main frame one when
+    // create our menu bar: it will be shown instead of the main frame one when
     // we're active
 #if wxUSE_MENUS
-    // Make a menubar
-    wxMenu *file_menu = new wxMenu;
+    wxMenuBar *mbar = MyFrame::CreateMainMenubar();
+    mbar->GetMenu(0)->Insert(1, wxID_CLOSE, "&Close child\tCtrl-W",
+                             "Close this window");
 
-    file_menu->Append(wxID_NEW, "&New window\tCtrl-N");
-    file_menu->Append(wxID_CLOSE, "&Close child\tCtrl-W", "Close this window");
-    file_menu->AppendCheckItem(MDI_FULLSCREEN, "Show &fullscreen\tCtrl-F");
-    file_menu->Append(wxID_EXIT, "&Exit\tAlt-X", "Quit the program");
+    wxMenu *menuChild = new wxMenu;
 
-    wxMenu *option_menu = new wxMenu;
-
-    option_menu->Append(MDI_REFRESH, "&Refresh picture");
-    option_menu->Append(MDI_CHANGE_TITLE, "Change &title...\tCtrl-T");
+    menuChild->Append(MDI_REFRESH, "&Refresh picture");
+    menuChild->Append(MDI_CHANGE_TITLE, "Change &title...\tCtrl-T");
     if ( canBeResized )
     {
-        option_menu->AppendSeparator();
-        option_menu->Append(MDI_CHANGE_POSITION, "Move frame\tCtrl-M");
-        option_menu->Append(MDI_CHANGE_SIZE, "Resize frame\tCtrl-S");
+        menuChild->AppendSeparator();
+        menuChild->Append(MDI_CHANGE_POSITION, "Move frame\tCtrl-M");
+        menuChild->Append(MDI_CHANGE_SIZE, "Resize frame\tCtrl-S");
     }
 #if wxUSE_CLIPBOARD
-    option_menu->AppendSeparator();
-    option_menu->Append(wxID_PASTE, "Copy text from clipboard\tCtrl-V");
+    menuChild->AppendSeparator();
+    menuChild->Append(wxID_PASTE, "Copy text from clipboard\tCtrl-V");
 #endif // wxUSE_CLIPBOARD
 
-    wxMenu *help_menu = new wxMenu;
-    help_menu->Append(wxID_ABOUT, "&About");
-
-    wxMenuBar *menu_bar = new wxMenuBar;
-
-    menu_bar->Append(file_menu, "&File");
-    menu_bar->Append(option_menu, "&Child");
-    menu_bar->Append(help_menu, "&Help");
+    mbar->Insert(1, menuChild, "&Child");
 
     // Associate the menu bar with the frame
-    SetMenuBar(menu_bar);
+    SetMenuBar(mbar);
 #endif // wxUSE_MENUS
 
     // this should work for MDI frames as well as for normal ones, provided
     // they can be resized at all
     if ( canBeResized )
         SetSizeHints(100, 100);
+
+    // test that event handlers pushed on top of MDI children do work (this
+    // used to be broken, see #11225)
+    PushEventHandler(new EventHandler(ms_numChildren));
 }
 
 MyChild::~MyChild()
 {
+    PopEventHandler(true);
+
     ms_numChildren--;
 }