From d43eb2a0d52d9cf09c73d596076d4fd8c81ef0df Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 11 Feb 2007 00:21:06 +0000 Subject: [PATCH] return the restored window size from GetSize() when window is minimized (for consistency with wxGTK and also for convenience) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44443 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + docs/latex/wx/window.tex | 13 +++++--- include/wx/msw/toplevel.h | 10 ++++-- src/msw/toplevel.cpp | 69 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 7 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 22223832c6..8acfbae8a2 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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 diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex index a416fa5151..1271cec6e6 100644 --- a/docs/latex/wx/window.tex +++ b/docs/latex/wx/window.tex @@ -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} diff --git a/include/wx/msw/toplevel.h b/include/wx/msw/toplevel.h index 44c5141a12..ff20508a5a 100644 --- a/include/wx/msw/toplevel.h +++ b/include/wx/msw/toplevel.h @@ -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; diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index 97fec59a6a..cc9f0bcc87 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -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 // ---------------------------------------------------------------------------- -- 2.45.2