+ // check for multiline toopltip
+ int index = m_text.Find(_T('\n'));
+
+ if ( index != wxNOT_FOUND )
+ {
+#ifdef TTM_SETMAXTIPWIDTH
+ if ( wxApp::GetComCtl32Version() >= 470 )
+ {
+ // use TTM_SETMAXTIPWIDTH to make tooltip multiline using the
+ // extent of its first line as max value
+ HFONT hfont = (HFONT)
+ SendTooltipMessage(GetToolTipCtrl(), WM_GETFONT, 0);
+
+ if ( !hfont )
+ {
+ hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
+ if ( !hfont )
+ {
+ wxLogLastError(wxT("GetStockObject(DEFAULT_GUI_FONT)"));
+ }
+ }
+
+ MemoryHDC hdc;
+ if ( !hdc )
+ {
+ wxLogLastError(wxT("CreateCompatibleDC(NULL)"));
+ }
+
+ if ( !SelectObject(hdc, hfont) )
+ {
+ wxLogLastError(wxT("SelectObject(hfont)"));
+ }
+
+ // find the width of the widest line
+ int max = 0;
+ wxStringTokenizer tokenizer(m_text, _T("\n"));
+ wxString token = tokenizer.GetNextToken();
+ while (token.length())
+ {
+ SIZE sz;
+ if ( !::GetTextExtentPoint32(hdc, token.wx_str(), token.length(), &sz) )
+ {
+ wxLogLastError(wxT("GetTextExtentPoint32"));
+ }
+ if ( sz.cx > max )
+ max = sz.cx;
+
+ token = tokenizer.GetNextToken();
+ }
+
+ // only set a new width if it is bigger than the current setting
+ if ( max > SendTooltipMessage(GetToolTipCtrl(),
+ TTM_GETMAXTIPWIDTH, 0) )
+ {
+ SendTooltipMessage(GetToolTipCtrl(), TTM_SETMAXTIPWIDTH,
+ wxUIntToPtr(max));
+ }
+ }
+ else
+#endif // comctl32.dll >= 4.70
+ {
+ // replace the '\n's with spaces because otherwise they appear as
+ // unprintable characters in the tooltip string
+ m_text.Replace(_T("\n"), _T(" "));
+ ti.lpszText = (wxChar *)m_text.wx_str(); // const_cast
+
+ if ( !SendTooltipMessage(GetToolTipCtrl(), TTM_ADDTOOL, &ti) )
+ {
+ wxLogDebug(_T("Failed to create the tooltip '%s'"), m_text.c_str());
+ }
+ }
+ }