- 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 ( *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
- {
- // 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;
- }
- }
+ wxClientDC dc(const_cast<wxStaticText *>(this));
+ wxFont font(GetFont());
+ if (!font.IsOk())
+ font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+
+ dc.SetFont(font);
+
+ wxCoord widthTextMax, heightTextTotal;
+ dc.GetMultiLineTextExtent(GetLabelText(), &widthTextMax, &heightTextTotal);
+
+#ifdef __WXWINCE__
+ if ( widthTextMax )
+ widthTextMax += 2;
+#endif // __WXWINCE__
+
+ // It looks like the static control needs "slightly" more vertical space
+ // than the character height and while the text isn't actually truncated if
+ // we use just the minimal height, it is positioned differently than when
+ // the control has enough space and this result in the text in edit and
+ // static controls not being aligned when the controls themselves are. As
+ // this is something you really should be able to count on, increase the
+ // space allocated for the control so that the base lines do align
+ // correctly. Notice that while the above is true at least for the single
+ // line controls, there doesn't seem to do any harm to allocate two extra
+ // pixels in multi-line case neither so do it always for consistency.
+ //
+ // I still have no idea why exactly is this needed nor why should we use 2
+ // and not something else. This seems to work in all the configurations
+ // though (small/large fonts, different OS versions, ...) so just hard code
+ // it for now. If we need something better later it might be worth looking
+ // at the height of the text control returned by ::GetComboBoxInfo() as it
+ // seems to be the "minimal acceptable" height.
+ heightTextTotal += 2;