X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3d407edab0eebcda0f5df070d57d5f8f8e3a9881..dc3d889d0bb65725e521963d4f47019884a6d7c8:/src/os2/frame.cpp diff --git a/src/os2/frame.cpp b/src/os2/frame.cpp index 44a4888de1..18269f66d1 100644 --- a/src/os2/frame.cpp +++ b/src/os2/frame.cpp @@ -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 @@ -363,14 +376,7 @@ bool wxFrame::Show( ::WinQueryWindowPos(GetHwnd(), &vSwp); m_bIconized = vSwp.fl & SWP_MINIMIZE; - ::WinSetWindowPos( (HWND) GetHWND() - ,HWND_TOP - ,vSwp.x - ,vSwp.y - ,vSwp.cx - ,vSwp.cy - ,SWP_ZORDER | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE - ); + ::WinEnableWindow(GetHwnd(), TRUE); vEvent.SetEventObject(this); GetEventHandler()->ProcessEvent(vEvent); } @@ -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 @@ -850,10 +916,12 @@ bool wxFrame::OS2Create( { return FALSE; } + + wxWndHook = NULL; // // Send anything to initialize the frame // - ::WinSendMsg( GetHwnd() + ::WinSendMsg( hFrame ,WM_UPDATEFRAME ,(MPARAM)FCF_TASKLIST ,(MPARAM)0 @@ -862,7 +930,7 @@ bool wxFrame::OS2Create( // // Now size everything. If adding a menu the client will need to be resized. // - if (!::WinSetWindowPos( GetHwnd() + if (!::WinSetWindowPos( hFrame ,HWND_TOP ,nX ,nY @@ -873,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