Как изменить цвет текста и фона тултипа?

Автор: Александр Шаргин

Версия текста: 1.0

Для этой цели предусмотрены специальные сообщения TTM_SETTIPTEXTCOLOR и TTM_SETTIPBKCOLOR. После того как тултип создан, их можно отправлять с использованием функции SendMessage. При этом в wParam записывается новое значение цвета, а содержимое lParam игнорируется. Рассмотрим пример, в котором для тултипа задаётся красный текст на чёрном фоне.

SendMessage(hTip, TTM_SETTIPTEXTCOLOR, (WPARAM)RGB(255,0,0), 0);
SendMessage(hTip, TTM_SETTIPBKCOLOR, (WPARAM)RGB(0,0,0), 0);

В MFC для той же цели используются функции CToolTipCtrl::SetTipTextColor и CToolTipCtrl::SetTipBkColor, принимающие единственный параметр - новое значение цвета. Например:

// m_tt - объект класса CToolTipCtrl
m_tt.SetTipTextColor(RGB(255,0,0));
m_tt.SetTipBkColor(RGB(0,0,0));

Проблемы возникают только в том случае, когда вы используете встроенную поддержку тултипов класса CWnd. В этом случае тултип создаётся и уничтожается в недрах MFC, причём документированного способа добраться до него не существует. Выйти из положения можно, воспользовавшись недокументированным: MFC сохраняет указатель на созданный ею объект класса CToolTipCtrl в структуре _AFX_THREAD_STATE, и можно получить к нему доступ, используя выражение AfxGetThreadState()->m_pToolTip.

Вторая проблема состоит в том, что MFC сама следит за временем жизни тултипа, и мы не можем точно знать, когда он уничтожается и создаётся заново. Поэтому нужные нам параметры отображения необходимо задавать всякий раз, когда тултип "собирается" появиться на экране. Удобнее всего делать это в ответ на уведомление TTN_NEEDTEXT, например:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFFFFFF, OnToolTipText)
END_MESSAGE_MAP()

BOOL CMainFrame::OnToolTipText(...)
{
    CToolTipCtrl* ptt = AfxGetThreadState()->m_pToolTip;

    ptt->SetTipTextColor(RGB(255,0,0));
    ptt->SetTipBkColor(RGB(0,0,0));

    return CFrameWnd::OnToolTipText(...);
}

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

В заключение отмечу, что кроме уже рассмотренных сообщений тултип распознаёт сообщения TTM_GETTIPTEXTCOLOR и TTM_GETTIPBKCOLOR, позволяющие определить текущие значения цветов. В MFC для той же цели существуют функции GetTipTextColor и GetTipBkColor класса CToolTipCtrl.


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