]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/frame.cpp
Quick VA fix
[wxWidgets.git] / src / os2 / frame.cpp
index 0adff13a4b31c3183e648f5ba0ee6f13eb187328..18269f66d1fa8a7817f9a1758de51a3dda7775ea 100644 (file)
@@ -339,31 +339,44 @@ void wxFrame::DoGetPosition(
 // ----------------------------------------------------------------------------
 
 void wxFrame::DoShowWindow(
-  int                               nShowCmd
+  int                               bShowCmd
 )
 {
-    ::WinShowWindow(GetHwnd(), nShowCmd);
-    m_bIconized = nShowCmd == SWP_MINIMIZE;
+    HWND                            hClient = NULLHANDLE;
+    SWP                             vSwp;
+
+    //
+    // Reset the window position
+    //
+    hClient = WinWindowFromID(GetHwnd(), FID_CLIENT);
+    WinQueryWindowPos(GetHwnd(), &vSwp);
+    WinSetWindowPos( GetHwnd()
+                    ,HWND_TOP
+                    ,vSwp.x
+                    ,vSwp.y
+                    ,vSwp.cx
+                    ,vSwp.cy
+                    ,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE
+                   );
+    ::WinShowWindow(GetHwnd(), (BOOL)bShowCmd);
+    ::WinShowWindow(hClient, (BOOL)bShowCmd);
 } // end of wxFrame::DoShowWindow
 
 bool wxFrame::Show(
   bool                              bShow
 )
 {
-    DoShowWindow(bShow ? SWP_SHOW : SWP_HIDE);
+    SWP                             vSwp;
+
+    DoShowWindow((int)bShow);
 
     if (bShow)
     {
         wxActivateEvent             vEvent(wxEVT_ACTIVATE, TRUE, m_windowId);
 
-        ::WinSetWindowPos( (HWND) GetHWND()
-                          ,HWND_TOP
-                          ,0
-                          ,0
-                          ,0
-                          ,0
-                          ,SWP_ZORDER
-                         );
+        ::WinQueryWindowPos(GetHwnd(), &vSwp);
+        m_bIconized = vSwp.fl & SWP_MINIMIZE;
+        ::WinEnableWindow(GetHwnd(), TRUE);
         vEvent.SetEventObject(this);
         GetEventHandler()->ProcessEvent(vEvent);
     }
@@ -376,15 +389,18 @@ bool wxFrame::Show(
         {
             HWND                    hWndParent = GetHwndOf(GetParent());
 
+            ::WinQueryWindowPos(hWndParent, &vSwp);
+            m_bIconized = vSwp.fl & SWP_MINIMIZE;
             if (hWndParent)
                 ::WinSetWindowPos( hWndParent
                                   ,HWND_TOP
-                                  ,0
-                                  ,0
-                                  ,0
-                                  ,0
-                                  ,SWP_ZORDER
+                                  ,vSwp.x
+                                  ,vSwp.y
+                                  ,vSwp.cx
+                                  ,vSwp.cy
+                                  ,SWP_ZORDER | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE
                                  );
+            ::WinEnableWindow(hWndParent, TRUE);
         }
     }
     return TRUE;
@@ -438,11 +454,11 @@ void wxFrame::SetIcon(
 {
     wxFrameBase::SetIcon(rIcon);
 
-    if (m_icon.Ok())
+    if ((m_icon.GetHICON()) != NULLHANDLE)
     {
         ::WinSendMsg( GetHwnd()
                      ,WM_SETICON
-                     ,(MPARAM)((HICON)m_icon.GetHICON())
+                     ,(MPARAM)((HPOINTER)m_icon.GetHICON())
                      ,NULL
                     );
         ::WinSendMsg( GetHwnd()
@@ -520,6 +536,20 @@ void wxFrame::SetMenuBar(
   wxMenuBar*                        pMenuBar
 )
 {
+    ERRORID                         vError;
+    wxString                        sError;
+    HWND                            hClient = NULLHANDLE;
+    HWND                            hFrame = NULLHANDLE;
+    HWND                            hTitlebar = NULLHANDLE;
+    HWND                            hHScroll = NULLHANDLE;
+    HWND                            hVScroll = NULLHANDLE;
+    HWND                            hMenuBar = NULLHANDLE;
+    SWP                             vSwp;
+    SWP                             vSwpTitlebar;
+    SWP                             vSwpVScroll;
+    SWP                             vSwpHScroll;
+    SWP                             vSwpMenu;
+
     if (!pMenuBar)
     {
         DetachMenuBar();
@@ -546,10 +576,48 @@ void wxFrame::SetMenuBar(
             return;
     }
 
+    //
+    // Set the parent and owner of the menubar to be the frame
+    //
+    if (!::WinSetParent(m_hMenu, GetHwnd(), FALSE))
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+        wxLogError("Error setting parent for submenu. Error: %s\n", sError);
+    }
+
+    if (!::WinSetOwner(m_hMenu, GetHwnd()))
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+        wxLogError("Error setting parent for submenu. Error: %s\n", sError);
+    }
     InternalSetMenuBar();
 
     m_frameMenuBar = pMenuBar;
     pMenuBar->Attach(this);
+
+    //
+    // Now resize the client to fit the new frame
+    //
+    WinQueryWindowPos(GetHwnd(), &vSwp);
+    hClient = WinWindowFromID(GetHwnd(), FID_CLIENT);
+    hTitlebar = WinWindowFromID(GetHwnd(), FID_TITLEBAR);
+    WinQueryWindowPos(hTitlebar, &vSwpTitlebar);
+    hHScroll = WinWindowFromID(GetHwnd(), FID_HORZSCROLL);
+    WinQueryWindowPos(hHScroll, &vSwpHScroll);
+    hVScroll = WinWindowFromID(GetHwnd(), FID_VERTSCROLL);
+    WinQueryWindowPos(hVScroll, &vSwpVScroll);
+    hMenuBar = WinWindowFromID(GetHwnd(), FID_MENU);
+    WinQueryWindowPos(hMenuBar, &vSwpMenu);
+    WinSetWindowPos( hClient
+                    ,HWND_TOP
+                    ,SV_CXSIZEBORDER/2
+                    ,(SV_CYSIZEBORDER/2) + vSwpHScroll.cy/2
+                    ,vSwp.cx - ((SV_CXSIZEBORDER + 1) + vSwpVScroll.cx)
+                    ,vSwp.cy - ((SV_CYSIZEBORDER + 1) + vSwpTitlebar.cy + vSwpMenu.cy + vSwpHScroll.cy/2)
+                    ,SWP_SIZE | SWP_MOVE
+                   );
 } // end of wxFrame::SetMenuBar
 
 void wxFrame::InternalSetMenuBar()
@@ -727,6 +795,7 @@ bool wxFrame::OS2Create(
     FRAMECDATA                      vFrameCtlData;
     HWND                            hParent = NULLHANDLE;
     HWND                            hClient = NULLHANDLE;
+    HWND                            hFrame = NULLHANDLE;
     HWND                            hTitlebar = NULLHANDLE;
     HWND                            hHScroll = NULLHANDLE;
     HWND                            hVScroll = NULLHANDLE;
@@ -736,10 +805,7 @@ bool wxFrame::OS2Create(
     SWP                             vSwpHScroll;
 
     m_hDefaultIcon = (WXHICON) (wxSTD_FRAME_ICON ? wxSTD_FRAME_ICON : wxDEFAULT_FRAME_ICON);
-    memset(&vSwp, '\0', sizeof(SWP));
-    memset(&vSwpTitlebar, '\0', sizeof(SWP));
-    memset(&vSwpVScroll, '\0', sizeof(SWP));
-    memset(&vSwpHScroll, '\0', sizeof(SWP));
+
     if (pParent)
         hParent = GetWinHwnd(pParent);
     else
@@ -823,12 +889,21 @@ bool wxFrame::OS2Create(
         return FALSE;
     }
 
+    hFrame = GetHwnd();
+
+    //
+    // Since under PM the controling window proc is associated with the client window handle
+    // not the frame's we have to perform the hook here in order to associated the client handle,
+    // not the frame's with the window object !
+    //
+
+    wxWndHook = this;
     //
     // Create the client window.  We must call the API from here rather than
     // the static base class create because we need a separate handle
     //
-    if ((hClient = ::WinCreateWindow( GetHwnd()   // Frame is parent
-                                     ,zWclass     // Custom client class
+    if ((hClient = ::WinCreateWindow( hFrame   // Frame is parent
+                                     ,wxFrameClassName
                                      ,NULL        // Window title
                                      ,0           // No styles
                                      ,0, 0, 0, 0  // Window position
@@ -842,10 +917,20 @@ bool wxFrame::OS2Create(
         return FALSE;
     }
 
+    wxWndHook = NULL;
+    //
+    // Send anything to initialize the frame
+    //
+    ::WinSendMsg( hFrame
+                 ,WM_UPDATEFRAME
+                 ,(MPARAM)FCF_TASKLIST
+                 ,(MPARAM)0
+                );
+
     //
     // Now size everything.  If adding a menu the client will need to be resized.
     //
-    if (!::WinSetWindowPos( GetHwnd()
+    if (!::WinSetWindowPos( hFrame
                            ,HWND_TOP
                            ,nX
                            ,nY
@@ -856,31 +941,25 @@ bool wxFrame::OS2Create(
         return FALSE;
 
     WinQueryWindowPos(GetHwnd(), &vSwp);
+    hClient = WinWindowFromID(GetHwnd(), FID_CLIENT);
+    hTitlebar = WinWindowFromID(GetHwnd(), FID_TITLEBAR);
+    WinQueryWindowPos(hTitlebar, &vSwpTitlebar);
+    hHScroll = WinWindowFromID(GetHwnd(), FID_HORZSCROLL);
+    WinQueryWindowPos(hHScroll, &vSwpHScroll);
+    hVScroll = WinWindowFromID(GetHwnd(), FID_VERTSCROLL);
+    WinQueryWindowPos(hVScroll, &vSwpVScroll);
+    WinSetWindowPos( hClient
+                    ,HWND_TOP
+                    ,SV_CXSIZEBORDER/2
+                    ,(SV_CYSIZEBORDER/2) + vSwpHScroll.cy/2
+                    ,vSwp.cx - ((SV_CXSIZEBORDER + 1) + vSwpVScroll.cx)
+                    ,vSwp.cy - ((SV_CYSIZEBORDER + 1) + vSwpTitlebar.cy + vSwpHScroll.cy/2)
+                    ,SWP_SIZE | SWP_MOVE
+                   );
 
-    if (ulCreateFlags & FCF_TITLEBAR)
-    {
-        hTitlebar = WinWindowFromID(GetHwnd(), FID_TITLEBAR);
-        WinQueryWindowPos(hTitlebar, &vSwpTitlebar);
-    }
-    if (ulCreateFlags & FCF_HORZSCROLL)
-    {
-        hHScroll = WinWindowFromID(GetHwnd(), FID_HORZSCROLL);
-        WinQueryWindowPos(hHScroll, &vSwpHScroll);
-    }
-    if (ulCreateFlags & FCF_VERTSCROLL)
-    {
-        hVScroll = WinWindowFromID(GetHwnd(), FID_VERTSCROLL);
-        WinQueryWindowPos(hVScroll, &vSwpVScroll);
-    }
-    if (!::WinSetWindowPos( hClient
-                           ,HWND_TOP
-                           ,SV_CXSIZEBORDER
-                           ,(SV_CYSIZEBORDER - 1) + vSwpHScroll.cy
-                           ,vSwp.cx - ((SV_CXSIZEBORDER * 2) + vSwpVScroll.cx)
-                           ,vSwp.cy - ((SV_CYSIZEBORDER * 2) + 1 + vSwpTitlebar.cy + vSwpHScroll.cy)
-                           ,SWP_SIZE | SWP_MOVE
-                          ))
-        return FALSE;
+    //
+    // Set the client window's background, otherwise it is transparent!
+    //
     return TRUE;
 } // end of wxFrame::OS2Create