]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/mdi.cpp
patches for wxSTIPPLE_MASK_OPAQUE from Klass Holwerda
[wxWidgets.git] / src / msw / mdi.cpp
index 0a434266202269f3d0ca2febc1475649b834a430..342366110f2ccf36c512e79be4a5c38ce5125797 100644 (file)
@@ -35,7 +35,9 @@
     #include "wx/app.h"
     #include "wx/utils.h"
     #include "wx/dialog.h"
-    #include "wx/statusbr.h"
+    #if wxUSE_STATUSBAR
+        #include "wx/statusbr.h"
+    #endif
     #include "wx/settings.h"
     #include "wx/intl.h"
     #include "wx/log.h"
 #include "wx/mdi.h"
 #include "wx/msw/private.h"
 
-#if wxUSE_NATIVE_STATUSBAR
-    #include <wx/msw/statbr95.h>
+#if wxUSE_STATUSBAR && wxUSE_NATIVE_STATUSBAR
+    #include "wx/msw/statbr95.h"
 #endif
 
+#if wxUSE_TOOLBAR
+    #include "wx/toolbar.h"
+#endif // wxUSE_TOOLBAR
+
 #include <string.h>
 
 // ---------------------------------------------------------------------------
 extern wxWindowList wxModelessWindows;      // from dialog.cpp
 extern wxMenu *wxCurrentPopupMenu;
 
-extern wxChar wxMDIFrameClassName[];
-extern wxChar wxMDIChildFrameClassName[];
+extern const wxChar *wxMDIFrameClassName;
+extern const wxChar *wxMDIChildFrameClassName;
 extern wxWindow *wxWndHook;                 // from window.cpp
 
-extern wxList *wxWinHandleList;
+extern void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win);
 
 static HWND invalidHandle = 0;
 
@@ -113,11 +119,9 @@ static void UnpackMDIActivate(WXWPARAM wParam, WXLPARAM lParam,
 // wxWin macros
 // ---------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
     IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame, wxFrame)
     IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame, wxFrame)
     IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxWindow)
-#endif // USE_SHARED_LIBRARY
 
 BEGIN_EVENT_TABLE(wxMDIParentFrame, wxFrame)
     EVT_SIZE(wxMDIParentFrame::OnSize)
