X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/90e572f1e5af1e51fd14e2e1e6f64fa3e258e590..39b5648ed2b396e7a7e67806dbb2d3b6452dafe6:/src/os2/toplevel.cpp?ds=sidebyside diff --git a/src/os2/toplevel.cpp b/src/os2/toplevel.cpp index b57f915139..94819c9f83 100644 --- a/src/os2/toplevel.cpp +++ b/src/os2/toplevel.cpp @@ -24,9 +24,10 @@ #pragma hdrstop #endif +#include "wx/toplevel.h" + #ifndef WX_PRECOMP #include "wx/app.h" - #include "wx/toplevel.h" #include "wx/dialog.h" #include "wx/string.h" #include "wx/log.h" @@ -34,9 +35,10 @@ #include "wx/frame.h" #include "wx/control.h" #include "wx/containr.h" // wxSetFocusToChild() + #include "wx/settings.h" + #include "wx/module.h" // wxSetFocusToChild() #endif //WX_PRECOMP -#include "wx/module.h" // wxSetFocusToChild() #include "wx/os2/private.h" // ---------------------------------------------------------------------------- @@ -233,7 +235,7 @@ WXDWORD wxTopLevelWindowOS2::OS2GetStyle( lMsflags |= FCF_MINBUTTON; if (lStyle & wxMAXIMIZE_BOX) lMsflags |= FCF_MAXBUTTON; - if (lStyle & wxTHICK_FRAME) + if (lStyle & wxRESIZE_BORDER) lMsflags |= FCF_DLGBORDER; if (lStyle & wxSYSTEM_MENU) lMsflags |= FCF_SYSMENU; @@ -249,7 +251,7 @@ WXDWORD wxTopLevelWindowOS2::OS2GetStyle( if (lStyle & wxTINY_CAPTION_HORIZ) lMsflags |= FCF_TASKLIST; - if ((lStyle & wxTHICK_FRAME) == 0) + if ((lStyle & wxRESIZE_BORDER) == 0) lMsflags |= FCF_BORDER; if (lStyle & wxFRAME_TOOL_WINDOW) *pdwExflags = kFrameToolWindow; @@ -407,7 +409,7 @@ bool wxTopLevelWindowOS2::CreateDialog( ULONG ulDlgTemplate, nX = (vSizeDpy.x - nWidth) / 2; nY = (vSizeDpy.y - nHeight) / 2; } - m_backgroundColour.Set(wxString(wxT("LIGHT GREY"))); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); LONG lColor = (LONG)m_backgroundColour.GetPixel(); @@ -420,6 +422,9 @@ bool wxTopLevelWindowOS2::CreateDialog( ULONG ulDlgTemplate, return false; } + // Convert to OS/2 coordinates + nY = GetOS2ParentHeight(pParent) - nY - nHeight; + ::WinSetWindowPos( GetHwnd() ,HWND_TOP ,nX @@ -502,7 +507,7 @@ bool wxTopLevelWindowOS2::CreateFrame( const wxString& rsTitle, wxAssociateWinWithHandle(m_hWnd, this); wxAssociateWinWithHandle(m_hFrame, this); - m_backgroundColour.Set(wxString(wxT("MEDIUM GREY"))); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); LONG lColor = (LONG)m_backgroundColour.GetPixel(); @@ -529,17 +534,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 + + // + // 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) { - RECTL vRect; + // + // 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(); - ::WinQueryWindowRect(HWND_DESKTOP, &vRect); - nY = vRect.yTop - (nY + nHeight); + 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 @@ -752,10 +789,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); }