X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a4a162522b875bc7cb23f1d165703f71bd7010f7..86171954ec23d82d4095b16cc4477509573152d6:/src/os2/toplevel.cpp diff --git a/src/os2/toplevel.cpp b/src/os2/toplevel.cpp index 139e96ccfb..6be4e147df 100644 --- a/src/os2/toplevel.cpp +++ b/src/os2/toplevel.cpp @@ -56,6 +56,7 @@ wxWindowList wxModelessWindows; extern void wxAssociateWinWithHandle( HWND hWnd ,wxWindowOS2* pWin ); +bool wxTopLevelWindowOS2::m_sbInitialized = FALSE; // ============================================================================ // wxTopLevelWindowMSW implementation @@ -269,6 +270,19 @@ bool wxTopLevelWindowOS2::CreateDialog( nX = (vSizeDpy.x - nWidth) / 2; nY = (vSizeDpy.y - nHeight) / 2; } + m_backgroundColour.Set(wxString("LIGHT GREY")); + + LONG lColor = (LONG)m_backgroundColour.GetPixel(); + + if (!::WinSetPresParam( m_hWnd + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + )) + { + return FALSE; + } + ::WinSetWindowPos( GetHwnd() ,HWND_TOP ,nX @@ -277,10 +291,7 @@ bool wxTopLevelWindowOS2::CreateDialog( ,nHeight ,SWP_MOVE | SWP_SIZE | SWP_ZORDER | SWP_SHOW ); - if (!rsTitle.IsNull()) - { - ::WinSetWindowText(GetHwnd(), rsTitle.c_str()); - } + m_hFrame = m_hWnd; SubclassWin(m_hWnd); return TRUE; } // end of wxTopLevelWindowOS2::CreateDialog @@ -355,7 +366,7 @@ bool wxTopLevelWindowOS2::CreateFrame( wxAssociateWinWithHandle(m_hWnd, this); wxAssociateWinWithHandle(m_hFrame, this); - m_backgroundColour.Set(wxString("GREY")); + m_backgroundColour.Set(wxString("MEDIUM GREY")); LONG lColor = (LONG)m_backgroundColour.GetPixel(); @@ -407,6 +418,14 @@ bool wxTopLevelWindowOS2::CreateFrame( wxLogError("Error sizing frame. Error: %s\n", sError); return FALSE; } + lStyle = ::WinQueryWindowULong( m_hWnd + ,QWL_STYLE + ); + lStyle |= WS_CLIPCHILDREN; + ::WinSetWindowULong( m_hWnd + ,QWL_STYLE + ,lStyle + ); return TRUE; } // end of wxTopLevelWindowOS2::CreateFrame @@ -497,6 +516,12 @@ void wxTopLevelWindowOS2::AlterChildPos() RECTL vRect; SWP vSwp; + if (GetAutoLayout) + // + // Auto layouts taken care of elsewhere + // + return; + ::WinQueryWindowRect(GetHwnd(), &vRect); for (wxWindowList::Node* pNode = GetChildren().GetFirst(); pNode; @@ -533,10 +558,92 @@ void wxTopLevelWindowOS2::AlterChildPos() void wxTopLevelWindowOS2::UpdateInternalSize( wxWindow* pChild -, int nHeight +, int nChildWidth +, int nChildHeight ) { - pChild->MoveChildren(m_vSwpClient.cy - nHeight); + int nWidthAdjust = 0; + int nHeightAdjust = 0; + int nPosX; + int nPosY; + bool bNewYSize = FALSE; + bool bNewXSize = FALSE; + + // + // Under OS/2, if we have a srolled window as the child, the + // scrollbars will be SIBLINGS of the scrolled window. So, in + // order to be able to display the scrollbars properly we have to + // resize the scrolled window. Of course, that means dealing with + // child windows of that window as well, because OS/2 does not + // tend to put them in the right place. + // + if (nChildHeight != m_vSwpClient.cy) + bNewYSize = TRUE; + if (nChildWidth != m_vSwpClient.cx) + bNewXSize = TRUE; + if (bNewXSize || bNewYSize) + pChild->SetSize( 0 + ,0 + ,nChildWidth + ,nChildHeight + ); + if(bNewYSize) + { + // + // This is needed SetSize will mess up the OS/2 child window + // positioning because we position in wxWindows coordinates, + // not OS/2 coordinates. + // + pChild->MoveChildren(m_vSwpClient.cy - nChildHeight); + pChild->Refresh(); + } + + if (pChild->GetScrollBarHorz() != NULLHANDLE || + pChild->GetScrollBarVert() != NULLHANDLE) + { + if (bNewXSize || bNewYSize) + { + pChild->GetSize( &nChildWidth + ,&nChildHeight + ); + if (pChild->GetScrollBarHorz() != NULLHANDLE) + nHeightAdjust = 20; + if (pChild->GetScrollBarVert() != NULLHANDLE) + nWidthAdjust = 20; + pChild->GetPosition( &nPosX + ,&nPosY + ); + ::WinSetWindowPos( pChild->GetHWND() + ,HWND_TOP + ,nPosX + ,nPosY + nHeightAdjust + ,nChildWidth - nWidthAdjust + ,nChildHeight - nHeightAdjust + ,SWP_MOVE | SWP_SIZE + ); + } + if (bNewYSize && !m_sbInitialized) + { + // + // Only need to readjust child control positions of + // scrolled windows once on initialization. After that + // the sizing takes care of things itself. + // + pChild->MoveChildren(nHeightAdjust); + m_sbInitialized = TRUE; + } + if (bNewXSize || bNewYSize) + { + // + // Always refresh to keep scollbars visible. They are + // children of the Toplevel window, not the child panel. + // + pChild->Refresh(); + } + } + // + // This brings the internal "last size" up to date. + // ::WinQueryWindowPos(GetHwnd(), &m_vSwpClient); } // end of wxTopLevelWindowOS2::UpdateInternalSize @@ -588,7 +695,12 @@ void wxTopLevelWindowOS2::DoShowWindow( int nShowCmd ) { - ::WinShowWindow(m_hFrame, (BOOL)nShowCmd); + ::WinShowWindow(m_hFrame, (BOOL)(nShowCmd & SWP_SHOW)); + + // + // Need to artificially send a size event as wxApps often expect to do some + // final child control sizing + SendSizeEvent(); m_bIconized = nShowCmd == SWP_MINIMIZE; } // end of wxTopLevelWindowOS2::DoShowWindow @@ -604,12 +716,12 @@ bool wxTopLevelWindowOS2::Show( { if (m_bMaximizeOnShow) { - nShowCmd = SWP_SHOW; + nShowCmd = SWP_MAXIMIZE; m_bMaximizeOnShow = FALSE; } else { - nShowCmd = SWP_HIDE; + nShowCmd = SWP_SHOW; } } else // hide @@ -712,6 +824,21 @@ void wxTopLevelWindowOS2::Restore() DoShowWindow(SWP_RESTORE); } // end of wxTopLevelWindowOS2::Restore +// generate an artificial resize event +void wxTopLevelWindowOS2::SendSizeEvent() +{ + if (!m_bIconized) + { + RECTL vRect = wxGetWindowRect(GetHwnd()); + + (void)::WinPostMsg( m_hFrame + ,WM_SIZE + ,MPFROM2SHORT(vRect.xRight - vRect.xLeft, vRect.yTop - vRect.yBottom) + ,MPFROM2SHORT(vRect.xRight - vRect.xLeft, vRect.yTop - vRect.yBottom) + ); + } +} // end of wxTopLevelWindowOS2::SendSizeEvent + // ---------------------------------------------------------------------------- // wxTopLevelWindowOS2 fullscreen // ----------------------------------------------------------------------------