]>
git.saurik.com Git - wxWidgets.git/blob - src/msw/stattext.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/msw/stattext.cpp 
   3 // Purpose:     wxStaticText 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  13 #pragma implementation "stattext.h" 
  16 // For compilers that support precompilation, includes "wx.h". 
  17 #include "wx/wxprec.h" 
  31 #include "wx/stattext.h" 
  32 #include "wx/msw/private.h" 
  35 #if wxUSE_EXTENDED_RTTI 
  36 WX_DEFINE_FLAGS( wxStaticTextStyle 
) 
  38 wxBEGIN_FLAGS( wxStaticTextStyle 
) 
  39     // new style border flags, we put them first to 
  40     // use them for streaming out 
  41     wxFLAGS_MEMBER(wxBORDER_SIMPLE
) 
  42     wxFLAGS_MEMBER(wxBORDER_SUNKEN
) 
  43     wxFLAGS_MEMBER(wxBORDER_DOUBLE
) 
  44     wxFLAGS_MEMBER(wxBORDER_RAISED
) 
  45     wxFLAGS_MEMBER(wxBORDER_STATIC
) 
  46     wxFLAGS_MEMBER(wxBORDER_NONE
) 
  48     // old style border flags 
  49     wxFLAGS_MEMBER(wxSIMPLE_BORDER
) 
  50     wxFLAGS_MEMBER(wxSUNKEN_BORDER
) 
  51     wxFLAGS_MEMBER(wxDOUBLE_BORDER
) 
  52     wxFLAGS_MEMBER(wxRAISED_BORDER
) 
  53     wxFLAGS_MEMBER(wxSTATIC_BORDER
) 
  54     wxFLAGS_MEMBER(wxBORDER
) 
  56     // standard window styles 
  57     wxFLAGS_MEMBER(wxTAB_TRAVERSAL
) 
  58     wxFLAGS_MEMBER(wxCLIP_CHILDREN
) 
  59     wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW
) 
  60     wxFLAGS_MEMBER(wxWANTS_CHARS
) 
  61     wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE
) 
  62     wxFLAGS_MEMBER(wxALWAYS_SHOW_SB 
) 
  63     wxFLAGS_MEMBER(wxVSCROLL
) 
  64     wxFLAGS_MEMBER(wxHSCROLL
) 
  66     wxFLAGS_MEMBER(wxST_NO_AUTORESIZE
) 
  67     wxFLAGS_MEMBER(wxALIGN_LEFT
) 
  68     wxFLAGS_MEMBER(wxALIGN_RIGHT
) 
  69     wxFLAGS_MEMBER(wxALIGN_CENTRE
) 
  71 wxEND_FLAGS( wxStaticTextStyle 
) 
  73 IMPLEMENT_DYNAMIC_CLASS_XTI(wxStaticText
, wxControl
,"wx/stattext.h") 
  75 wxBEGIN_PROPERTIES_TABLE(wxStaticText
) 
  76         wxPROPERTY( Label
,wxString
, SetLabel
, GetLabel
, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  77     wxPROPERTY_FLAGS( WindowStyle 
, wxStaticTextStyle 
, long , SetWindowStyleFlag 
, GetWindowStyleFlag 
, , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style 
  78 wxEND_PROPERTIES_TABLE() 
  80 wxBEGIN_HANDLERS_TABLE(wxStaticText
) 
  81 wxEND_HANDLERS_TABLE() 
  83 wxCONSTRUCTOR_6( wxStaticText 
, wxWindow
* , Parent 
, wxWindowID 
, Id 
, wxString 
, Label 
, wxPoint 
, Position 
, wxSize 
, Size 
, long , WindowStyle 
)  
  85 IMPLEMENT_DYNAMIC_CLASS(wxStaticText
, wxControl
) 
  88 bool wxStaticText::Create(wxWindow 
*parent
, 
  90                           const wxString
& label
, 
  96     if ( !CreateControl(parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
) ) 
  99     if ( !MSWCreateControl(wxT("STATIC"), label
, pos
, size
) ) 
 105 wxBorder 
wxStaticText::GetDefaultBorder() const 
 107     return wxBORDER_NONE
; 
 110 WXDWORD 
wxStaticText::MSWGetStyle(long style
, WXDWORD 
*exstyle
) const 
 112     WXDWORD msStyle 
= wxControl::MSWGetStyle(style
, exstyle
); 
 114     // translate the alignment flags to the Windows ones 
 116     // note that both wxALIGN_LEFT and SS_LEFT are equal to 0 so we shouldn't 
 117     // test for them using & operator 
 118     if ( style 
& wxALIGN_CENTRE 
) 
 119         msStyle 
|= SS_CENTER
; 
 120     else if ( style 
& wxALIGN_RIGHT 
) 
 128 wxSize 
wxStaticText::DoGetBestSize() const 
 130     wxString 
text(wxGetWindowText(GetHWND())); 
 132     int widthTextMax 
= 0, widthLine
, 
 133         heightTextTotal 
= 0, heightLineDefault 
= 0, heightLine 
= 0; 
 135     bool lastWasAmpersand 
= FALSE
; 
 138     for ( const wxChar 
*pc 
= text
; ; pc
++ ) 
 140         if ( *pc 
== wxT('\n') || *pc 
== wxT('\0') ) 
 144                 // we can't use GetTextExtent - it will return 0 for both width 
 145                 // and height and an empty line should count in height 
 147                 if ( !heightLineDefault 
) 
 148                     heightLineDefault 
= heightLine
; 
 149                 if ( !heightLineDefault 
) 
 150                     GetTextExtent(_T("W"), NULL
, &heightLineDefault
); 
 152                 heightTextTotal 
+= heightLineDefault
; 
 156                 GetTextExtent(curLine
, &widthLine
, &heightLine
); 
 157                 if ( widthLine 
> widthTextMax 
) 
 158                     widthTextMax 
= widthLine
; 
 159                 heightTextTotal 
+= heightLine
; 
 162             if ( *pc 
== wxT('\n') ) 
 174             // we shouldn't take into account the '&' which just introduces the 
 175             // mnemonic characters and so are not shown on the screen -- except 
 176             // when it is preceded by another '&' in which case it stands for a 
 178             if ( *pc 
== _T('&') ) 
 180                 if ( !lastWasAmpersand 
) 
 182                     lastWasAmpersand 
= TRUE
; 
 184                     // skip the statement adding pc to curLine below 
 188                 // it is a literal ampersand 
 189                 lastWasAmpersand 
= FALSE
; 
 196     if(widthTextMax
) widthTextMax 
+= 2; 
 198     return wxSize(widthTextMax
, heightTextTotal
); 
 201 void wxStaticText::DoSetSize(int x
, int y
, int w
, int h
, int sizeFlags
) 
 203     // we need to refresh the window after changing its size as the standard 
 204     // control doesn't always update itself properly 
 205     wxStaticTextBase::DoSetSize(x
, y
, w
, h
, sizeFlags
); 
 210 void wxStaticText::SetLabel(const wxString
& label
) 
 212     wxStaticTextBase::SetLabel(label
); 
 214     // adjust the size of the window to fit to the label unless autoresizing is 
 216     if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE
) ) 
 218         DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH 
| wxSIZE_AUTO_HEIGHT
); 
 223 bool wxStaticText::SetFont(const wxFont
& font
) 
 225     bool ret 
= wxControl::SetFont(font
); 
 227     // adjust the size of the window to fit to the label unless autoresizing is 
 229     if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE
) ) 
 231         DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH 
| wxSIZE_AUTO_HEIGHT
); 
 237 #endif // wxUSE_STATTEXT