From c39eda949db88e0ac068e19f1898ad45b8c25ed0 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 26 Jul 1999 09:46:53 +0000 Subject: [PATCH] Centre() supports wxCENTER_FRAME flag now git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3138 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/window.tex | 4 +++- include/wx/window.h | 8 ++++---- src/common/wincmn.cpp | 43 ++++++++++++---------------------------- 3 files changed, 20 insertions(+), 35 deletions(-) diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex index fa0c7ec57a..8cb18c8594 100644 --- a/docs/latex/wx/window.tex +++ b/docs/latex/wx/window.tex @@ -137,7 +137,9 @@ Centres the window. \wxheading{Parameters} \docparam{direction}{Specifies the direction for the centering. May be {\tt wxHORIZONTAL}, {\tt wxVERTICAL}\rtfsp -or {\tt wxBOTH}.} +or {\tt wxBOTH}. It may also include {\tt wxCENTER\_FRAME} flag if you want to center the window +on its parent and not on the screen (actually, this flag is added automatically for all controls +because it makes no sense to center them on the screen)} \wxheading{Remarks} diff --git a/include/wx/window.h b/include/wx/window.h index 34049b6af0..7be5f5413b 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -257,10 +257,10 @@ public: } // centre with respect to the the parent window - void Centre( int direction = wxHORIZONTAL ); - void Center( int direction = wxHORIZONTAL ) { Centre(direction); } - void CentreOnParent(int direction = wxHORIZONTAL ); - void CenterOnParent(int direction = wxHORIZONTAL ) { CentreOnParent(direction); } + void Centre( int direction = wxBOTH ); + void Center( int direction = wxBOTH ) { Centre(direction); } + void CentreOnParent( int dir = wxBOTH ) { Centre(dir | wxCENTER_FRAME); } + void CenterOnParent( int dir = wxBOTH ) { Centre(dir | wxCENTER_FRAME); } // set window size to wrap around its children virtual void Fit(); diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 71028dc3ac..bf4921ff5a 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -314,44 +314,27 @@ void wxWindowBase::Centre(int direction) int width, height; GetSize(&width, &height); - int new_x = -1, - new_y = -1; + int xNew = -1, + yNew = -1; if ( direction & wxHORIZONTAL ) - new_x = (widthParent - width)/2; + xNew = (widthParent - width)/2; if ( direction & wxVERTICAL ) - new_y = (heightParent - height)/2; + yNew = (heightParent - height)/2; - Move(new_x, new_y); -} + // controls are always centered on their parent because it doesn't make + // sense to centre them on the screen + if ( (direction & wxCENTER_FRAME) || wxDynamicCast(this, wxControl) ) + { + // adjust to the parents client area origin + wxPoint posParent = parent->ClientToScreen(wxPoint(0, 0)); -// Center TopLevel windows over thier parent instead of the whole screen -void wxWindowBase::CentreOnParent(int direction) -{ - wxPoint ppos; - wxSize psze; - wxSize wsze; - wxWindow* parent = GetParent(); - int x, y; - - if (!parent || !IsTopLevel()) { - Centre(direction); - return; + xNew += posParent.x; + yNew += posParent.y; } - psze = parent->GetSize(); - ppos = parent->ClientToScreen(wxPoint(0,0)); - wsze = GetSize(); - - x = y = -1; - - if (direction == wxBOTH || direction == wxHORIZONTAL) - x = ppos.x + (psze.x - wsze.x)/2; - if (direction == wxBOTH || direction == wxVERTICAL) - y = ppos.y + (psze.y - wsze.y)/2; - - Move(x, y); + Move(xNew, yNew); } // fits the window around the children -- 2.47.2