|
Этот класс позволяет добавлять всплывающие подсказки
для элементов диалога.
class CToolTip{
public:
void ShowToolTip( HWND hWnd,
PTSTR pszText,
BOOL fBalloon = FALSE,
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 );
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;
}
|