X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e70b4f10951f806a7b6cf7e65317a21421e2f3a6..046d682f0f684977b7ba933a128f5c84e06ded0e:/src/msw/stattext.cpp diff --git a/src/msw/stattext.cpp b/src/msw/stattext.cpp index a6d3d92786..466fb5484d 100644 --- a/src/msw/stattext.cpp +++ b/src/msw/stattext.cpp @@ -23,64 +23,65 @@ #if wxUSE_STATTEXT #ifndef WX_PRECOMP -#include "wx/event.h" -#include "wx/app.h" -#include "wx/brush.h" + #include "wx/event.h" + #include "wx/app.h" + #include "wx/brush.h" + #include "wx/dcclient.h" + #include "wx/settings.h" #endif #include "wx/stattext.h" #include "wx/msw/private.h" -#include #if wxUSE_EXTENDED_RTTI WX_DEFINE_FLAGS( wxStaticTextStyle ) -WX_BEGIN_FLAGS( wxStaticTextStyle ) +wxBEGIN_FLAGS( wxStaticTextStyle ) // new style border flags, we put them first to // use them for streaming out - WX_FLAGS_MEMBER(wxBORDER_SIMPLE) - WX_FLAGS_MEMBER(wxBORDER_SUNKEN) - WX_FLAGS_MEMBER(wxBORDER_DOUBLE) - WX_FLAGS_MEMBER(wxBORDER_RAISED) - WX_FLAGS_MEMBER(wxBORDER_STATIC) - WX_FLAGS_MEMBER(wxBORDER_NONE) - + 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 - WX_FLAGS_MEMBER(wxSIMPLE_BORDER) - WX_FLAGS_MEMBER(wxSUNKEN_BORDER) - WX_FLAGS_MEMBER(wxDOUBLE_BORDER) - WX_FLAGS_MEMBER(wxRAISED_BORDER) - WX_FLAGS_MEMBER(wxSTATIC_BORDER) - WX_FLAGS_MEMBER(wxNO_BORDER) + 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 - WX_FLAGS_MEMBER(wxTAB_TRAVERSAL) - WX_FLAGS_MEMBER(wxCLIP_CHILDREN) - WX_FLAGS_MEMBER(wxTRANSPARENT_WINDOW) - WX_FLAGS_MEMBER(wxWANTS_CHARS) - WX_FLAGS_MEMBER(wxNO_FULL_REPAINT_ON_RESIZE) - WX_FLAGS_MEMBER(wxALWAYS_SHOW_SB ) - WX_FLAGS_MEMBER(wxVSCROLL) - WX_FLAGS_MEMBER(wxHSCROLL) - - WX_FLAGS_MEMBER(wxST_NO_AUTORESIZE) - WX_FLAGS_MEMBER(wxALIGN_LEFT) - WX_FLAGS_MEMBER(wxALIGN_RIGHT) - WX_FLAGS_MEMBER(wxALIGN_CENTRE) - -WX_END_FLAGS( wxStaticTextStyle ) + 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) + + wxFLAGS_MEMBER(wxST_NO_AUTORESIZE) + wxFLAGS_MEMBER(wxALIGN_LEFT) + wxFLAGS_MEMBER(wxALIGN_RIGHT) + wxFLAGS_MEMBER(wxALIGN_CENTRE) + +wxEND_FLAGS( wxStaticTextStyle ) IMPLEMENT_DYNAMIC_CLASS_XTI(wxStaticText, wxControl,"wx/stattext.h") -WX_BEGIN_PROPERTIES_TABLE(wxStaticText) - WX_PROPERTY( Label,wxString, SetLabel, GetLabel, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - WX_PROPERTY_FLAGS( WindowStyle , wxStaticTextStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style -WX_END_PROPERTIES_TABLE() +wxBEGIN_PROPERTIES_TABLE(wxStaticText) + wxPROPERTY( Label,wxString, SetLabel, GetLabel, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY_FLAGS( WindowStyle , wxStaticTextStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style +wxEND_PROPERTIES_TABLE() -WX_BEGIN_HANDLERS_TABLE(wxStaticText) -WX_END_HANDLERS_TABLE() +wxBEGIN_HANDLERS_TABLE(wxStaticText) +wxEND_HANDLERS_TABLE() -WX_CONSTRUCTOR_6( wxStaticText , wxWindow* , Parent , wxWindowID , Id , wxString , Label , wxPoint , Position , wxSize , Size , long , WindowStyle ) +wxCONSTRUCTOR_6( wxStaticText , wxWindow* , Parent , wxWindowID , Id , wxString , Label , wxPoint , Position , wxSize , Size , long , WindowStyle ) #else IMPLEMENT_DYNAMIC_CLASS(wxStaticText, wxControl) #endif @@ -94,12 +95,12 @@ bool wxStaticText::Create(wxWindow *parent, const wxString& name) { if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) ) - return FALSE; + return false; if ( !MSWCreateControl(wxT("STATIC"), label, pos, size) ) - return FALSE; + return false; - return TRUE; + return true; } wxBorder wxStaticText::GetDefaultBorder() const @@ -125,73 +126,43 @@ WXDWORD wxStaticText::MSWGetStyle(long style, WXDWORD *exstyle) const return msStyle; } -wxSize wxStaticText::DoGetBestSize() const +WXHBRUSH wxStaticText::DoMSWControlColor(WXHDC pDC, wxColour colBg) { - wxString text(wxGetWindowText(GetHWND())); - - int widthTextMax = 0, widthLine, - heightTextTotal = 0, heightLineDefault = 0, heightLine = 0; - - bool lastWasAmpersand = FALSE; - - wxString curLine; - for ( const wxChar *pc = text; ; pc++ ) + // If this control has a non-standard fg colour but still has the standard + // bg then we need to also give it a non-standard bg otherwise the fg + // setting has no effect. + WXHBRUSH hbr = wxControl::DoMSWControlColor(pDC, colBg); + if (!hbr && m_hasFgCol) { - if ( *pc == wxT('\n') || *pc == wxT('\0') ) - { - if ( !curLine ) - { - // we can't use GetTextExtent - it will return 0 for both width - // and height and an empty line should count in height - // calculation - if ( !heightLineDefault ) - heightLineDefault = heightLine; - if ( !heightLineDefault ) - GetTextExtent(_T("W"), NULL, &heightLineDefault); - - heightTextTotal += heightLineDefault; - } - else - { - GetTextExtent(curLine, &widthLine, &heightLine); - if ( widthLine > widthTextMax ) - widthTextMax = widthLine; - heightTextTotal += heightLine; - } - - if ( *pc == wxT('\n') ) - { - curLine.Empty(); - } - else - { - // the end of string - break; - } - } - else + hbr = MSWGetBgBrushForChild(pDC, this); + if (!hbr) { - // we shouldn't take into account the '&' which just introduces the - // mnemonic characters and so are not shown on the screen -- except - // when it is preceded by another '&' in which case it stands for a - // literal ampersand - if ( *pc == _T('&') ) - { - if ( !lastWasAmpersand ) - { - lastWasAmpersand = TRUE; - - // skip the statement adding pc to curLine below - continue; - } - - // it is a literal ampersand - lastWasAmpersand = FALSE; - } - - curLine += *pc; + HDC hdc = (HDC)pDC; + wxColour bg = GetBackgroundColour(); + ::SetBkColor(hdc, wxColourToRGB(bg)); + wxBrush *brush = wxTheBrushList->FindOrCreateBrush(bg, wxSOLID); + hbr = (WXHBRUSH)brush->GetResourceHandle(); } } + return hbr; +} + +wxSize wxStaticText::DoGetBestSize() const +{ + wxClientDC dc(wx_const_cast(wxStaticText *, this)); + wxFont font(GetFont()); + if (!font.Ok()) + font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + + dc.SetFont(font); + + wxCoord widthTextMax, heightTextTotal; + dc.GetMultiLineTextExtent(GetLabel(), &widthTextMax, &heightTextTotal); + +#ifdef __WXWINCE__ + if ( widthTextMax ) + widthTextMax += 2; +#endif // __WXWINCE__ return wxSize(widthTextMax, heightTextTotal); } @@ -213,7 +184,9 @@ void wxStaticText::SetLabel(const wxString& label) // disabled if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) ) { - DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); + InvalidateBestSize(); + DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, + wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); } } @@ -226,7 +199,9 @@ bool wxStaticText::SetFont(const wxFont& font) // disabled if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) ) { - DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); + InvalidateBestSize(); + DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, + wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); } return ret;