]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/mdi.cpp
fixed somebody's poorly done StreamSize-->GetSize transition
[wxWidgets.git] / src / msw / mdi.cpp
index eb34e34f23b705c4d02b32968de1de1f06d1e012..381c6d04569e933908fa96aa8918d71d71c44546 100644 (file)
@@ -37,6 +37,8 @@
     #include "wx/dialog.h"
     #include "wx/statusbr.h"
     #include "wx/settings.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
 #endif
 
 #include "wx/mdi.h"
@@ -55,8 +57,8 @@
 extern wxWindowList wxModelessWindows;      // from dialog.cpp
 extern wxMenu *wxCurrentPopupMenu;
 
-extern char wxMDIFrameClassName[];
-extern char wxMDIChildFrameClassName[];
+extern wxChar wxMDIFrameClassName[];
+extern wxChar wxMDIChildFrameClassName[];
 extern wxWindow *wxWndHook;                 // from window.cpp
 
 extern wxList *wxWinHandleList;
@@ -100,8 +102,8 @@ inline bool IsMdiCommandId(int id)
     return (id >= wxFIRST_MDI_CHILD) && (id <= wxLAST_MDI_CHILD);
 }
 
-static UnpackMDIActivate(WXWPARAM wParam, WXLPARAM lParam,
-                         WXWORD *activate, WXHWND *hwndAct, WXHWND *hwndDeact);
+static void UnpackMDIActivate(WXWPARAM wParam, WXLPARAM lParam,
+                              WXWORD *activate, WXHWND *hwndAct, WXHWND *hwndDeact);
 
 // ===========================================================================
 // implementation
@@ -172,7 +174,7 @@ bool wxMDIParentFrame::Create(wxWindow *parent,
   int width = size.x;
   int height = size.y;
 
-  m_windowMenu = (WXHMENU) ::LoadMenu(wxGetInstance(), "wxWindowMenu");
+  m_windowMenu = (WXHMENU) ::LoadMenu(wxGetInstance(), _T("wxWindowMenu"));
 
   DWORD msflags = WS_OVERLAPPED;
   if (style & wxMINIMIZE_BOX)
@@ -190,10 +192,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);
@@ -336,6 +336,10 @@ long wxMDIParentFrame::MSWWindowProc(WXUINT message,
                 // so pretend we processed the message anyhow
                 processed = TRUE;
             }
+
+            // always pass this message DefFrameProc(), otherwise MDI menu
+            // commands (and sys commands - more surprizingly!) won't work
+            MSWDefWindowProc(message, wParam, lParam);
             break;
 
         case WM_CREATE:
@@ -375,6 +379,12 @@ long wxMDIParentFrame::MSWWindowProc(WXUINT message,
                 }
             }
             break;
+
+        case WM_SIZE:
+            // 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;
     }
 
     if ( !processed )
@@ -525,10 +535,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;
     }
@@ -625,20 +632,18 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
 
   mcs.lParam = 0;
 
-  DWORD Return = SendMessage((HWND) parent->GetClientWindow()->GetHWND(),
-        WM_MDICREATE, 0, (LONG)(LPSTR)&mcs);
+  DWORD Return = SendMessage(GetWinHwnd(parent->GetClientWindow()),
+                             WM_MDICREATE, 0, (LONG)(LPSTR)&mcs);
 
   //handle = (HWND)LOWORD(Return);
   // Must be the DWORRD for WIN32. And in 16 bits, HIWORD=0 (says Microsoft)
   m_hWnd = (WXHWND)Return;
 
-  // This gets reassigned so can't be stored
-//  m_windowId = GetWindowLong((HWND) m_hWnd, GWL_ID);
-
   wxWndHook = NULL;
   wxWinHandleList->Append((long)GetHWND(), this);
 
-  SetWindowLong((HWND) GetHWND(), 0, (long)this);
+  // VZ: what's this? an act of piracy?
+  //SetWindowLong(GetHwnd(), 0, (long)this);
 
   wxModelessWindows.Append(this);
   return TRUE;
