wxMSW:
- Fixed infinite loop in wxThread::Wait() in console applications
+- Return the restored window size from GetSize() when window is minimized
2.8.2
\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}
\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}
virtual void SetIcon(const wxIcon& icon);
virtual void SetIcons(const wxIconBundle& icons );
virtual void Restore();
-
+
virtual void SetLayoutDirection(wxLayoutDirection dir);
#ifndef __WXWINCE__
virtual bool SetTransparent(wxByte alpha);
virtual bool CanSetTransparent();
-
+
// implementation from now on
// --------------------------
// 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;
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
// ----------------------------------------------------------------------------