@@ -174,7 +178,7 @@ bool wxMDIParentFrame::Create(wxWindow *parent,
   int width = size.x;
   int height = size.y;
 
-  m_windowMenu = (WXHMENU) ::LoadMenu(wxGetInstance(), _T("wxWindowMenu"));
+  m_windowMenu = (WXHMENU) ::LoadMenu(wxGetInstance(), wxT("wxWindowMenu"));
 
   DWORD msflags = WS_OVERLAPPED;
   if (style & wxMINIMIZE_BOX)
@@ -192,10 +196,8 @@ bool wxMDIParentFrame::Create(wxWindow *parent,
   if (style & wxCAPTION)
     msflags |= WS_CAPTION;
 
-  // Adding WS_CLIPCHILDREN causes children not to be properly
-  // drawn when first displaying them.
-//  if (style & wxCLIP_CHILDREN)
-//    msflags |= WS_CLIPCHILDREN;
+  if (style & wxCLIP_CHILDREN)
+    msflags |= WS_CLIPCHILDREN;
 
   wxWindow::MSWCreate(m_windowId, parent, wxMDIFrameClassName, this, title, x, y, width, height,
          msflags);
@@ -208,6 +210,8 @@ bool wxMDIParentFrame::Create(wxWindow *parent,
 wxMDIParentFrame::~wxMDIParentFrame()
 {
     DestroyChildren();
+    // already delete by DestroyChildren()
+    m_frameToolBar = NULL;
 
     ::DestroyMenu((HMENU)m_windowMenu);
     m_windowMenu = 0;
@@ -383,9 +387,9 @@ long wxMDIParentFrame::MSWWindowProc(WXUINT message,
             break;
 
         case WM_SIZE:
-            // we will leave this message to the base class version, but we
-            // must pass it to DefFrameProc() too
-            MSWDefWindowProc(message, wParam, lParam);
+            // as we don't (usually) resize the MDI client to exactly fit the
+            // client area (we put it below the toolbar, above statusbar &c),
+            // we should not pass this one to DefFrameProc
             break;
     }
 
@@ -484,7 +488,7 @@ bool wxMDIParentFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND hwnd)
             if ( child->GetHWND() )
             {
                 long childId = wxGetWindowId(child->GetHWND());
-                if (childId == id)
+                if (childId == (long)id)
                 {
                     ::SendMessage( GetWinHwnd(GetClientWindow()),
                                    WM_MDIACTIVATE,
@@ -507,7 +511,7 @@ bool wxMDIParentFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND hwnd)
     {
         // this shouldn't happen because it means that our messages are being
         // lost (they're not sent to the parent frame nor to the children)
-        wxFAIL_MSG(_T("MDI parent frame is not active, "
+        wxFAIL_MSG(wxT("MDI parent frame is not active, "
                       "yet there is no active MDI child?"));
     }
 
@@ -537,10 +541,7 @@ bool wxMDIParentFrame::MSWTranslateMessage(WXMSG* msg)
         return TRUE;
     }
 
-    if ( m_acceleratorTable.Ok() &&
-         ::TranslateAccelerator(GetHwnd(),
-                                GetTableHaccel(m_acceleratorTable),
-                                pMsg) )
+    if ( m_acceleratorTable.Translate(this, msg) )
     {
         return TRUE;
     }
@@ -645,7 +646,7 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
   m_hWnd = (WXHWND)Return;
 
   wxWndHook = NULL;
-  wxWinHandleList->Append((long)GetHWND(), this);
+  wxAssociateWinWithHandle((HWND) GetHWND(), this);
 
   // VZ: what's this? an act of piracy?
   //SetWindowLong(GetHwnd(), 0, (long)this);
@@ -732,25 +733,35 @@ void wxMDIChildFrame::InternalSetMenuBar()
 // MDI operations
 // ---------------------------------------------------------------------------
 
-void wxMDIChildFrame::Maximize()
+void wxMDIChildFrame::Maximize(bool maximize)
 {
     wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
     if ( parent && parent->GetClientWindow() )
-        ::SendMessage(GetWinHwnd(parent->GetClientWindow()), WM_MDIMAXIMIZE, (WPARAM) GetHwnd(), 0);
+    {
+        ::SendMessage(GetWinHwnd(parent->GetClientWindow()),
+                      maximize ? WM_MDIMAXIMIZE : WM_MDIRESTORE,
+                      (WPARAM)GetHwnd(), 0);
+    }
 }
 
 void wxMDIChildFrame::Restore()
 {
     wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
     if ( parent && parent->GetClientWindow() )
-        ::SendMessage(GetWinHwnd(parent->GetClientWindow()), WM_MDIRESTORE, (WPARAM) GetHwnd(), 0);
+    {
+        ::SendMessage(GetWinHwnd(parent->GetClientWindow()), WM_MDIRESTORE,
+                      (WPARAM) GetHwnd(), 0);
+    }
 }
 
 void wxMDIChildFrame::Activate()
 {
     wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
     if ( parent && parent->GetClientWindow() )
-        ::SendMessage(GetWinHwnd(parent->GetClientWindow()), WM_MDIACTIVATE, (WPARAM) GetHwnd(), 0);
+    {
+        ::SendMessage(GetWinHwnd(parent->GetClientWindow()), WM_MDIACTIVATE,
+                      (WPARAM) GetHwnd(), 0);
+    }
 }
 
 // ---------------------------------------------------------------------------
@@ -884,7 +895,7 @@ bool wxMDIChildFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND hwnd)
             return TRUE;
     }
 
-    if (GetMenuBar() && GetMenuBar()->FindItemForId(id))
+    if (GetMenuBar() && GetMenuBar()->FindItem(id))
     {
         ProcessCommand(id);
         return TRUE;
@@ -921,7 +932,7 @@ bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate),
     else if ( m_hWnd == hwndDeact )
     {
         wxASSERT_MSG( parent->m_currentChild == this,
-                      _T("can't deactivate MDI child which wasn't active!") );
+                      wxT("can't deactivate MDI child which wasn't active!") );
 
         activated = FALSE;
         parent->m_currentChild = NULL;
@@ -993,15 +1004,7 @@ long wxMDIChildFrame::MSWDefWindowProc(WXUINT message, WXUINT wParam, WXLPARAM l
 
 bool wxMDIChildFrame::MSWTranslateMessage(WXMSG* msg)
 {
-    MSG *pMsg = (MSG *)msg;
-    if ( m_acceleratorTable.Ok() )
-    {
-        return ::TranslateAccelerator(GetWinHwnd(GetParent()),
-                                      GetTableHaccel(m_acceleratorTable),
-                                      pMsg) != 0;
-    }
-
-    return FALSE;
+    return m_acceleratorTable.Translate(GetParent(), msg);
 }
 
 // ---------------------------------------------------------------------------
@@ -1102,7 +1105,7 @@ bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style)
     m_hWnd = (WXHWND)::CreateWindowEx
                        (
                         exStyle,
-                        _T("MDICLIENT"),
+                        wxT("MDICLIENT"),
                         NULL,
                         msStyle,
                         0, 0, 0, 0,
@@ -1155,7 +1158,7 @@ static void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow)
 
     // update menu bar of the parent window
     wxWindow *parent = win->GetParent();
-    wxCHECK_RET( parent, _T("MDI client without parent frame? weird...") );
+    wxCHECK_RET( parent, wxT("MDI client without parent frame? weird...") );
 
     ::DrawMenuBar(GetWinHwnd(parent));
 }
@@ -1172,23 +1175,23 @@ static void InsertWindowMenu(wxWindow *win, WXHMENU menu, HMENU subMenu)
         int chars = GetMenuString(hmenu, i, buf, WXSIZEOF(buf), MF_BYPOSITION);
         if ( chars == 0 )
         {
-            wxLogLastError(_T("GetMenuString"));
+            wxLogLastError(wxT("GetMenuString"));
 
             continue;
         }
 
-        if ( wxStripMenuCodes(wxString(buf)).IsSameAs(_T("Help")) )
+        if ( wxStripMenuCodes(wxString(buf)).IsSameAs(wxT("Help")) )
         {
             success = TRUE;
             ::InsertMenu(hmenu, i, MF_BYPOSITION | MF_POPUP | MF_STRING,
-                         (UINT)subMenu, _T("&Window"));
+                         (UINT)subMenu, wxT("&Window"));
             break;
         }
     }
 
     if ( !success )
     {
-        ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, _T("&Window"));
+        ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, wxT("&Window"));
     }
 
     MDISetMenu(win, hmenu, subMenu);