]> git.saurik.com Git - wxWidgets.git/commitdiff
return the restored window size from GetSize() when window is minimized (for consiste...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 11 Feb 2007 00:21:06 +0000 (00:21 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 11 Feb 2007 00:21:06 +0000 (00:21 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44443 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/window.tex
include/wx/msw/toplevel.h
src/msw/toplevel.cpp

index 22223832c6b2be6ac9edcc3e0f35ac1c22f5832f..8acfbae8a25f2125569a3523ed802f2b2e24682b 100644 (file)
@@ -36,6 +36,7 @@ wxGTK:
 wxMSW:
 
 - Fixed infinite loop in wxThread::Wait() in console applications
+- Return the restored window size from GetSize() when window is minimized
 
 
 2.8.2
index a416fa51511177db69c0d77b390d38f80f450716..1271cec6e60ddc71d2dd772bccf73936490d7b7e 100644 (file)
@@ -869,9 +869,9 @@ a 2-element list {\tt (width, height)}.}
 
 \constfunc{wxSize}{GetClientSize}{\void}
 
-This gets the size of the window `client area' in pixels.
-The client area is the area which may be drawn on by the programmer,
-excluding title bar, border, scrollbars, etc.
+Returns the size of the window `client area' in pixels. The client area is the
+area which may be drawn on by the programmer, excluding title bar, border,
+scrollbars, etc.
 
 \wxheading{Parameters}
 
@@ -1246,8 +1246,11 @@ Returns the built-in scrollbar thumb size.
 
 \constfunc{wxSize}{GetSize}{\void}
 
-This gets the size of the entire window in pixels,
-including title bar, border, scrollbars, etc.
+Returns the size of the entire window in pixels, including title bar, border,
+scrollbars, etc.
+
+Note that if this window is a top-level one and it is currently minimized, the
+returned size is the restored window size, not the size of the window icon.
 
 \wxheading{Parameters}
 
index 44c5141a12d68753076fbe327570478f786e16d9..ff20508a5a8bfaa6945ae0c7611631d4afae1938 100644 (file)
@@ -55,7 +55,7 @@ public:
     virtual void SetIcon(const wxIcon& icon);
     virtual void SetIcons(const wxIconBundle& icons );
     virtual void Restore();
-    
+
     virtual void SetLayoutDirection(wxLayoutDirection dir);
 
 #ifndef __WXWINCE__
@@ -76,7 +76,7 @@ public:
     virtual bool SetTransparent(wxByte alpha);
     virtual bool CanSetTransparent();
 
-    
+
     // implementation from now on
     // --------------------------
 
@@ -127,6 +127,12 @@ protected:
     // common part of Iconize(), Maximize() and Restore()
     void DoShowWindow(int nShowCmd);
 
+    // override those to return the normal window coordinates even when the
+    // window is minimized
+    virtual void DoGetPosition(int *x, int *y) const;
+    virtual void DoGetSize(int *width, int *height) const;
+
+
     // is the window currently iconized?
     bool m_iconized;
 
index 97fec59a6a216a314abd1029e0696ce7a56d3382..cc9f0bcc87ff4add0812c721ea050faf8faa2f0d 100644 (file)
@@ -780,6 +780,75 @@ void wxTopLevelWindowMSW::SetLayoutDirection(wxLayoutDirection dir)
         wxTopLevelWindowBase::SetLayoutDirection(dir);
 }
 
+// ----------------------------------------------------------------------------
+// wxTopLevelWindowMSW geometry
+// ----------------------------------------------------------------------------
+
+void wxTopLevelWindowMSW::DoGetPosition(int *x, int *y) const
+{
+    if ( IsIconized() )
+    {
+        WINDOWPLACEMENT wp;
+        wp.length = sizeof(WINDOWPLACEMENT);
+        if ( ::GetWindowPlacement(GetHwnd(), &wp) )
+        {
+            RECT& rc = wp.rcNormalPosition;
+
+            // the position returned by GetWindowPlacement() is in workspace
+            // coordinates except for windows with WS_EX_TOOLWINDOW style
+            if ( !HasFlag(wxFRAME_TOOL_WINDOW) )
+            {
+                // we must use the correct display for the translation as the
+                // task bar might be shown on one display but not the other one
+                int n = wxDisplay::GetFromWindow(this);
+                wxDisplay dpy(n == wxNOT_FOUND ? 0 : n);
+                const wxPoint ptOfs = dpy.GetClientArea().GetPosition() -
+                                      dpy.GetGeometry().GetPosition();
+
+                rc.left += ptOfs.x;
+                rc.top += ptOfs.y;
+            }
+
+            if ( x )
+                *x = rc.left;
+            if ( y )
+                *y = rc.top;
+
+            return;
+        }
+
+        wxLogLastError(_T("GetWindowPlacement"));
+    }
+    //else: normal case
+
+    wxTopLevelWindowBase::DoGetPosition(x, y);
+}
+
+void wxTopLevelWindowMSW::DoGetSize(int *width, int *height) const
+{
+    if ( IsIconized() )
+    {
+        WINDOWPLACEMENT wp;
+        wp.length = sizeof(WINDOWPLACEMENT);
+        if ( ::GetWindowPlacement(GetHwnd(), &wp) )
+        {
+            const RECT& rc = wp.rcNormalPosition;
+
+            if ( width )
+                *width = rc.right - rc.left;
+            if ( height )
+                *height = rc.bottom - rc.top;
+
+            return;
+        }
+
+        wxLogLastError(_T("GetWindowPlacement"));
+    }
+    //else: normal case
+
+    wxTopLevelWindowBase::DoGetSize(width, height);
+}
+
 // ----------------------------------------------------------------------------
 // wxTopLevelWindowMSW fullscreen
 // ----------------------------------------------------------------------------