+void wxToolTip::Add(WXHWND hWnd)
+{
+ HWND hwnd = (HWND)hWnd;
+
+ wxToolInfo ti(hwnd);
+
+ // as we store our text anyhow, it seems useless to waste system memory
+ // by asking the tooltip ctrl to remember it too - instead it will send
+ // us TTN_NEEDTEXT (via WM_NOTIFY) when it is about to be shown
+ ti.hwnd = hwnd;
+ ti.lpszText = LPSTR_TEXTCALLBACK;
+ // instead of: ti.lpszText = (char *)m_text.c_str();
+
+ if ( !SendTooltipMessage(GetToolTipCtrl(), TTM_ADDTOOL, 0, &ti) )
+ {
+ wxLogDebug(_T("Failed to create the tooltip '%s'"), m_text.c_str());
+ }
+ else
+ {
+ // check for multiline toopltip
+ int index = m_text.Find(_T('\n'));
+
+ if ( index != wxNOT_FOUND )
+ {
+#if _WIN32_IE >= 0x0300
+ if ( wxTheApp->GetComCtl32Version() >= 470 )
+ {
+ // use TTM_SETMAXWIDTH to make tooltip multiline using the
+ // extent of its first line as max value
+ HFONT hfont = (HFONT)SendTooltipMessage(GetToolTipCtrl(),
+ WM_GETFONT,
+ 0, 0);
+ if ( !hfont )
+ {
+ hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
+ if ( !hfont )
+ {
+ wxLogLastError(wxT("GetStockObject(DEFAULT_GUI_FONT)"));
+ }
+ }
+
+ HDC hdc = CreateCompatibleDC(NULL);
+ if ( !hdc )
+ {
+ wxLogLastError(wxT("CreateCompatibleDC(NULL)"));
+ }
+
+ if ( !SelectObject(hdc, hfont) )
+ {
+ wxLogLastError(wxT("SelectObject(hfont)"));
+ }
+
+ SIZE sz;
+ if ( !GetTextExtentPoint(hdc, m_text, index, &sz) )
+ {
+ wxLogLastError(wxT("GetTextExtentPoint"));
+ }
+
+ DeleteDC(hdc);
+
+ SendTooltipMessage(GetToolTipCtrl(), TTM_SETMAXTIPWIDTH,
+ 0, (void *)sz.cx);
+ }
+#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(" "));
+ }
+ }
+}
+