]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/frame.cpp
Added event Clone functions
[wxWidgets.git] / src / os2 / frame.cpp
index 26b4572eec102310cb61cf09fad603622b0b4eb7..bc13037ef5a20b92c614c51ccbb5b44e116b276c 100644 (file)
 extern wxWindowList wxModelessWindows;
 extern wxList WXDLLEXPORT wxPendingDelete;
 extern wxChar wxFrameClassName[];
+
+#if wxUSE_MENUS_NATIVE
 extern wxMenu *wxCurrentPopupMenu;
+#endif
 
-extern void  wxAssociateWinWithHandle( HWND hWnd,wxWindow* pWin);
+extern void  wxAssociateWinWithHandle( HWND         hWnd
+                                      ,wxWindowOS2* pWin
+                                     );
 
 // ----------------------------------------------------------------------------
 // event tables
@@ -103,6 +108,7 @@ void wxFrame::Init()
     m_nFsStatusBarHeight = 0;
     m_nFsToolBarHeight   = 0;
     m_bFsIsMaximized     = FALSE;
+    m_bWasMinimized      = FALSE;
     m_bFsIsShowing       = FALSE;
     m_bIsShown           = FALSE;
     m_pWinLastFocused    = (wxWindow *)NULL;
@@ -231,6 +237,53 @@ wxFrame::~wxFrame()
     }
 } // end of wxFrame::~wxFrame
 
+//
+//  IF we have child controls in the Frame's client we need to alter
+//  the y position, because, OS/2 controls are positioned relative to
+//  wxWindows orgin (top left) not the OS/2 origin (bottom left)
+void wxFrame::AlterChildPos()
+{
+    //
+    // OS/2 is the only OS concerned about this
+    //
+    wxWindow*                               pChild = NULL;
+    wxControl*                              pCtrl = NULL;
+    RECTL                                   vRect;
+    SWP                                     vSwp;
+
+    ::WinQueryWindowRect(GetHwnd(), &vRect);
+    for (wxWindowList::Node* pNode = GetChildren().GetFirst();
+         pNode;
+         pNode = pNode->GetNext())
+    {
+        wxWindow*                   pChild = pNode->GetData();
+
+        ::WinQueryWindowPos(pChild->GetHWND(), &vSwp);
+        vSwp.y += (vRect.yTop - m_vSwpClient.cy);
+        if (pChild->IsKindOf(CLASSINFO(wxControl)))
+        {
+            pCtrl = wxDynamicCast(pChild, wxControl);
+            //
+            // Must deal with controls that have margins like ENTRYFIELD.  The SWP
+            // struct of such a control will have and origin offset from its intended
+            // position by the width of the margins.
+            //
+            vSwp.y -= pCtrl->GetYComp();
+            vSwp.x -= pCtrl->GetXComp();
+        }
+        ::WinSetWindowPos( pChild->GetHWND()
+                          ,HWND_TOP
+                          ,vSwp.x
+                          ,vSwp.y
+                          ,vSwp.cx
+                          ,vSwp.cy
+                          ,SWP_MOVE
+                         );
+        ::WinQueryWindowPos(pChild->GetHWND(), &vSwp);
+        pChild = NULL;
+    }
+} // end of wxFrame::AlterChildPos
+
 //
 // Get size *available for subwindows* i.e. excluding menu bar, toolbar etc.
 //
