1
/////////////////////////////////////////////////////////////////////////////
2
// Name: src/msw/stattext.cpp
3
// Purpose: wxStaticText
4
// Author: Julian Smart
7
// Copyright: (c) Julian Smart
8
// Licence: wxWindows licence
9
/////////////////////////////////////////////////////////////////////////////
11
// For compilers that support precompilation, includes "wx.h".
12
#include "wx/wxprec.h"
20
#include "wx/stattext.h"
26
#include "wx/dcclient.h"
27
#include "wx/settings.h"
30
#include "wx/msw/private.h"
32
bool wxStaticText::Create(wxWindow *parent,
34
const wxString& label,
40
if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) )
43
if ( !MSWCreateControl(wxT("STATIC"), wxEmptyString, pos, size) )
46
// we set the label here and not through MSWCreateControl() because we
47
// need to do many operation on it for ellipsization&markup support
50
// as we didn't pass the correct label to MSWCreateControl(), it didn't set
51
// the initial size correctly -- do it now
55
// NOTE: if the label contains ampersand characters which are interpreted as
56
// accelerators, they will be rendered (at least on WinXP) only if the
57
// static text is placed inside a window class which correctly handles
58
// focusing by TAB traversal (e.g. wxPanel).
63
WXDWORD wxStaticText::MSWGetStyle(long style, WXDWORD *exstyle) const
65
WXDWORD msStyle = wxControl::MSWGetStyle(style, exstyle);
67
// translate the alignment flags to the Windows ones
69
// note that both wxALIGN_LEFT and SS_LEFT are equal to 0 so we shouldn't
70
// test for them using & operator
71
if ( style & wxALIGN_CENTRE )
73
else if ( style & wxALIGN_RIGHT )
79
// this style is necessary to receive mouse events
80
// Win NT and later have the SS_ENDELLIPSIS style which is useful to us:
81
if (wxGetOsVersion() == wxOS_WINDOWS_NT)
83
// for now, add the SS_ENDELLIPSIS style if wxST_ELLIPSIZE_END is given;
84
// we may need to remove it later in ::SetLabel() if the given label
86
if ( style & wxST_ELLIPSIZE_END )
87
msStyle |= SS_ENDELLIPSIS;
89
#endif // SS_ENDELLIPSIS
96
wxSize wxStaticText::DoGetBestClientSize() const
98
wxClientDC dc(const_cast<wxStaticText *>(this));
99
wxFont font(GetFont());
101
font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
105
wxCoord widthTextMax, heightTextTotal;
106
dc.GetMultiLineTextExtent(GetLabelText(), &widthTextMax, &heightTextTotal);
111
#endif // __WXWINCE__
113
// It looks like the static control needs "slightly" more vertical space
114
// than the character height and while the text isn't actually truncated if
115
// we use just the minimal height, it is positioned differently than when
116
// the control has enough space and this result in the text in edit and
117
// static controls not being aligned when the controls themselves are. As
118
// this is something you really should be able to count on, increase the
119
// space allocated for the control so that the base lines do align
120
// correctly. Notice that while the above is true at least for the single
121
// line controls, there doesn't seem to do any harm to allocate two extra
122
// pixels in multi-line case neither so do it always for consistency.
124
// I still have no idea why exactly is this needed nor why should we use 2
125
// and not something else. This seems to work in all the configurations
126
// though (small/large fonts, different OS versions, ...) so just hard code
127
// it for now. If we need something better later it might be worth looking
128
// at the height of the text control returned by ::GetComboBoxInfo() as it
129
// seems to be the "minimal acceptable" height.
130
heightTextTotal += 2;
132
return wxSize(widthTextMax, heightTextTotal);
135
void wxStaticText::DoSetSize(int x, int y, int w, int h, int sizeFlags)
137
// note: we first need to set the size and _then_ call UpdateLabel
138
wxStaticTextBase::DoSetSize(x, y, w, h, sizeFlags);
140
#ifdef SS_ENDELLIPSIS
141
// do we need to ellipsize the contents?
142
long styleReal = ::GetWindowLong(GetHwnd(), GWL_STYLE);
143
if ( !(styleReal & SS_ENDELLIPSIS) )
145
// we don't have SS_ENDELLIPSIS style:
146
// we need to (eventually) do ellipsization ourselves
149
//else: we don't or the OS will do it for us
150
#endif // SS_ENDELLIPSIS
152
// we need to refresh the window after changing its size as the standard
153
// control doesn't always update itself properly
157
void wxStaticText::SetLabel(const wxString& label)
159
#ifdef SS_ENDELLIPSIS
160
long styleReal = ::GetWindowLong(GetHwnd(), GWL_STYLE);
161
if ( HasFlag(wxST_ELLIPSIZE_END) &&
162
wxGetOsVersion() == wxOS_WINDOWS_NT )
164
// adding SS_ENDELLIPSIS or SS_ENDELLIPSIS "disables" the correct
165
// newline handling in static texts: the newlines in the labels are
166
// shown as square. Thus we don't use it even on newer OS when
167
// the static label contains a newline.
168
if ( label.Contains(wxT('\n')) )
169
styleReal &= ~SS_ENDELLIPSIS;
171
styleReal |= SS_ENDELLIPSIS;
173
::SetWindowLong(GetHwnd(), GWL_STYLE, styleReal);
175
else // style not supported natively
177
styleReal &= ~SS_ENDELLIPSIS;
178
::SetWindowLong(GetHwnd(), GWL_STYLE, styleReal);
180
#endif // SS_ENDELLIPSIS
182
// save the label in m_labelOrig with both the markup (if any) and
183
// the mnemonics characters (if any)
186
#ifdef SS_ENDELLIPSIS
187
if ( styleReal & SS_ENDELLIPSIS )
188
DoSetLabel(GetLabel());
190
#endif // SS_ENDELLIPSIS
191
DoSetLabel(GetEllipsizedLabel());
193
// adjust the size of the window to fit to the label unless autoresizing is
195
if ( !HasFlag(wxST_NO_AUTORESIZE) &&
196
!IsEllipsized() ) // if ellipsize is ON, then we don't want to get resized!
198
InvalidateBestSize();
199
DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord,
200
wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
204
bool wxStaticText::SetFont(const wxFont& font)
206
bool ret = wxControl::SetFont(font);
208
// adjust the size of the window to fit to the label unless autoresizing is
210
if ( !HasFlag(wxST_NO_AUTORESIZE) )
212
InvalidateBestSize();
213
DoSetSize(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord,
214
wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT);
220
// for wxST_ELLIPSIZE_* support:
222
wxString wxStaticText::DoGetLabel() const
224
return wxGetWindowText(GetHwnd());
227
void wxStaticText::DoSetLabel(const wxString& str)
229
SetWindowText(GetHwnd(), str.c_str());
233
#endif // wxUSE_STATTEXT