]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/mdi.cpp
check that the version of __sync_sub_and_fetch that returns a value is supported...
[wxWidgets.git] / src / msw / mdi.cpp
index 9d39671a99bf6939927cff333823c5ce9fac0e64..6300654e8f878038b84d14a0280d5c573e5458a5 100644 (file)
 
 #if wxUSE_MDI && !defined(__WXUNIVERSAL__)
 
 
 #if wxUSE_MDI && !defined(__WXUNIVERSAL__)
 
+#include "wx/mdi.h"
+
 #ifndef WX_PRECOMP
     #include "wx/frame.h"
     #include "wx/menu.h"
     #include "wx/app.h"
     #include "wx/utils.h"
     #include "wx/dialog.h"
 #ifndef WX_PRECOMP
     #include "wx/frame.h"
     #include "wx/menu.h"
     #include "wx/app.h"
     #include "wx/utils.h"
     #include "wx/dialog.h"
-    #if wxUSE_STATUSBAR
-        #include "wx/statusbr.h"
-    #endif
+    #include "wx/statusbr.h"
     #include "wx/settings.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/settings.h"
     #include "wx/intl.h"
     #include "wx/log.h"
@@ -42,7 +42,6 @@
 #endif
 
 #include "wx/stockitem.h"
 #endif
 
 #include "wx/stockitem.h"
-#include "wx/mdi.h"
 #include "wx/msw/private.h"
 
 #if wxUSE_STATUSBAR && wxUSE_NATIVE_STATUSBAR
 #include "wx/msw/private.h"
 
 #if wxUSE_STATUSBAR && wxUSE_NATIVE_STATUSBAR
@@ -200,7 +199,7 @@ bool wxMDIParentFrame::Create(wxWindow *parent,
   msflags &= ~WS_HSCROLL;
 
   if ( !wxWindow::MSWCreate(wxMDIFrameClassName,
   msflags &= ~WS_HSCROLL;
 
   if ( !wxWindow::MSWCreate(wxMDIFrameClassName,
-                            title,
+                            title.wx_str(),
                             pos, size,
                             msflags,
                             exflags) )
                             pos, size,
                             msflags,
                             exflags) )
@@ -316,6 +315,17 @@ void wxMDIParentFrame::DoMenuUpdates(wxMenu* menu)
     }
 }
 
     }
 }
 