@@ -653,7 +658,7 @@ wxMDIChildFrame::~wxMDIChildFrame()
 // to wxWindows)
 void wxMDIChildFrame::DoSetClientSize(int width, int height)
 {
-  HWND hWnd = (HWND) GetHWND();
+  HWND hWnd = GetHwnd();
 
   RECT rect;
   ::GetClientRect(hWnd, &rect);
@@ -693,7 +698,7 @@ void wxMDIChildFrame::DoSetClientSize(int width, int height)
 void wxMDIChildFrame::DoGetPosition(int *x, int *y) const
 {
   RECT rect;
-  GetWindowRect((HWND) GetHWND(), &rect);
+  GetWindowRect(GetHwnd(), &rect);
   POINT point;
   point.x = rect.left;
   point.y = rect.top;
@@ -722,25 +727,35 @@ void wxMDIChildFrame::InternalSetMenuBar()
 // MDI operations
 // ---------------------------------------------------------------------------
 
-void wxMDIChildFrame::Maximize()
+void wxMDIChildFrame::Maximize(bool maximize)
 {
     wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
     if ( parent && parent->GetClientWindow() )
-        ::SendMessage( (HWND) parent->GetClientWindow()->GetHWND(), WM_MDIMAXIMIZE, (WPARAM) (HWND) 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( (HWND) parent->GetClientWindow()->GetHWND(), WM_MDIRESTORE, (WPARAM) (HWND) GetHWND(), 0);
+    {
+        ::SendMessage(GetWinHwnd(parent->GetClientWindow()), WM_MDIRESTORE,
+                      (WPARAM) GetHwnd(), 0);
+    }
 }
 
 void wxMDIChildFrame::Activate()
 {
     wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
     if ( parent && parent->GetClientWindow() )
-        ::SendMessage( (HWND) parent->GetClientWindow()->GetHWND(), WM_MDIACTIVATE, (WPARAM) (HWND) GetHWND(), 0);
+    {
+        ::SendMessage(GetWinHwnd(parent->GetClientWindow()), WM_MDIACTIVATE,
+                      (WPARAM) GetHwnd(), 0);
+    }
 }
 
 // ---------------------------------------------------------------------------
@@ -767,10 +782,6 @@ long wxMDIChildFrame::MSWWindowProc(WXUINT message,
             }
             break;
 
-        case WM_SIZE:
-            processed = HandleSize(LOWORD(lParam), HIWORD(lParam), wParam);
-            break;
-
         case WM_GETMINMAXINFO:
             // let the default window proc calculate the size of MDI children
             // frames because it is based on the size of the MDI client window,
@@ -785,8 +796,25 @@ long wxMDIChildFrame::MSWWindowProc(WXUINT message,
 
                 processed = HandleMDIActivate(act, hwndAct, hwndDeact);
             }
+            // fall through
+
+        case WM_MOVE:
+            // must pass WM_MOVE to DefMDIChildProc() to recalculate MDI client
+            // scrollbars if necessary
+
+            // fall through
+
+        case WM_SIZE:
+            // must pass WM_SIZE to DefMDIChildProc(), otherwise many weird
+            // things happen
+            MSWDefWindowProc(message, wParam, lParam);
             break;
 
+        case WM_SYSCOMMAND:
+            // DefMDIChildProc handles SC_{NEXT/PREV}WINDOW here, so pass it
+            // the message (the base class version does not)
+            return MSWDefWindowProc(message, wParam, lParam);
+
         case WM_WINDOWPOSCHANGING:
             processed = HandleWindowPosChanging((LPWINDOWPOS)lParam);
             break;
@@ -937,8 +965,8 @@ bool wxMDIChildFrame::HandleWindowPosChanging(void *pos)
     if (!(lpPos->flags & SWP_NOSIZE))
     {
         RECT rectClient;
-        DWORD dwExStyle = ::GetWindowLong((HWND) GetHWND(), GWL_EXSTYLE);
-        DWORD dwStyle = ::GetWindowLong((HWND) GetHWND(), GWL_STYLE);
+        DWORD dwExStyle = ::GetWindowLong(GetHwnd(), GWL_EXSTYLE);
+        DWORD dwStyle = ::GetWindowLong(GetHwnd(), GWL_STYLE);
         if (ResetWindowStyle((void *) & rectClient) && (dwStyle & WS_MAXIMIZE))
         {
             ::AdjustWindowRectEx(&rectClient, dwStyle, FALSE, dwExStyle);
@@ -970,15 +998,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);
 }
 
 // ---------------------------------------------------------------------------
@@ -988,7 +1008,7 @@ bool wxMDIChildFrame::MSWTranslateMessage(WXMSG* msg)
 void wxMDIChildFrame::MSWDestroyWindow()
 {
     MSWDetachWindowMenu();
-    invalidHandle = (HWND) GetHWND();
+    invalidHandle = GetHwnd();
 
     wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
 
@@ -997,11 +1017,8 @@ void wxMDIChildFrame::MSWDestroyWindow()
     // the wxFrame is destroyed.
 
     HWND oldHandle = (HWND)GetHWND();
-#ifdef __WIN32__
-    SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDIDESTROY, (WPARAM)oldHandle, (LPARAM)0);
-#else
-    SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDIDESTROY, (HWND)oldHandle, 0);
-#endif
+    SendMessage(GetWinHwnd(parent->GetClientWindow()), WM_MDIDESTROY,
+                (WPARAM)oldHandle, 0);
     invalidHandle = 0;
 
     if (m_hMenu)
@@ -1022,8 +1039,8 @@ bool wxMDIChildFrame::ResetWindowStyle(void *vrect)
     wxMDIChildFrame* pChild = pFrameWnd->GetActiveChild();
     if (!pChild || (pChild == this))
     {
-        DWORD dwStyle = ::GetWindowLong((HWND) pFrameWnd->GetClientWindow()->GetHWND(), GWL_EXSTYLE);
-        DWORD dwThisStyle = ::GetWindowLong((HWND) GetHWND(), GWL_STYLE);
+        DWORD dwStyle = ::GetWindowLong(GetWinHwnd(pFrameWnd->GetClientWindow()), GWL_EXSTYLE);
+        DWORD dwThisStyle = ::GetWindowLong(GetHwnd(), GWL_STYLE);
         DWORD dwNewStyle = dwStyle;
         if (pChild != NULL && (dwThisStyle & WS_MAXIMIZE))
             dwNewStyle &= ~(WS_EX_CLIENTEDGE);
@@ -1082,7 +1099,7 @@ bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style)
     m_hWnd = (WXHWND)::CreateWindowEx
                        (
                         exStyle,
-                        "MDICLIENT",
+                        _T("MDICLIENT"),
                         NULL,
                         msStyle,
                         0, 0, 0, 0,
@@ -1135,7 +1152,7 @@ static void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow)
 
     // update menu bar of the parent window
     wxWindow *parent = win->GetParent();
-    wxCHECK_RET( parent, "MDI client without parent frame? weird..." );
+    wxCHECK_RET( parent, _T("MDI client without parent frame? weird...") );
 
     ::DrawMenuBar(GetWinHwnd(parent));
 }
@@ -1148,34 +1165,34 @@ static void InsertWindowMenu(wxWindow *win, WXHMENU menu, HMENU subMenu)
     bool success = FALSE;
     for ( int i = 0; i < N; i++ )
     {
-        char buf[256];
+        wxChar buf[256];
         int chars = GetMenuString(hmenu, i, buf, WXSIZEOF(buf), MF_BYPOSITION);
         if ( chars == 0 )
         {
-            wxLogLastError("GetMenuString");
+            wxLogLastError(_T("GetMenuString"));
 
             continue;
         }
 
-        if ( wxStripMenuCodes(wxString(buf)).IsSameAs(_("Help")) )
+        if ( wxStripMenuCodes(wxString(buf)).IsSameAs(_T("Help")) )
         {
             success = TRUE;
             ::InsertMenu(hmenu, i, MF_BYPOSITION | MF_POPUP | MF_STRING,
-                         (UINT)subMenu, "&Window");
+                         (UINT)subMenu, _T("&Window"));
             break;
         }
     }
 
     if ( !success )
     {
-        ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, _("&Window"));
+        ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, _T("&Window"));
     }
 
     MDISetMenu(win, hmenu, subMenu);
 }
 
-static UnpackMDIActivate(WXWPARAM wParam, WXLPARAM lParam,
-                         WXWORD *activate, WXHWND *hwndAct, WXHWND *hwndDeact)
+static void UnpackMDIActivate(WXWPARAM wParam, WXLPARAM lParam,
+                              WXWORD *activate, WXHWND *hwndAct, WXHWND *hwndDeact)
 {
 #ifdef __WIN32__
     *activate = TRUE;