diff --git a/include/wx/msw/dc.h b/include/wx/msw/dc.h index 13a549c82e..5a82ad5609 100644 --- a/include/wx/msw/dc.h +++ b/include/wx/msw/dc.h @@ -80,6 +80,7 @@ public: wxCoord *descent = NULL, wxCoord *externalLeading = NULL, wxFont *theFont = NULL) const; + virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const; virtual bool CanDrawBitmap() const; virtual bool CanGetTextExtent() const; diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index b83bf5ba55..4871d1f8de 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -1611,6 +1611,47 @@ void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, } } + +// Each element of the array will be the width of the string up to and +// including the coresoponding character in text. + +bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const +{ + static int maxLenText = -1; + static int maxWidth = -1; + int fit = 0; + SIZE sz = {0,0}; + int stlen = text.Length(); + + if (maxLenText == -1) + { + // Win9x and WinNT+ have different limits + int version = wxGetOsVersion(); + maxLenText = version == wxWINDOWS_NT ? 65535 : 8192; + maxWidth = version == wxWINDOWS_NT ? INT_MAX : 32767; + } + + widths.Empty(); + widths.Add(0, stlen); // fill the array with zeros + + if (!::GetTextExtentExPoint(GetHdc(), + text.c_str(), // string to check + wxMin(stlen, maxLenText), + maxWidth, + &fit, // receives count of chars + // that will fit + widths.begin(), // array to fill + &sz)) { + // API failed + wxLogLastError(wxT("GetTextExtentExPoint")); + return false; + } + return true; +} + + + + void wxDC::SetMapMode(int mode) { WXMICROWIN_CHECK_HDC