]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/frame.cpp
1. some (benign) warnings fixed
[wxWidgets.git] / src / os2 / frame.cpp
index 23a77f120e944dc8e67f3aed144ed3992ab100ee..18269f66d1fa8a7817f9a1758de51a3dda7775ea 100644 (file)
@@ -342,9 +342,22 @@ void wxFrame::DoShowWindow(
   int                               bShowCmd
 )
 {
-    HWND                            hClient;
+    HWND                            hClient = NULLHANDLE;
+    SWP                             vSwp;
 
-    hClient = ::WinWindowFromID(GetHwnd(), FID_CLIENT);
+    //
+    // 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
@@ -362,15 +375,8 @@ bool wxFrame::Show(
         wxActivateEvent             vEvent(wxEVT_ACTIVATE, TRUE, m_windowId);
 
         ::WinQueryWindowPos(GetHwnd(), &vSwp);
-        m_bIconized = vSwp & SWP_MINIMIZE;
-        ::WinSetWindowPos( (HWND) GetHWND()
-                          ,HWND_TOP
-                          ,vSwp.x
-                          ,vSwp.y
-                          ,vSwp.cx
-                          ,vSwp.cy
-                          ,SWP_ZORDER | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE
-                         );
+        m_bIconized = vSwp.fl & SWP_MINIMIZE;
+        ::WinEnableWindow(GetHwnd(), TRUE);
         vEvent.SetEventObject(this);
         GetEventHandler()->ProcessEvent(vEvent);
     }
@@ -384,7 +390,7 @@ bool wxFrame::Show(
             HWND                    hWndParent = GetHwndOf(GetParent());
 
             ::WinQueryWindowPos(hWndParent, &vSwp);
-            m_bIconized = vSwp & SWP_MINIMIZE;
+            m_bIconized = vSwp.fl & SWP_MINIMIZE;
             if (hWndParent)
                 ::WinSetWindowPos( hWndParent
                                   ,HWND_TOP
@@ -394,6 +400,7 @@ bool wxFrame::Show(
                                   ,vSwp.cy
                                   ,SWP_ZORDER | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE
                                  );
+            ::WinEnableWindow(hWndParent, TRUE);
         }
     }
     return TRUE;
@@ -529,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();
@@ -555,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()
@@ -736,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;
@@ -745,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
@@ -832,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
@@ -851,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
@@ -865,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