@@ -241,6 +294,13 @@ void wxFrame::DoGetClientSize(
 {
     RECTL                           vRect;
     ::WinQueryWindowRect(GetHwnd(), &vRect);
+
+    //
+    // No need to use statusbar code as in WIN32 as the FORMATFRAME
+    // window procedure ensures PM knows about the new frame client
+    // size internally.  A ::WinQueryWindowRect is all that is needed!
+    //
+
     if (pX)
         *pX = vRect.xRight - vRect.xLeft;
     if (pY)
@@ -268,25 +328,23 @@ void wxFrame::DoSetClientSize(
     // and the client area; add this to the new client size to move the
     // window.  Remember OS/2's backwards y coord system!
     //
-    int                             nActualWidth = vRect2.xRight - vRect2.xLeft - vRect.xRight + nWidth;
-    int                             nActualHeight = vRect2.yTop + vRect2.yTop - vRect.yTop + nHeight;
+    int                             nActualWidth = vRect2.xRight - vRect2.xLeft - vRect.xRight;
+    int                             nActualHeight = vRect2.yTop + vRect2.yTop - vRect.yTop;
 
 #if wxUSE_STATUSBAR
-    if ( GetStatusBar() )
-    {
-        int                         nStatusX;
-        int                         nStatusY;
+    wxStatusBar*                    pStatusBar = GetStatusBar();
 
-        GetStatusBar()->GetClientSize( &nStatusX
-                                      ,&nStatusY
-                                     );
-        nActualHeight += nStatusY;
+    if (pStatusBar && pStatusBar->IsShown())
+    {
+        nActualHeight += pStatusBar->GetSize().y;
     }
+
 #endif // wxUSE_STATUSBAR
 
     wxPoint                         vPoint(GetClientAreaOrigin());
-    nActualWidth  += vPoint.y;
-    nActualHeight += vPoint.x;
+
+    nActualWidth  += vPoint.x;
+    nActualHeight += vPoint.y;
 
     POINTL                          vPointl;
 
@@ -332,15 +390,9 @@ void wxFrame::DoGetPosition(
     POINTL                          vPoint;
 
     ::WinQueryWindowRect(m_hFrame, &vRect);
-    vPoint.x = vRect.xLeft;
-
-    //
-    // OS/2 is backwards [WIN32 it is vRect.yTop]
-    //
-    vPoint.y = vRect.yBottom;
 
-    *pX = vPoint.x;
-    *pY = vPoint.y;
+    *pX = vRect.xRight - vRect.xLeft;
+    *pY = vRect.yTop - vRect.yBottom;
 } // end of wxFrame::DoGetPosition
 
 // ----------------------------------------------------------------------------
@@ -359,9 +411,19 @@ bool wxFrame::Show(
   bool                              bShow
 )
 {
+    int                             nShowCmd;
     SWP                             vSwp;
 
-    DoShowWindow((int)bShow);
+    if (bShow)
+    {
+        nShowCmd = SWP_SHOW;
+    }
+    else // hide
+    {
+        nShowCmd = SWP_HIDE;
+    }
+
+    DoShowWindow(nShowCmd);
 
     if (bShow)
     {
@@ -369,6 +431,7 @@ bool wxFrame::Show(
 
         ::WinQueryWindowPos(m_hFrame, &vSwp);
         m_bIconized = vSwp.fl & SWP_MINIMIZE;
+        ::WinQueryWindowPos(m_hWnd, &m_vSwpClient);
         ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0);
         ::WinEnableWindow(m_hFrame, TRUE);
         vEvent.SetEventObject(this);
@@ -512,6 +575,7 @@ void wxFrame::PositionStatusBar()
     if (m_frameStatusBar)
     {
         int                         nWidth;
+        int                         nY;
         int                         nStatbarWidth;
         int                         nStatbarHeight;
         HWND                        hWndClient;
@@ -519,21 +583,24 @@ void wxFrame::PositionStatusBar()
         RECTL                       vFRect;
 
         ::WinQueryWindowRect(m_hFrame, &vRect);
+        nY = vRect.yTop;
         ::WinMapWindowPoints(m_hFrame, HWND_DESKTOP, (PPOINTL)&vRect, 2);
         vFRect = vRect;
         ::WinCalcFrameRect(m_hFrame, &vRect, TRUE);
         nWidth = vRect.xRight - vRect.xLeft;
+        nY = nY - (vRect.yBottom - vFRect.yBottom);
 
         m_frameStatusBar->GetSize( &nStatbarWidth
                                   ,&nStatbarHeight
                                  );
 
+        nY= nY - nStatbarHeight;
         //
         // Since we wish the status bar to be directly under the client area,
         // we use the adjusted sizes without using wxSIZE_NO_ADJUSTMENTS.
         //
         m_frameStatusBar->SetSize( vRect.xLeft - vFRect.xLeft
-                                  ,vRect.yBottom - vFRect.yBottom
+                                  ,nY
                                   ,nWidth
                                   ,nStatbarHeight
                                  );
@@ -548,6 +615,7 @@ void wxFrame::PositionStatusBar()
 } // end of wxFrame::PositionStatusBar
 #endif // wxUSE_STATUSBAR
 
+#if wxUSE_MENUS_NATIVE
 void wxFrame::DetachMenuBar()
 {
     if (m_frameMenuBar)
@@ -606,10 +674,49 @@ void wxFrame::SetMenuBar(
         }
         InternalSetMenuBar();
         m_frameMenuBar = pMenuBar;
-        pMenuBar->Attach(this);
+        pMenuBar->Attach((wxFrame*)this);
     }
 } // end of wxFrame::SetMenuBar
 
+void wxFrame::AttachMenuBar(
+  wxMenuBar*                        pMenubar
+)
+{
+    wxFrameBase::AttachMenuBar(pMenubar);
+
+    m_frameMenuBar = pMenubar;
+
+    if (!pMenubar)
+    {
+        //
+        // Actually remove the menu from the frame
+        //
+        m_hMenu = (WXHMENU)0;
+        InternalSetMenuBar();
+    }
+    else // Set new non NULL menu bar
+    {
+        //
+        // Can set a menubar several times.
+        //
+        if (pMenubar->GetHMenu())
+        {
+            m_hMenu = pMenubar->GetHMenu();
+        }
+        else
+        {
+            if (pMenubar->IsAttached())
+                pMenubar->Detach();
+
+            m_hMenu = pMenubar->Create();
+
+            if (!m_hMenu)
+                return;
+        }
+        InternalSetMenuBar();
+    }
+} // end of wxFrame::AttachMenuBar
+
 void wxFrame::InternalSetMenuBar()
 {
     ERRORID                         vError;
@@ -630,8 +737,9 @@ void wxFrame::InternalSetMenuBar()
         sError = wxPMErrorToStr(vError);
         wxLogError("Error setting parent for submenu. Error: %s\n", sError);
     }
-    WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
+    ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
 } // end of wxFrame::InternalSetMenuBar
+#endif // wxUSE_MENUS_NATIVE
 
 //
 // Responds to colour changes, and passes event on to children
@@ -674,11 +782,11 @@ bool wxFrame::ShowFullScreen(
         m_lFsStyle = lStyle;
 
 #if wxUSE_TOOLBAR
-           wxToolBar*                  pTheToolBar = GetToolBar();
+        wxToolBar*                  pTheToolBar = GetToolBar();
 #endif //wxUSE_TOOLBAR
 
 #if wxUSE_STATUSBAR
-           wxStatusBar*                pTheStatusBar = GetStatusBar();
+        wxStatusBar*                pTheStatusBar = GetStatusBar();
 #endif //wxUSE_STATUSBAR
 
         int                         nDummyWidth;
@@ -706,9 +814,9 @@ bool wxFrame::ShowFullScreen(
 
         if (lStyle & wxFULLSCREEN_NOMENUBAR)
         {
-            ::WinSetParent(m_hMenu, GetHWND(), FALSE);
-            ::WinSetOwner(m_hMenu, GetHWND());
-            ::WinSendMsg((HWND)GetHWND(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
+            ::WinSetParent(m_hMenu, m_hFrame, FALSE);
+            ::WinSetOwner(m_hMenu, m_hFrame);
+            ::WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
         }
 
 #if wxUSE_STATUSBAR
@@ -732,16 +840,16 @@ bool wxFrame::ShowFullScreen(
         //
         // Save the 'normal' window style
         //
-        m_lFsOldWindowStyle = ::WinQueryWindowULong((HWND)GetHWND(), QWL_STYLE);
+        m_lFsOldWindowStyle = ::WinQueryWindowULong(m_hFrame, QWL_STYLE);
 
         //
-           // Save the old position, width & height, maximize state
+        // Save the old position, width & height, maximize state
         //
         m_vFsOldSize = GetRect();
         m_bFsIsMaximized = IsMaximized();
 
         //
-            // Decide which window style flags to turn off
+        // Decide which window style flags to turn off
         //
         LONG                        lNewStyle = m_lFsOldWindowStyle;
         LONG                        lOffFlags = 0;
@@ -756,7 +864,7 @@ bool wxFrame::ShowFullScreen(
         //
         // Change our window style to be compatible with full-screen mode
         //
-        ::WinSetWindowULong((HWND)GetHWND(), QWL_STYLE, (ULONG)lNewStyle);
+        ::WinSetWindowULong((HWND)m_hFrame, QWL_STYLE, (ULONG)lNewStyle);
 
         //
         // Resize to the size of the desktop
@@ -827,13 +935,13 @@ bool wxFrame::ShowFullScreen(
 
         if ((m_lFsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0))
         {
-            ::WinSetParent(m_hMenu, GetHWND(), FALSE);
-            ::WinSetOwner(m_hMenu, GetHWND());
-            ::WinSendMsg((HWND)GetHWND(), WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
+            ::WinSetParent(m_hMenu, m_hFrame, FALSE);
+            ::WinSetOwner(m_hMenu, m_hFrame);
+            ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
         }
         Maximize(m_bFsIsMaximized);
 
-        ::WinSetWindowULong( (HWND)GetHWND()
+        ::WinSetWindowULong( m_hFrame
                             ,QWL_STYLE
                             ,(ULONG)m_lFsOldWindowStyle
                            );
@@ -982,6 +1090,22 @@ bool wxFrame::OS2Create(
     wxAssociateWinWithHandle(m_hWnd, this);
     wxAssociateWinWithHandle(m_hFrame, this);
 
+    m_backgroundColour.Set(wxString("GREY"));
+
+    LONG                            lColor = (LONG)m_backgroundColour.GetPixel();
+
+    if (!::WinSetPresParam( m_hWnd
+                           ,PP_BACKGROUNDCOLOR
+                           ,sizeof(LONG)
+                           ,(PVOID)&lColor
+                          ))
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+        wxLogError("Error creating frame. Error: %s\n", sError);
+        return FALSE;
+    }
+
     //
     // Now need to subclass window.  Instead of calling the SubClassWin in wxWindow
     // we manually subclass here because we don't want to use the main wxWndProc
@@ -993,6 +1117,17 @@ bool wxFrame::OS2Create(
     // Now size everything.  If adding a menu the client will need to be resized.
     //
 
+    if (pParent)
+    {
+        nY = pParent->GetSize().y - (nY + nHeight);
+    }
+    else
+    {
+        RECTL                   vRect;
+
+        ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
+        nY = vRect.yTop - (nY + nHeight);
+    }
     if (!::WinSetWindowPos( m_hFrame
                            ,HWND_TOP
                            ,nX
@@ -1007,37 +1142,6 @@ bool wxFrame::OS2Create(
         wxLogError("Error sizing frame. Error: %s\n", sError);
         return FALSE;
     }
-    //
-    // We may have to be smarter here when variable sized toolbars are added!
-    //
-    if (!::WinSetWindowPos( m_hWnd
-                           ,HWND_TOP
-                           ,nX + 20
-                           ,nY + 20
-                           ,nWidth - 60
-                           ,nHeight - 60
-                           ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE | SWP_ZORDER
-                          ))
-    {
-        vError = ::WinGetLastError(vHabmain);
-        sError = wxPMErrorToStr(vError);
-        wxLogError("Error sizing client. Error: %s\n", sError);
-        return FALSE;
-    }
-
-/*
-    uCtlCount = SHORT1FROMMP(::WinSendMsg(GetHWND(), WM_FORMATFRAME, (MPARAM)vSwp, (MPARAM)vRect));
-    for (int i = 0; i < uCtlCount; i++)
-    {
-        if (vSwp[i].hwnd == GetHWND())
-            memcpy(&m_vSwp, &vSwp[i], sizeof(SWP));
-        else if (vSwp[i].hwnd == m_hVScroll)
-            memcpy(&m_vSwpVScroll, &vSwp[i], sizeof(SWP));
-        else if (vSwp[i].hwnd == m_hHScroll)
-            memcpy(&m_vSwpVScroll, &vSwp[i], sizeof(SWP));
-        else if (vSwp[i].hwnd == m_hTitleBar)
-            memcpy(&m_vSwpTitleBar, &vSwp[i], sizeof(SWP));
-    }*/
     return TRUE;
 } // end of wxFrame::OS2Create
 
@@ -1049,27 +1153,51 @@ void wxFrame::OnActivate(
   wxActivateEvent&                  rEvent
 )
 {
-    for (wxWindowList::Node* pNode = GetChildren().GetFirst();
-         pNode;
-         pNode = pNode->GetNext())
+    if ( rEvent.GetActive() )
     {
-        // FIXME all this is totally bogus - we need to do the same as wxPanel,
-        //       but how to do it without duplicating the code?
+        // restore focus to the child which was last focused
+        wxLogTrace(_T("focus"), _T("wxFrame %08x activated."), m_hWnd);
 
-        // restore focus
-        wxWindow*                   pChild = pNode->GetData();
+        wxWindow*                           pParent = m_pWinLastFocused ? m_pWinLastFocused->GetParent()
+                                            : NULL;
+        if (!pParent)
+        {
+            pParent = this;
+        }
 
-        if (!pChild->IsTopLevel()
+        wxSetFocusToChild( pParent
+                          ,&m_pWinLastFocused
+                         );
+    }
+    else // deactivating
+    {
+        //
+        // Remember the last focused child if it is our child
+        //
+        m_pWinLastFocused = FindFocus();
+
+        for (wxWindowList::Node* pNode = GetChildren().GetFirst();
+             pNode;
+             pNode = pNode->GetNext())
+        {
+            // FIXME all this is totally bogus - we need to do the same as wxPanel,
+            //       but how to do it without duplicating the code?
+
+            // restore focus
+            wxWindow*                   pChild = pNode->GetData();
+
+            if (!pChild->IsTopLevel()
 #if wxUSE_TOOLBAR
-             && !wxDynamicCast(pChild, wxToolBar)
+                 && !wxDynamicCast(pChild, wxToolBar)
 #endif // wxUSE_TOOLBAR
 #if wxUSE_STATUSBAR
-             && !wxDynamicCast(pChild, wxStatusBar)
+                 && !wxDynamicCast(pChild, wxStatusBar)
 #endif // wxUSE_STATUSBAR
-           )
-        {
-            pChild->SetFocus();
-            return;
+               )
+            {
+                pChild->SetFocus();
+                return;
+            }
         }
     }
 } // end of wxFrame::OnActivate
@@ -1152,12 +1280,12 @@ void wxFrame::PositionToolBar()
     }
 #endif // wxUSE_STATUSBAR
 
-    if ( GetToolBar() )
+    if ( m_frameToolBar )
     {
         int                         nToolbarWidth;
         int                         nToolbarHeight;
 
-        GetToolBar()->GetSize( &nToolbarWidth
+        m_frameToolBar->GetSize( &nToolbarWidth
                               ,&nToolbarHeight
                              );
 
@@ -1201,10 +1329,30 @@ void wxFrame::IconizeChildFrames(
          pNode = pNode->GetNext() )
     {
         wxWindow*                   pWin = pNode->GetData();
+        wxFrame*                    pFrame = wxDynamicCast(pWin, wxFrame);
 
-        if (pWin->IsKindOf(CLASSINFO(wxFrame)) )
+        if ( pFrame
+#if wxUSE_MDI_ARCHITECTURE
+                && !wxDynamicCast(pFrame, wxMDIChildFrame)
+#endif // wxUSE_MDI_ARCHITECTURE
+           )
         {
-            ((wxFrame *)pWin)->Iconize(bIconize);
+            //
+            // We don't want to restore the child frames which had been
+            // iconized even before we were iconized, so save the child frame
+            // status when iconizing the parent frame and check it when
+            // restoring it.
+            //
+            if (bIconize)
+            {
+                pFrame->m_bWasMinimized = pFrame->IsIconized();
+            }
+
+            //
+            // This test works for both iconizing and restoring
+            //
+            if (!pFrame->m_bWasMinimized)
+                pFrame->Iconize(bIconize);
         }
     }
 } // end of wxFrame::IconizeChildFrames
@@ -1225,10 +1373,10 @@ bool wxFrame::OS2TranslateMessage(
     //
     wxMenuBar*                      pMenuBar = GetMenuBar();
 
-    if (!pMenuBar )
+    if (!pMenuBar)
         return FALSE;
 
-#if wxUSE_ACCEL
+#if wxUSE_ACCEL && wxUSE_MENUS_NATIVE
     const wxAcceleratorTable&       rAcceleratorTable = pMenuBar->GetAccelTable();
     return rAcceleratorTable.Translate(GetHWND(), pMsg);
 #else
@@ -1253,7 +1401,7 @@ bool wxFrame::HandlePaint()
             HPOINTER                hIcon;
 
             if (m_icon.Ok())
-                hIcon = (HPOINTER)::WinSendMsg(GetHWND(), WM_QUERYICON, 0L, 0L);
+                hIcon = (HPOINTER)::WinSendMsg(m_hFrame, WM_QUERYICON, 0L, 0L);
             else
                 hIcon = (HPOINTER)m_hDefaultIcon;
 
@@ -1288,7 +1436,40 @@ bool wxFrame::HandlePaint()
         }
         else
         {
-            return wxWindow::HandlePaint();
+            if (!wxWindow::HandlePaint())
+            {
+                HPS                     hPS;
+                RECTL                   vRect;
+
+                hPS = ::WinBeginPaint( GetHwnd()
+                                      ,NULLHANDLE
+                                      ,&vRect
+                                     );
+                if(hPS)
+                {
+                    ::GpiCreateLogColorTable( hPS
+                                             ,0L
+                                             ,LCOLF_CONSECRGB
+                                             ,0L
+                                             ,(LONG)wxTheColourDatabase->m_nSize
+                                             ,(PLONG)wxTheColourDatabase->m_palTable
+                                            );
+                    ::GpiCreateLogColorTable( hPS
+                                             ,0L
+                                             ,LCOLF_RGB
+                                             ,0L
+                                             ,0L
+                                             ,NULL
+                                            );
+
+                    ::WinFillRect( hPS
+                                  ,&vRect
+                                  ,GetBackgroundColour().GetPixel()
+                                 );
+                   ::WinEndPaint(hPS);
+                }
+            }
+            return TRUE;
         }
     }
     else
@@ -1321,6 +1502,7 @@ bool wxFrame::HandleSize(
             // restore all child frames too
             //
             IconizeChildFrames(FALSE);
+            (void)SendIconizeEvent(FALSE);
 
             //
             // fall through
@@ -1335,6 +1517,7 @@ bool wxFrame::HandleSize(
             // Iconize all child frames too
             //
             IconizeChildFrames(TRUE);
+            (void)SendIconizeEvent();
             m_bIconized = TRUE;
             break;
     }
@@ -1371,6 +1554,7 @@ bool wxFrame::HandleSize(
 
         vEvent.SetEventObject(this);
         bProcessed = GetEventHandler()->ProcessEvent(vEvent);
+        AlterChildPos();
     }
     return bProcessed;
 } // end of wxFrame::HandleSize
@@ -1399,6 +1583,7 @@ bool wxFrame::HandleCommand(
     //
     if (nCmd == CMDSRC_MENU || nCmd == CMDSRC_ACCELERATOR)
     {
+#if wxUSE_MENUS_NATIVE
         if (wxCurrentPopupMenu)
         {
             wxMenu*                 pPopupMenu = wxCurrentPopupMenu;
@@ -1408,7 +1593,9 @@ bool wxFrame::HandleCommand(
             return pPopupMenu->OS2Command( nCmd
                                           ,nId
                                          );
+            return TRUE;
         }
+#endif
 
         if (ProcessCommand(nId))
         {
@@ -1553,13 +1740,6 @@ MRESULT EXPENTRY wxFrameWndProc(
     // When we get the first message for the HWND we just created, we associate
     // it with wxWindow stored in wxWndHook
     //
-//    if (!pWnd && wxWndHook)
-//    {
-//        wxAssociateWinWithHandle(hWnd, wxWndHook);
-//        pWnd = wxWndHook;
-//        wxWndHook = NULL;
-//        pWnd->SetHWND((WXHWND)hWnd);
-//    }
 
     MRESULT                         rc = (MRESULT)0;
     bool                            bProcessed = FALSE;
@@ -1575,87 +1755,10 @@ MRESULT EXPENTRY wxFrameWndProc(
     }
     else
     {
-        switch (ulMsg)
-        {
-            case WM_CLOSE:
-                //
-                // If we can't close, tell the system that we processed the
-                // message - otherwise it would close us
-                //
-                bProcessed = !pWnd->Close();
-                break;
-
-            case WM_PAINT:
-                {
-                    HPS                             hPS;
-                    RECTL                           vRect;
-
-                    hPS = WinBeginPaint(hWnd, 0L, &vRect);
-                    WinFillRect(hPS, &vRect,  CLR_BLUE  /* SYSCLR_WINDOW */);
-                    WinEndPaint(hPS);
-                    rc = FALSE;
-                    break;
-                }
-                break;
-
-            case WM_COMMAND:
-                {
-                    WORD                wId;
-                    WORD                wCmd;
-                    WXHWND              hWnd;
-
-                    pWnd->UnpackCommand( (WXWPARAM)wParam
-                                        ,(WXLPARAM)lParam
-                                        ,&wId
-                                        ,&hWnd
-                                        ,&wCmd
-                                       );
-                    rc = (MRESULT) pWnd->HandleCommand( wId
-                                                       ,wCmd
-                                                       ,(WXHWND)hWnd
-                                                      );
-                }
-                break;
-
-            case WM_MENUSELECT:
-                {
-                    WXWORD              wItem;
-                    WXWORD              wFlags;
-                    WXHMENU             hMenu;
-
-                    pWnd->UnpackMenuSelect( wParam
-                                           ,lParam
-                                           ,&wItem
-                                           ,&wFlags
-                                           ,&hMenu
-                                          );
-                    bProcessed = pWnd->HandleMenuSelect( wItem
-                                                        ,wFlags
-                                                        ,hMenu
-                                                       );
-                    rc = (MRESULT)TRUE;
-                }
-                break;
-
-            case WM_SIZE:
-                {
-                    SHORT           nScxold = SHORT1FROMMP(wParam); // Old horizontal size.
-                    SHORT           nScyold = SHORT2FROMMP(wParam); // Old vertical size.
-                    SHORT           nScxnew = SHORT1FROMMP(lParam); // New horizontal size.
-                    SHORT           nScynew = SHORT2FROMMP(lParam); // New vertical size.
-
-                    lParam = MRFROM2SHORT( nScxnew - 20
-                                          ,nScynew - 30
-                                         );
-                }
-
-                bProcessed = pWnd->HandleSize(LOWORD(lParam), HIWORD(lParam), (WXUINT)wParam);
-                rc = (MRESULT)FALSE;
-                break;
-
-            default:
-                rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam);
-        }
+        if (pWnd)
+            rc = pWnd->OS2WindowProc(ulMsg, wParam, lParam);
+        else
+            rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam);
     }
     return rc;
 } // end of wxFrameWndProc
@@ -1679,18 +1782,34 @@ MRESULT wxFrame::OS2WindowProc(
             bProcessed = !Close();
             break;
 
-        case WM_COMMAND:
+        case WM_PAINT:
+            bProcessed = HandlePaint();
+            mRc = (MRESULT)FALSE;
+            break;
+
+         case WM_ERASEBACKGROUND:
+            //
+            // Returning TRUE to requests PM to paint the window background
+            // in SYSCLR_WINDOW. We capture this here because the PS returned
+            // in Frames is the PS for the whole frame, which we can't really
+            // use at all. If you want to paint a different background, do it
+            // in an OnPaint using a wxPaintDC.
+            //
+            mRc = (MRESULT)(TRUE);
+            break;
+
+      case WM_COMMAND:
             {
                 WORD                wId;
                 WORD                wCmd;
                 WXHWND              hWnd;
 
                 UnpackCommand( (WXWPARAM)wParam
-                            ,(WXLPARAM)lParam
-                            ,&wId
-                            ,&hWnd
-                            ,&wCmd
-                           );
+                              ,(WXLPARAM)lParam
+                              ,&wId
+                              ,&hWnd
+                              ,&wCmd
+                             );
 
                 bProcessed = HandleCommand( wId
                                            ,wCmd
@@ -1719,17 +1838,19 @@ MRESULT wxFrame::OS2WindowProc(
             }
             break;
 
-        case WM_PAINT:
-            bProcessed = HandlePaint();
-            break;
+        case WM_SIZE:
+            {
+                SHORT               nScxold = SHORT1FROMMP(wParam); // Old horizontal size.
+                SHORT               nScyold = SHORT2FROMMP(wParam); // Old vertical size.
+                SHORT               nScxnew = SHORT1FROMMP(lParam); // New horizontal size.
+                SHORT               nScynew = SHORT2FROMMP(lParam); // New vertical size.
 
-        case WM_ERASEBACKGROUND:
-            //
-            // Return TRUE to request PM to paint the window background
-            // in SYSCLR_WINDOW.
-            //
-            bProcessed = TRUE;
-            mRc = (MRESULT)(TRUE);
+                lParam = MRFROM2SHORT( nScxnew - 20
+                                      ,nScynew - 30
+                                     );
+            }
+            bProcessed = HandleSize(LOWORD(lParam), HIWORD(lParam), (WXUINT)wParam);
+            mRc = (MRESULT)FALSE;
             break;
 
         case CM_QUERYDRAGIMAGE:
@@ -1744,91 +1865,6 @@ MRESULT wxFrame::OS2WindowProc(
                 bProcessed = mRc != 0;
             }
             break;
-
-        case WM_SIZE:
-            bProcessed = HandleSize(LOWORD(lParam), HIWORD(lParam), (WXUINT)wParam);
-            break;
-
-        case WM_QUERYFRAMECTLCOUNT:
-            {
-                USHORT itemCount = SHORT1FROMMR(OS2GetOldWndProc()(GetHWND(), uMessage, wParam, lParam));
-#if wxUSE_STATUSBAR
-                if(m_frameStatusBar)
-                   ++itemCount;
-#endif //wxUSE_STATUSBAR
-
-                bProcessed = TRUE;
-                mRc = MRFROMSHORT( itemCount );
-            }
-            break;
-
-        case WM_FORMATFRAME:
-            {
-                PSWP   pSWP     = 0;
-                USHORT usClient = 0;
-                SWP    swp;
-                USHORT itemCount;
-                char   s[128];
-
-                itemCount = SHORT1FROMMR(OS2GetOldWndProc()(GetHWND(), uMessage, wParam, lParam));
-                pSWP = (PSWP)PVOIDFROMMP( wParam );
-
-                while(pSWP[usClient].hwnd != WinWindowFromID(GetHWND(), FID_CLIENT)
-                     && usClient < itemCount)
-                    usClient++;
-
-#if wxUSE_STATUSBAR
-                if(m_frameStatusBar)
-                {
-                   int height;
-
-                   m_frameStatusBar->GetSize(NULL, &height);
-
-                   if(usClient == itemCount)
-                   {
-                      // frame has no client window
-                      // using another method of calculation
-                      RECTL wRectl;
-
-                      ::WinQueryWindowRect(GetHWND(), &wRectl);
-                      ::WinMapWindowPoints(GetHWND(), HWND_DESKTOP, (PPOINTL)&wRectl, 2);
-                      ::WinCalcFrameRect(GetHWND(), &wRectl, TRUE);
-                      ::WinMapWindowPoints(HWND_DESKTOP, GetHWND(), (PPOINTL)&wRectl, 2);
-
-                      pSWP[itemCount].x    = wRectl.xLeft;
-                      pSWP[itemCount].y    = wRectl.yBottom;
-                      pSWP[itemCount].cx   = wRectl.xRight - wRectl.xLeft - 1;
-                      pSWP[itemCount].cy   = height;
-                      pSWP[itemCount].fl   = SWP_SIZE |
-                                             SWP_MOVE |
-                                             SWP_SHOW;
-                      pSWP[itemCount].hwnd = m_frameStatusBar->GetHWND();
-                      pSWP[itemCount].hwndInsertBehind = HWND_TOP;
-                      ++itemCount;
-                   }
-                   else
-                   {
-                       pSWP[itemCount].x    = pSWP[usClient].x;
-                       pSWP[itemCount].y    = pSWP[usClient].y;
-                       pSWP[itemCount].cx   = pSWP[usClient].cx;
-                       pSWP[itemCount].cy   = height;
-                       pSWP[itemCount].fl   = SWP_SIZE |
-                                              SWP_MOVE |
-                                              SWP_SHOW;
-                       pSWP[itemCount].hwnd = m_frameStatusBar->GetHWND();
-                       pSWP[itemCount].hwndInsertBehind = HWND_TOP;
-                       pSWP[usClient].cy -= height;
-                       pSWP[usClient].y  += height;
-
-                       ++itemCount;
-                   }
-                }
-#endif //wxUSE_STATUSBAR
-
-                bProcessed = TRUE;
-                mRc = MRFROMSHORT(itemCount);
-            }
-            break;
     }
 
     if (!bProcessed )
@@ -1865,7 +1901,7 @@ void wxFrame::SetClient(
         pOldClient->Show( FALSE );
         ::WinSetWindowUShort(pOldClient->GetHWND(), QWS_ID, (USHORT)pOldClient->GetId());
         // to avoid OS/2 bug need to update frame
-        ::WinSendMsg((HWND)this->GetHWND(), WM_UPDATEFRAME, (MPARAM)~0, 0);
+        ::WinSendMsg((HWND)this->GetFrame(), WM_UPDATEFRAME, (MPARAM)~0, 0);
         return;
     }
 
@@ -1890,11 +1926,11 @@ void wxFrame::SetClient(
     if( this->IsShown() )
     {
         this->Show();
-        ::WinSendMsg(GetHWND(), WM_UPDATEFRAME, (MPARAM)~0, 0);
+        ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0);
     }
 }
 
 wxWindow* wxFrame::GetClient()
 {
-    return wxFindWinFromHandle((WXHWND)::WinWindowFromID(GetHWND(), FID_CLIENT));
+    return wxFindWinFromHandle((WXHWND)::WinWindowFromID(m_hFrame, FID_CLIENT));
 }