1///////////////////////////////////////////////////////////////////////////// 2// Name: src/msw/stattext.cpp 3// Purpose: wxStaticText 4// Author: Julian Smart 5// Modified by: 6// Created: 04/01/98 7// RCS-ID: $Id: stattext.cpp 40331 2006-07-25 18:47:39Z VZ $ 8// Copyright: (c) Julian Smart 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12// For compilers that support precompilation, includes "wx.h". 13#include "wx/wxprec.h" 14 15#ifdef __BORLANDC__ 16#pragma hdrstop 17#endif 18 19#if wxUSE_STATTEXT 20 21#include "wx/stattext.h" 22 23#ifndef WX_PRECOMP 24 #include "wx/event.h" 25 #include "wx/app.h" 26 #include "wx/brush.h" 27 #include "wx/dcclient.h" 28 #include "wx/settings.h" 29#endif 30 31#include "wx/msw/private.h" 32 33#if wxUSE_EXTENDED_RTTI 34WX_DEFINE_FLAGS( wxStaticTextStyle ) 35 36wxBEGIN_FLAGS( wxStaticTextStyle ) 37 // new style border flags, we put them first to 38 // use them for streaming out 39 wxFLAGS_MEMBER(wxBORDER_SIMPLE) 40 wxFLAGS_MEMBER(wxBORDER_SUNKEN) 41 wxFLAGS_MEMBER(wxBORDER_DOUBLE) 42 wxFLAGS_MEMBER(wxBORDER_RAISED) 43 wxFLAGS_MEMBER(wxBORDER_STATIC) 44 wxFLAGS_MEMBER(wxBORDER_NONE) 45 46 // old style border flags 47 wxFLAGS_MEMBER(wxSIMPLE_BORDER) 48 wxFLAGS_MEMBER(wxSUNKEN_BORDER) 49 wxFLAGS_MEMBER(wxDOUBLE_BORDER) 50 wxFLAGS_MEMBER(wxRAISED_BORDER) 51 wxFLAGS_MEMBER(wxSTATIC_BORDER) 52 wxFLAGS_MEMBER(wxBORDER) 53 54 // standard window styles 55 wxFLAGS_MEMBER(wxTAB_TRAVERSAL) 56 wxFLAGS_MEMBER(wxCLIP_CHILDREN) 57 wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) 58 wxFLAGS_MEMBER(wxWANTS_CHARS) 59 wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) 60 wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) 61 wxFLAGS_MEMBER(wxVSCROLL) 62 wxFLAGS_MEMBER(wxHSCROLL) 63 64 wxFLAGS_MEMBER(wxST_NO_AUTORESIZE) 65 wxFLAGS_MEMBER(wxALIGN_LEFT) 66 wxFLAGS_MEMBER(wxALIGN_RIGHT) 67 wxFLAGS_MEMBER(wxALIGN_CENTRE) 68 69wxEND_FLAGS( wxStaticTextStyle ) 70 71IMPLEMENT_DYNAMIC_CLASS_XTI(wxStaticText, wxControl,"wx/stattext.h") 72 73wxBEGIN_PROPERTIES_TABLE(wxStaticText) 74 wxPROPERTY( Label,wxString, SetLabel, GetLabel, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 75 wxPROPERTY_FLAGS( WindowStyle , wxStaticTextStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style 76wxEND_PROPERTIES_TABLE() 77 78wxBEGIN_HANDLERS_TABLE(wxStaticText) 79wxEND_HANDLERS_TABLE() 80 81wxCONSTRUCTOR_6( wxStaticText , wxWindow* , Parent , wxWindowID , Id , wxString , Label , wxPoint , Position , wxSize , Size , long , WindowStyle ) 82#else 83IMPLEMENT_DYNAMIC_CLASS(wxStaticText, wxControl) 84#endif 85 86bool wxStaticText::Create(wxWindow *parent, 87 wxWindowID id, 88 const wxString& label, 89 const wxPoint& pos, 90 const wxSize& size, 91 long style, 92 const wxString& name) 93{ 94 if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) ) 95 return false; 96 97 if ( !MSWCreateControl(wxT("STATIC"), label, pos, size) ) 98 return false; 99 100 return true; 101} 102 103wxBorder wxStaticText::GetDefaultBorder() const 104{ 105 return wxBORDER_NONE; 106} 107 108WXDWORD wxStaticText::MSWGetStyle(long style, WXDWORD *exstyle) const 109{ 110 WXDWORD msStyle = wxControl::MSWGetStyle(style, exstyle); 111 112 // translate the alignment flags to the Windows ones 113 // 114 // note that both wxALIGN_LEFT and SS_LEFT are equal to 0 so we shouldn't 115 // test for them using & operator 116 if ( style & wxALIGN_CENTRE ) 117 msStyle |= SS_CENTER; 118 else if ( style & wxALIGN_RIGHT ) 119 msStyle |= SS_RIGHT; 120 else 121 msStyle |= SS_LEFT; 122 123 // this style is necessary to receive mouse events 124 msStyle |= SS_NOTIFY; 125 126 return msStyle; 127} 128 129wxSize wxStaticText::DoGetBestSize() const 130{ 131 wxClientDC dc(wx_const_cast(wxStaticText *, this)); 132 wxFont font(GetFont()); 133 if (!font.Ok()) 134 font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); 135 136 dc.SetFont(font); 137 138 wxCoord widthTextMax, heightTextTotal; 139 dc.GetMultiLineTextExtent(GetLabelText(), &widthTextMax, &heightTextTotal); 140 141#ifdef __WXWINCE__ 142 if ( widthTextMax ) 143 widthTextMax += 2; 144#endif // __WXWINCE__ 145 146 // border takes extra space 147 // 148 // TODO: this is probably not wxStaticText-specific and should be moved 149 wxCoord border; 150 switch ( GetBorder() ) 151 { 152 case wxBORDER_STATIC: 153 case wxBORDER_SIMPLE: 154 border = 1; 155 break; 156 157 case wxBORDER_SUNKEN: 158 border = 2; 159 break; 160 161 case wxBORDER_RAISED: 162 case wxBORDER_DOUBLE: 163 border = 3; 164 break; 165 166 default: 167 wxFAIL_MSG( _T("unknown border style") ); 168 // fall through 169 170 case wxBORDER_NONE: 171 border = 0; 172 } 173 174 widthTextMax += 2*border; 175 heightTextTotal += 2*border; 176 177 wxSize best(widthTextMax, heightTextTotal); 178 CacheBestSize(best); 179 return best; 180} 181 182void wxStaticText::DoSetSize(int x, int y, int w, int h, int sizeFlags) 183{ 184 // we need to refresh the window after changing its size as the standard 185 // control doesn't always update itself properly 186 wxStaticTextBase::DoSetSize(x, y, w, h, sizeFlags); 187 188 Refresh(); 189} 190 191void wxStaticText::SetLabel(const wxString& label) 192{ 193 wxStaticTextBase::SetLabel(label); 194 195 // adjust the size of the window to fit to the label unless autoresizing is 196 // disabled 197 if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) ) 198 { 199 InvalidateBestSize(); 200 DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, 201 wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); 202 } 203} 204 205 206bool wxStaticText::SetFont(const wxFont& font) 207{ 208 bool ret = wxControl::SetFont(font); 209 210 // adjust the size of the window to fit to the label unless autoresizing is 211 // disabled 212 if ( !(GetWindowStyle() & wxST_NO_AUTORESIZE) ) 213 { 214 InvalidateBestSize(); 215 DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, 216 wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); 217 } 218 219 return ret; 220} 221 222#endif // wxUSE_STATTEXT 223