+const wxMenuItem *wxMDIParentFrame::FindItemInMenuBar(int menuId) const
+{
+    const wxMenuItem *item = wxFrame::FindItemInMenuBar(menuId);
+    if ( !item && m_currentChild )
+    {
+        item = m_currentChild->FindItemInMenuBar(menuId);
+    }
+
+    return item;
+}
+
 void wxMDIParentFrame::UpdateClientSize()
 {
     if ( GetClientWindow() )
 void wxMDIParentFrame::UpdateClientSize()
 {
     if ( GetClientWindow() )
@@ -476,24 +486,6 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message,
             rc = true;
             break;
 
             rc = true;
             break;
 
-        case WM_MENUSELECT:
-            {
-                WXWORD item, flags;
-                WXHMENU hmenu;
-                UnpackMenuSelect(wParam, lParam, &item, &flags, &hmenu);
-
-                if ( m_parentFrameActive )
-                {
-                    processed = HandleMenuSelect(item, flags, hmenu);
-                }
-                else if (m_currentChild)
-                {
-                    processed = m_currentChild->
-                        HandleMenuSelect(item, flags, hmenu);
-                }
-            }
-            break;
-
         case WM_SIZE:
             // though we don't (usually) resize the MDI client to exactly fit the
             // client area we need to pass this one to DefFrameProc to allow the children to show
         case WM_SIZE:
             // though we don't (usually) resize the MDI client to exactly fit the
             // client area we need to pass this one to DefFrameProc to allow the children to show
@@ -523,7 +515,7 @@ bool wxMDIParentFrame::HandleActivate(int state, bool minimized, WXHWND activate
     {
         wxActivateEvent event(wxEVT_ACTIVATE, true, m_currentChild->GetId());
         event.SetEventObject( m_currentChild );
     {
         wxActivateEvent event(wxEVT_ACTIVATE, true, m_currentChild->GetId());
         event.SetEventObject( m_currentChild );
-        if ( m_currentChild->GetEventHandler()->ProcessEvent(event) )
+        if ( m_currentChild->HandleWindowEvent(event) )
             processed = true;
     }
 
             processed = true;
     }
 
@@ -609,8 +601,8 @@ bool wxMDIParentFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND hwnd)
             wxWindow *child = node->GetData();
             if ( child->GetHWND() )
             {
             wxWindow *child = node->GetData();
             if ( child->GetHWND() )
             {
-                long childId = wxGetWindowId(child->GetHWND());
-                if (childId == (long)id)
+                int childId = wxGetWindowId(child->GetHWND());
+                if ( childId == (signed short)id )
                 {
                     ::SendMessage( GetWinHwnd(GetClientWindow()),
                                    WM_MDIACTIVATE,
                 {
                     ::SendMessage( GetWinHwnd(GetClientWindow()),
                                    WM_MDIACTIVATE,
@@ -719,7 +711,7 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
   mcs.szClass = style & wxFULL_REPAINT_ON_RESIZE
                     ? wxMDIChildFrameClassName
                     : wxMDIChildFrameClassNameNoRedraw;
   mcs.szClass = style & wxFULL_REPAINT_ON_RESIZE
                     ? wxMDIChildFrameClassName
                     : wxMDIChildFrameClassNameNoRedraw;
-  mcs.szTitle = title;
+  mcs.szTitle = title.wx_str();
   mcs.hOwner = wxGetInstance();
   if (x != wxDefaultCoord)
       mcs.x = x;
   mcs.hOwner = wxGetInstance();
   if (x != wxDefaultCoord)
       mcs.x = x;
@@ -779,6 +771,10 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
 
 wxMDIChildFrame::~wxMDIChildFrame()
 {
 
 wxMDIChildFrame::~wxMDIChildFrame()
 {
+    // if we hadn't been created, there is nothing to destroy
+    if ( !m_hWnd )
+        return;
+
     // will be destroyed by DestroyChildren() but reset them before calling it
     // to avoid using dangling pointers if a callback comes in the meanwhile
 #if wxUSE_TOOLBAR
     // will be destroyed by DestroyChildren() but reset them before calling it
     // to avoid using dangling pointers if a callback comes in the meanwhile
 #if wxUSE_TOOLBAR
@@ -857,9 +853,24 @@ void wxMDIChildFrame::DoSetClientSize(int width, int height)
   wxSize size(width, height);
   wxSizeEvent event(size, m_windowId);
   event.SetEventObject( this );
   wxSize size(width, height);
   wxSizeEvent event(size, m_windowId);
   event.SetEventObject( this );
-  GetEventHandler()->ProcessEvent(event);
+  HandleWindowEvent(event);
+}
+
+// Unlike other wxTopLevelWindowBase, the mdi child's "GetPosition" is not the
+//  same as its GetScreenPosition
+void wxMDIChildFrame::DoGetScreenPosition(int *x, int *y) const
+{
+  HWND hWnd = GetHwnd();
+
+  RECT rect;
+  ::GetWindowRect(hWnd, &rect);
+  if (x)
+     *x = rect.left;
+  if (y)
+     *y = rect.top;
 }
 
 }
 
+
 void wxMDIChildFrame::DoGetPosition(int *x, int *y) const
 {
   RECT rect;
 void wxMDIChildFrame::DoGetPosition(int *x, int *y) const
 {
   RECT rect;
@@ -1092,7 +1103,7 @@ bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate),
 
     ResetWindowStyle((void *)NULL);
 
 
     ResetWindowStyle((void *)NULL);
 
-    return GetEventHandler()->ProcessEvent(event);
+    return HandleWindowEvent(event);
 }
 
 bool wxMDIChildFrame::HandleWindowPosChanging(void *pos)
 }
 
 bool wxMDIChildFrame::HandleWindowPosChanging(void *pos)
@@ -1377,7 +1388,11 @@ static void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow)
                             (WPARAM)hmenuFrame,
                             (LPARAM)hmenuWindow) )
         {
                             (WPARAM)hmenuFrame,
                             (LPARAM)hmenuWindow) )
         {
-            wxLogLastError(_T("SendMessage(WM_MDISETMENU)"));
+#ifdef __WXDEBUG__
+            DWORD err = ::GetLastError();
+            if ( err )
+                wxLogApiError(_T("SendMessage(WM_MDISETMENU)"), err);
+#endif // __WXDEBUG__
         }
     }
 
         }
     }
 
@@ -1415,14 +1430,14 @@ static void InsertWindowMenu(wxWindow *win, WXHMENU menu, HMENU subMenu)
             {
                 success = true;
                 ::InsertMenu(hmenu, i, MF_BYPOSITION | MF_POPUP | MF_STRING,
             {
                 success = true;
                 ::InsertMenu(hmenu, i, MF_BYPOSITION | MF_POPUP | MF_STRING,
-                             (UINT)subMenu, _("&Window"));
+                             (UINT)subMenu, _("&Window").wx_str());
                 break;
             }
         }
 
         if ( !success )
         {
                 break;
             }
         }
 
         if ( !success )
         {
-            ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, _("&Window"));
+            ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, _("&Window").wx_str());
         }
     }
 
         }
     }