X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5ad24e6dbbb86afb068fd1537c3719298dd1c5ec..43c42c18d36c703a88b1b7b697bac27fe5608eca:/src/msw/statbox.cpp diff --git a/src/msw/statbox.cpp b/src/msw/statbox.cpp index 213ac65d6a..3a2d88de4c 100644 --- a/src/msw/statbox.cpp +++ b/src/msw/statbox.cpp @@ -33,6 +33,7 @@ #include "wx/dcclient.h" #include "wx/dcmemory.h" #include "wx/image.h" + #include "wx/sizer.h" #endif #include "wx/notebook.h" @@ -98,11 +99,15 @@ WXDWORD wxStaticBox::MSWGetStyle(long style, WXDWORD *exstyle) const if ( exstyle ) { #ifndef __WXWINCE__ + // We may have children inside this static box, so use this style for + // TAB navigation to work if we ever use IsDialogMessage() to implement + // it (currently we don't because it's too buggy and implement TAB + // navigation ourselves, but this could change in the future). + *exstyle |= WS_EX_CONTROLPARENT; + if (wxSystemOptions::IsFalse(wxT("msw.staticbox.optimized-paint"))) - *exstyle = WS_EX_TRANSPARENT; - else + *exstyle |= WS_EX_TRANSPARENT; #endif - *exstyle = 0; } styleWin |= BS_GROUPBOX; @@ -118,6 +123,9 @@ WXDWORD wxStaticBox::MSWGetStyle(long style, WXDWORD *exstyle) const wxSize wxStaticBox::DoGetBestSize() const { + wxSize best; + + // Calculate the size needed by the label int cx, cy; wxGetCharSize(GetHWND(), &cx, &cy, GetFont()); @@ -127,8 +135,19 @@ wxSize wxStaticBox::DoGetBestSize() const wBox += 3*cx; int hBox = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); - wxSize best(wBox, hBox); - CacheBestSize(best); + // If there is a sizer then the base best size is the sizer's minimum + if (GetSizer() != NULL) + { + wxSize cm(GetSizer()->CalcMin()); + best = ClientToWindowSize(cm); + // adjust for a long label if needed + best.x = wxMax(best.x, wBox); + } + // otherwise the best size falls back to the label size + else + { + best = wxSize(wBox, hBox); + } return best; } @@ -349,6 +368,7 @@ void wxStaticBox::PaintForeground(wxDC& dc, const RECT& rc) wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); MSWDefWindowProc(WM_PAINT, (WPARAM)GetHdcOf(*impl), 0); +#if wxUSE_UXTHEME // when using XP themes, neither setting the text colour nor transparent // background mode doesn't change anything: the static box def window proc // still draws the label in its own colours, so we need to redraw the text @@ -460,16 +480,17 @@ void wxStaticBox::PaintForeground(wxDC& dc, const RECT& rc) if ( !rtl ) { RECT rc2 = { x, 0, x + width, y }; - ::DrawText(hdc, label.wx_str(), label.length(), &rc2, + ::DrawText(hdc, label.t_str(), label.length(), &rc2, drawTextFlags); } else // RTL { RECT rc2 = { x, 0, x - width, y }; - ::DrawText(hdc, label.wx_str(), label.length(), &rc2, + ::DrawText(hdc, label.t_str(), label.length(), &rc2, drawTextFlags | DT_RTLREADING); } } +#endif // wxUSE_UXTHEME } void wxStaticBox::OnPaint(wxPaintEvent& WXUNUSED(event)) @@ -528,26 +549,4 @@ void wxStaticBox::OnPaint(wxPaintEvent& WXUNUSED(event)) #endif // !__WXWINCE__ - -wxPoint wxStaticBox::GetClientAreaOrigin() const -{ - // See: http://msdn.microsoft.com/en-us/library/aa511279.aspx - wxPoint pt = ConvertDialogToPixels(wxPoint(6,11)); - return pt; -} - - -void wxStaticBox::DoGetClientSize(int *width, int *height) const -{ - // See: http://msdn.microsoft.com/en-us/library/aa511279.aspx - wxPoint lr = ConvertDialogToPixels(wxPoint(6,7)); - wxPoint ul = GetClientAreaOrigin(); - wxSize sz = GetSize(); - - if (width) - *width = sz.x - ul.x - lr.x; - if (height) - *height = sz.y - ul.y - lr.x; -} - #endif // wxUSE_STATBOX