From: Vadim Zeitlin Date: Sat, 25 Nov 2006 14:52:52 +0000 (+0000) Subject: added wxWindow::GetWindowBorderSize() X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/333d70525c5f8caff27c8847160daf5fd5ccef46 added wxWindow::GetWindowBorderSize() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43639 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/latex/wx/window.tex b/docs/latex/wx/window.tex index 0df9ac310d..cc3f221ea8 100644 --- a/docs/latex/wx/window.tex +++ b/docs/latex/wx/window.tex @@ -1373,6 +1373,14 @@ that size. \helpref{GetClientSize}{wxwindowgetclientsize} +\membersection{wxWindow::GetWindowBorderSize}\label{wxwindowgetwindowbordersize} + +\constfunc{wxSize}{GetWindowBorderSize}{\void} + +Returns the size of the left/right and top/bottom borders of this window in x +and y components of the result respectively. + + \membersection{wxWindow::GetWindowStyleFlag}\label{wxwindowgetwindowstyleflag} \constfunc{long}{GetWindowStyleFlag}{\void} diff --git a/include/wx/window.h b/include/wx/window.h index 5a098ee0f3..acff5abc8e 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -473,6 +473,11 @@ public: return wxSize( wxMax( client.x, best.x ), wxMax( client.y, best.y ) ); } + // return the size of the left/right and top/bottom borders in x and y + // components of the result respectively + virtual wxSize GetWindowBorderSize() const; + + // window state // ------------ diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index d597dd9c22..5a5ca17891 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -587,6 +587,76 @@ wxSize wxWindowBase::DoGetBestSize() const return best; } +// helper of GetWindowBorderSize(): as many ports don't implement support for +// wxSYS_BORDER/EDGE_X/Y metrics in their wxSystemSettings, use hard coded +// fallbacks in this case +static wxGetMetricOrDefault(wxSystemMetric what) +{ + int rc = wxSystemSettings::GetMetric(what); + if ( rc == -1 ) + { + switch ( what ) + { + case wxSYS_BORDER_X: + case wxSYS_BORDER_Y: + // 2D border is by default 1 pixel wide + rc = 1; + break; + + case wxSYS_EDGE_X: + case wxSYS_EDGE_Y: + // 3D borders are by default 2 pixels + rc = 2; + break; + + default: + wxFAIL_MSG( _T("unexpected wxGetMetricOrDefault() argument") ); + rc = 0; + } + } + + return rc; +} + +wxSize wxWindowBase::GetWindowBorderSize() const +{ + wxSize size; + + switch ( GetBorder() ) + { + case wxBORDER_NONE: + // nothing to do, size is already (0, 0) + break; + + case wxBORDER_SIMPLE: + case wxBORDER_STATIC: + size.x = wxGetMetricOrDefault(wxSYS_BORDER_X); + size.y = wxGetMetricOrDefault(wxSYS_BORDER_Y); + break; + + case wxBORDER_SUNKEN: + case wxBORDER_RAISED: + size.x = wxMax(wxGetMetricOrDefault(wxSYS_EDGE_X), + wxGetMetricOrDefault(wxSYS_BORDER_X)); + size.y = wxMax(wxGetMetricOrDefault(wxSYS_EDGE_Y), + wxGetMetricOrDefault(wxSYS_BORDER_Y)); + break; + + case wxBORDER_DOUBLE: + size.x = wxGetMetricOrDefault(wxSYS_EDGE_X) + + wxGetMetricOrDefault(wxSYS_BORDER_X); + size.y = wxGetMetricOrDefault(wxSYS_EDGE_Y) + + wxGetMetricOrDefault(wxSYS_BORDER_Y); + break; + + default: + wxFAIL_MSG(_T("Unknown border style.")); + break; + } + + // we have borders on both sides + return size*2; +} wxSize wxWindowBase::GetEffectiveMinSize() const {