From 53758b0fc16d5aa5b2e1e3346a113cc1db677a83 Mon Sep 17 00:00:00 2001 From: Stefan Neis Date: Wed, 4 Jan 2006 23:27:16 +0000 Subject: [PATCH] Fixed sizing and positioning. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36688 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/os2/toplevel.cpp | 53 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/src/os2/toplevel.cpp b/src/os2/toplevel.cpp index 25196f3b23..0bd4b9e388 100644 --- a/src/os2/toplevel.cpp +++ b/src/os2/toplevel.cpp @@ -421,6 +421,9 @@ bool wxTopLevelWindowOS2::CreateDialog( ULONG ulDlgTemplate, return false; } + // Convert to OS/2 coordinates + nY = GetOS2ParentHeight(pParent) - nY - nHeight; + ::WinSetWindowPos( GetHwnd() ,HWND_TOP ,nX @@ -530,17 +533,49 @@ bool wxTopLevelWindowOS2::CreateFrame( const wxString& rsTitle, // Now size everything. If adding a menu the client will need to be resized. // - if (pParent) + if (!OS2GetCreateWindowCoords( rPos + ,rSize + ,nX + ,nY + ,nWidth + ,nHeight + )) { - nY = pParent->GetSize().y - (nY + nHeight); + nX = nWidth = (int)CW_USEDEFAULT; } - else - { - RECTL vRect; - ::WinQueryWindowRect(HWND_DESKTOP, &vRect); - nY = vRect.yTop - (nY + nHeight); + // + // We can't use CW_USEDEFAULT here as we're not calling CreateWindow() + // and passing CW_USEDEFAULT to MoveWindow() results in resizing the + // window to (0, 0) size which breaks quite a lot of things, e.g. the + // sizer calculation in wxSizer::Fit() + // + if (nWidth == (int)CW_USEDEFAULT) + { + // + // The exact number doesn't matter, the dialog will be resized + // again soon anyhow but it should be big enough to allow + // calculation relying on "totalSize - clientSize > 0" work, i.e. + // at least greater than the title bar height + // + nWidth = nHeight = 100; } + if (nX == (int)CW_USEDEFAULT) + { + // + // Centre it on the screen for now - what else can we do? + // TODO: We could try FCF_SHELLPOSITION but it will require moving + // things around a bit. + // + wxSize vSizeDpy = wxGetDisplaySize(); + + nX = (vSizeDpy.x - nWidth) / 2; + nY = (vSizeDpy.y - nHeight) / 2; + } + + // Convert to OS/2 coordinates + nY = GetOS2ParentHeight(pParent) - nY - nHeight; + if (!::WinSetWindowPos( m_hFrame ,HWND_TOP ,nX @@ -753,10 +788,6 @@ bool wxTopLevelWindowOS2::Show( bool bShow ) ::WinQueryWindowPos(m_hWnd, &vSwp); ::WinEnableWindow(m_hFrame, TRUE); - // - // Deal with children - // - MoveChildren(m_vSwpClient.cy - vSwp.cy); vEvent.SetEventObject(this); GetEventHandler()->ProcessEvent(vEvent); }