Подсказки для настраиваемого элемента управления с использованием CToolTipCtrl? (МФЦ) - PullRequest
3 голосов
/ 26 апреля 2010

Я создал собственный элемент управления, полученный из CWnd (линейная диаграмма), и мне интересно, могу ли я использовать CToolTipCtrl для отображения подсказок для точек на графике. Если да, то как я могу это сделать?

Кстати, когда я наведу курсор мыши на точку, должен появиться прямоугольник, содержащий строку с информацией о значениях точки.

1 Ответ

5 голосов
/ 26 апреля 2010

Да, это работает, на самом деле я делаю то же самое, что и в виде линейного графика, однако есть несколько недостатков / замечаний. Обработка сообщений немного сложна, поскольку некоторые сообщения не отправляются в соответствии с документацией, а некоторые обходные пути необходимы для обеспечения автономности элемента управления (не требуется помощь от родителя для отображения уведомлений).

Что вы делаете, это объявляете переменную в вашем 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;
}

Вам придется немного изменить это и прочитать документацию по функциям и сообщениям, чтобы заставить это работать в вашем проекте, но да, это можно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...