]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/toplevel.cpp
[#1577388] - fix for scaling in wxImage.
[wxWidgets.git] / src / os2 / toplevel.cpp
index e45bedf8a973e855b09a7282a1150fa7af64c037..94819c9f83a6d1acf61868552477323a45ed972f 100644 (file)
     #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"
     #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
@@ -602,7 +639,7 @@ bool wxTopLevelWindowOS2::Create(
     if (GetExtraStyle() & wxTOPLEVEL_EX_DIALOG)
     {
         //
-        // We have different dialog templates to allows creation of dialogs
+        // We have different dialog templates to allow creation of dialogs
         // with & without captions under OS2indows, resizeable or not (but a
         // resizeable dialog always has caption - otherwise it would look too
         // strange)
@@ -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);
     }