X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3120eccfe2b3f02207c4d14f14f76dfd319db309..931d6a47c32a5b4c283243cb553ce71ee2b535d5:/src/msw/statbox.cpp diff --git a/src/msw/statbox.cpp b/src/msw/statbox.cpp index 2047e8bd4c..678a2594cf 100644 --- a/src/msw/statbox.cpp +++ b/src/msw/statbox.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 04/01/98 -// RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -33,6 +32,7 @@ #include "wx/dcclient.h" #include "wx/dcmemory.h" #include "wx/image.h" + #include "wx/sizer.h" #endif #include "wx/notebook.h" @@ -54,58 +54,6 @@ // wxWin macros // ---------------------------------------------------------------------------- -#if wxUSE_EXTENDED_RTTI -WX_DEFINE_FLAGS( wxStaticBoxStyle ) - -wxBEGIN_FLAGS( wxStaticBoxStyle ) - // new style border flags, we put them first to - // use them for streaming out - wxFLAGS_MEMBER(wxBORDER_SIMPLE) - wxFLAGS_MEMBER(wxBORDER_SUNKEN) - wxFLAGS_MEMBER(wxBORDER_DOUBLE) - wxFLAGS_MEMBER(wxBORDER_RAISED) - wxFLAGS_MEMBER(wxBORDER_STATIC) - wxFLAGS_MEMBER(wxBORDER_NONE) - - // old style border flags - wxFLAGS_MEMBER(wxSIMPLE_BORDER) - wxFLAGS_MEMBER(wxSUNKEN_BORDER) - wxFLAGS_MEMBER(wxDOUBLE_BORDER) - wxFLAGS_MEMBER(wxRAISED_BORDER) - wxFLAGS_MEMBER(wxSTATIC_BORDER) - wxFLAGS_MEMBER(wxBORDER) - - // standard window styles - wxFLAGS_MEMBER(wxTAB_TRAVERSAL) - wxFLAGS_MEMBER(wxCLIP_CHILDREN) - wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) - wxFLAGS_MEMBER(wxWANTS_CHARS) - wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) - wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) - wxFLAGS_MEMBER(wxVSCROLL) - wxFLAGS_MEMBER(wxHSCROLL) - -wxEND_FLAGS( wxStaticBoxStyle ) - -IMPLEMENT_DYNAMIC_CLASS_XTI(wxStaticBox, wxControl,"wx/statbox.h") - -wxBEGIN_PROPERTIES_TABLE(wxStaticBox) - wxPROPERTY( Label,wxString, SetLabel, GetLabel, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY_FLAGS( WindowStyle , wxStaticBoxStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style -/* - TODO PROPERTIES : - label -*/ -wxEND_PROPERTIES_TABLE() - -wxBEGIN_HANDLERS_TABLE(wxStaticBox) -wxEND_HANDLERS_TABLE() - -wxCONSTRUCTOR_6( wxStaticBox , wxWindow* , Parent , wxWindowID , Id , wxString , Label , wxPoint , Position , wxSize , Size , long , WindowStyle ) -#else -IMPLEMENT_DYNAMIC_CLASS(wxStaticBox, wxControl) -#endif - // ============================================================================ // implementation // ============================================================================ @@ -133,7 +81,13 @@ bool wxStaticBox::Create(wxWindow *parent, #ifndef __WXWINCE__ if (!wxSystemOptions::IsFalse(wxT("msw.staticbox.optimized-paint"))) + { Connect(wxEVT_PAINT, wxPaintEventHandler(wxStaticBox::OnPaint)); + + // Our OnPaint() completely erases our background, so don't do it in + // WM_ERASEBKGND too to avoid flicker. + SetBackgroundStyle(wxBG_STYLE_PAINT); + } #endif // !__WXWINCE__ return true; @@ -150,11 +104,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; @@ -170,6 +128,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()); @@ -179,8 +140,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; } @@ -312,8 +284,14 @@ WXHRGN wxStaticBox::MSWGetRegionWithoutChildren() HRGN hrgn = ::CreateRectRgn(rc.left, rc.top, rc.right + 1, rc.bottom + 1); bool foundThis = false; - // iterate over all child windows (not just wxWindows but all windows) - for ( HWND child = ::GetWindow(GetHwndOf(GetParent()), GW_CHILD); + // Iterate over all sibling windows as in the old wxWidgets API the + // controls appearing inside the static box were created as its siblings + // and not children. This is now deprecated but should still work. + // + // Also notice that we must iterate over all windows, not just all + // wxWindows, as there may be composite windows etc. + HWND child; + for ( child = ::GetWindow(GetHwndOf(GetParent()), GW_CHILD); child; child = ::GetWindow(child, GW_HWNDNEXT) ) { @@ -365,6 +343,23 @@ WXHRGN wxStaticBox::MSWGetRegionWithoutChildren() } } + // Also iterate over all children of the static box, we need to clip them + // out as well. + for ( child = ::GetWindow(GetHwnd(), GW_CHILD); + child; + child = ::GetWindow(child, GW_HWNDNEXT) ) + { + if ( !::IsWindowVisible(child) ) + { + // if the window isn't visible then it doesn't need clipped + continue; + } + + ::GetWindowRect(child, &rc); + AutoHRGN hrgnChild(::CreateRectRgnIndirect(&rc)); + ::CombineRgn(hrgn, hrgn, hrgnChild, RGN_DIFF); + } + return (WXHRGN)hrgn; } @@ -401,6 +396,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 @@ -512,16 +508,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))