From: Vadim Zeitlin Date: Tue, 14 Mar 2006 15:45:12 +0000 (+0000) Subject: added GetScreenPosition/Rect() which always return the screen coordinates of the... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/3c81c9aafbe0018b9d44005767040ec3ebe65349 added GetScreenPosition/Rect() which always return the screen coordinates of the window (for child windows and TLWs alike) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38071 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex index ce35f652a9..d6ac077e2e 100644 --- a/docs/latex/wx/window.tex +++ b/docs/latex/wx/window.tex @@ -1111,9 +1111,9 @@ windows. \wxheading{Parameters} -\docparam{x}{Receives the x position of the window.} +\docparam{x}{Receives the x position of the window if non-\NULL.} -\docparam{y}{Receives the y position of the window.} +\docparam{y}{Receives the y position of the window if non-\NULL.} \pythonnote{In place of a single overloaded method name, wxPython implements the following methods:\par @@ -1133,12 +1133,53 @@ method:\par }} +\wxheading{See also} + +\helpref{GetScreenPosition}{wxwindowgetscreenposition} + + \membersection{wxWindow::GetRect}\label{wxwindowgetrect} \constfunc{virtual wxRect}{GetRect}{\void} Returns the size and position of the window as a \helpref{wxRect}{wxrect} object. +\wxheading{See also} + +\helpref{GetScreenRect}{wxwindowgetscreenrect} + + +\membersection{wxWindow::GetScreenPosition}\label{wxwindowgetscreenposition} + +\constfunc{virtual void}{GetScreenPosition}{\param{int* }{x}, \param{int* }{y}} + +\constfunc{wxPoint}{GetScreenPosition}{\void} + +Returns the window position in screen coordinates, whether the window is a +child window or a top level one. + +\wxheading{Parameters} + +\docparam{x}{Receives the x position of the window on the screen if non-\NULL.} + +\docparam{y}{Receives the y position of the window on the screen if non-\NULL.} + +\wxheading{See also} + +\helpref{GetPosition}{wxwindowgetposition} + + +\membersection{wxWindow::GetScreenRect}\label{wxwindowgetscreenrect} + +\constfunc{virtual wxRect}{GetScreenRect}{\void} + +Returns the size and position of the window on the screen as a +\helpref{wxRect}{wxrect} object. + +\wxheading{See also} + +\helpref{GetRect}{wxwindowgetrect} + \membersection{wxWindow::GetScrollPos}\label{wxwindowgetscrollpos} diff --git a/include/wx/toplevel.h b/include/wx/toplevel.h index b1b2f3c7fd..0359691c0b 100644 --- a/include/wx/toplevel.h +++ b/include/wx/toplevel.h @@ -224,6 +224,12 @@ protected: // add support for wxCENTRE_ON_SCREEN virtual void DoCentre(int dir); + // no need to do client to screen translation to get our position in screen + // coordinates: this is already the case + virtual void DoGetScreenPosition(int *x, int *y) const + { + return DoGetPosition(x, y); + } // test whether this window makes part of the frame // (menubar, toolbar and statusbar are excluded from automatic layout) diff --git a/include/wx/window.h b/include/wx/window.h index 007ea874d9..f2de3e0e03 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -222,6 +222,8 @@ public: void Move(const wxPoint& pt, int flags = wxSIZE_USE_EXISTING) { Move(pt.x, pt.y, flags); } + void SetPosition(const wxPoint& pt) { Move(pt); } + // Z-order virtual void Raise() = 0; virtual void Lower() = 0; @@ -236,18 +238,30 @@ public: void SetClientSize(const wxRect& rect) { SetClientSize( rect.width, rect.height ); } - // get the window position and/or size (pointers may be NULL) + // get the window position (pointers may be NULL): notice that it is in + // client coordinates for child windows and screen coordinates for the + // top level ones, use GetScreenPosition() if you need screen + // coordinates for all kinds of windows void GetPosition( int *x, int *y ) const { DoGetPosition(x, y); } wxPoint GetPosition() const { - int w, h; - DoGetPosition(&w, &h); + int x, y; + DoGetPosition(&x, &y); - return wxPoint(w, h); + return wxPoint(x, y); } - void SetPosition( const wxPoint& pt ) { Move( pt ) ; } + // get the window position in screen coordinates + void GetScreenPosition(int *x, int *y) const { DoGetScreenPosition(x, y); } + wxPoint GetScreenPosition() const + { + int x, y; + DoGetScreenPosition(&x, &y); + return wxPoint(x, y); + } + + // get the window size (pointers may be NULL) void GetSize( int *w, int *h ) const { DoGetSize(w, h); } wxSize GetSize() const { @@ -256,22 +270,32 @@ public: return wxSize(w, h); } + void GetClientSize( int *w, int *h ) const { DoGetClientSize(w, h); } + wxSize GetClientSize() const + { + int w, h; + DoGetClientSize(&w, &h); + + return wxSize(w, h); + } + + // get the position and size at once wxRect GetRect() const { int x, y, w, h; - GetPosition(& x, & y); - GetSize(& w, & h); + GetPosition(&x, &y); + GetSize(&w, &h); return wxRect(x, y, w, h); } - void GetClientSize( int *w, int *h ) const { DoGetClientSize(w, h); } - wxSize GetClientSize() const + wxRect GetScreenRect() const { - int w, h; - DoGetClientSize(& w, & h); + int x, y, w, h; + GetScreenPosition(&x, &y); + GetSize(&w, &h); - return wxSize(w, h); + return wxRect(x, y, w, h); } // get the origin of the client area of the window relative to the @@ -1258,9 +1282,10 @@ protected: virtual void DoReleaseMouse() = 0; // retrieve the position/size of the window - virtual void DoGetPosition( int *x, int *y ) const = 0; - virtual void DoGetSize( int *width, int *height ) const = 0; - virtual void DoGetClientSize( int *width, int *height ) const = 0; + virtual void DoGetPosition(int *x, int *y) const = 0; + virtual void DoGetScreenPosition(int *x, int *y) const; + virtual void DoGetSize(int *width, int *height) const = 0; + virtual void DoGetClientSize(int *width, int *height) const = 0; // get the size which best suits the window: for a control, it would be // the minimal size which doesn't truncate the control, for a panel - the diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 3f0393a3e1..420d37678c 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -715,6 +715,18 @@ wxSize wxWindowBase::DoGetVirtualSize() const return size; } +void wxWindowBase::DoGetScreenPosition(int *x, int *y) const +{ + // screen position is the same as (0, 0) in client coords for non TLWs (and + // TLWs override this method) + if ( x ) + *x = 0; + if ( y ) + *y = 0; + + return ClientToScreen(x, y); +} + // ---------------------------------------------------------------------------- // show/hide/enable/disable the window // ----------------------------------------------------------------------------