Да, это работает, на самом деле я делаю то же самое, что и в виде линейного графика, однако есть несколько недостатков / замечаний. Обработка сообщений немного сложна, поскольку некоторые сообщения не отправляются в соответствии с документацией, а некоторые обходные пути необходимы для обеспечения автономности элемента управления (не требуется помощь от родителя для отображения уведомлений).
Что вы делаете, это объявляете переменную в вашем CWnd-производном классе
CToolTipCtrl m_ToolTipCtrl;
CString m_ToolTipContent;
Затем сделайте это на OnCreate:
m_ToolTipCtrl.Create(this, TTS_ALWAYSTIP);
m_ToolTipCtrl.Activate(TRUE);
При желании вы также можете установить время задержки:
m_ToolTipCtrl.SetDelayTime(TTDT_AUTOPOP, -1);
m_ToolTipCtrl.SetDelayTime(TTDT_INITIAL, 0);
m_ToolTipCtrl.SetDelayTime(TTDT_RESHOW, 0);
Если вы хотите показать всплывающую подсказку (предположительно в OnMouseMove ()), используйте
m_ToolTipCtrl.Pop();
НО это работает только в сборках UNICODE. Поэтому, если вы все еще пользуетесь MBCS (как и я), всплывающая подсказка может отображаться только после определенной задержки.
Используйте это, чтобы установить текст всплывающей подсказки (также в OnMouseMove):
// Not using CToolTipCtrl::AddTool() because
// it redirects the messages to the parent
TOOLINFO ti = {0};
ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_IDISHWND; // Indicate that uId is handle to a control
ti.uId = (UINT_PTR)m_hWnd; // Handle to the control
ti.hwnd = m_hWnd; // Handle to window
// to receive the tooltip-messages
ti.hinst = ::AfxGetInstanceHandle();
ti.lpszText = LPSTR_TEXTCALLBACK;
ti.rect = <rectangle where, when the mouse is over it, the tooltip should be shown>;
m_ToolTipCtrl.SendMessage(TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
m_ToolTipCtrl.Activate(TRUE);
m_ToolTipContent = "my tooltip content";
Кроме того, вам нужно обработать TTNNeedText:
// The build-agnostic one doesn't work for some reason.
ON_NOTIFY_EX(TTN_NEEDTEXTA, 0, OnTTNNeedText)
ON_NOTIFY_EX(TTN_NEEDTEXTW, 0, OnTTNNeedText)
BOOL GraphCtrlOnTTNNeedText(UINT id, NMHDR* pTTTStruct, LRESULT* pResult)
{
TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pTTTStruct;
//pTTT->lpszText = "some test text";
//pTTT->lpszText = m_ToolTipContent;
strncpy_s(pTTT->lpszText, 80, m_ToolTipContent, _TRUNCATE);
return TRUE;
}
Вам придется немного изменить это и прочитать документацию по функциям и сообщениям, чтобы заставить это работать в вашем проекте, но да, это можно сделать.