http://prostoserver.com/rus/
Страница Игоря Разина
Программы Примеры Книги
Всплывающие подсказки
Демонстрационный проект
Класс CToolTip

Этот класс позволяет добавлять всплывающие подсказки для элементов диалога.

class CToolTip{
    public:
        void ShowToolTip( HWND  hWnd,              // Хендл объекта
                          PTSTR pszText,           // Текст подсказки
                          BOOL  fBalloon = FALSE,  // Стиль BALLOON
                          DWORD dwWidth  = 0,      // Максимальная ширина окна подсказки
                          DWORD dwDelay  = 0 );    // Время показа в миллисекундах
        void RemoveToolTip();
        BOOL IsToolTip();

    private:
        void EnableMouseEvents( HWND hWnd );

    private:
        HWND m_hwndTT;
};

Окно ToolTip-а создается при наведении курсора мыши на объект (по событию WM_SETCURSOR) и уничтожается когда курсор покидает границы объекта. Чтобы отловить момент ухода курсора необходимо "подписаться" на сообщение WM_MOUSELEAVE при помощи функции _TrackMouseEvent():

void CToolTip::EnableMouseEvents( HWND hWnd )
{
    TRACKMOUSEEVENT tme = {0};

    tme.cbSize    = sizeof( TRACKMOUSEEVENT );
    tme.dwFlags   = TME_LEAVE;
    tme.hwndTrack = hWnd;

    _TrackMouseEvent( &tme );
}

В событии WM_SETCURSOR создаем и показываем подсказку. Функция _TrackMouseEvent() "одноразового действия", поэтому EnableMouseEvents() нужно вызывать при каждом событии WM_SETCURSOR:

void CToolTip::ShowToolTip( HWND hWnd, PTSTR pszText, BOOL fBalloon, DWORD dwWidth, DWORD dwDelay )
{
    EnableMouseEvents( hWnd );

    // Создаем окно ToolTip-а
    m_hwndTT = CreateWindow( TOOLTIPS_CLASS,
                             NULL,
                             WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP | 
                             ( fBalloon ? TTS_BALLOON : 0 ),
                             0, 0, 0, 0,
                             hWnd, 
                             NULL, NULL, NULL );

    TOOLINFO ti = {0};

    ti.cbSize   = sizeof( TOOLINFO );
    ti.uFlags   = TTF_SUBCLASS | TTF_IDISHWND;
    ti.hwnd     = hWnd;
    ti.uId      = (UINT) hWnd;
    ti.lpszText = pszText;

    // Задаем ширину
    if( dwWidth ) SendMessage( m_hwndTT, TTM_SETMAXTIPWIDTH, 0, dwWidth );

    // Время жизни
    if( dwDelay ) SendMessage( m_hwndTT, TTM_SETDELAYTIME, (WPARAM) TTDT_AUTOPOP, 
                                                           (LPARAM) MAKELONG( dwDelay, 0 ) );

    // Добавляем
    SendMessage( m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti );

    // Показываем
    SendMessage( m_hwndTT, TTM_ACTIVATE, (WPARAM) TRUE, 0 );
}

В событии WM_MOUSELEAVE удаляем ToolTip и уничтожаем окно:

void CToolTip::RemoveToolTip()
{
    TOOLINFO ti = {0};

    ti.cbSize = sizeof( TOOLINFO );
    ti.uFlags = TTF_SUBCLASS | TTF_IDISHWND;
    ti.hwnd   = m_hwndTT;
    ti.uId    = (UINT) m_hwndTT;

    SendMessage( m_hwndTT, TTM_DELTOOL, 0, (LPARAM) (LPTOOLINFO) &ti );

    DestroyWindow( m_hwndTT );

    m_hwndTT = NULL;
}
BOOL CToolTip::IsToolTip()
{
    return ( m_hwndTT != NULL ) ? TRUE : FALSE;
}

© 2003—2017 Игорь Разин