Исчерпывающее руководство по написанию всплывающих подсказок | страница 28



>class CCustomTip: public CWnd {

> .

> .

> .

>protected:

> const int m_nAutoPopDelay; // В миллисекундах.

> UINT m_nTimerId;

> CPoint m_LastMousePosition;

> .

> .

> .

>};

В конструкторе инициализируем константу m_nAutoPopDelay значением 10000 (десять секунд), а m_nTimerId установим в 0.

>CCustomTip::CCustomTip : m_nAutoPopDelay(10000), m_LastMousePosition(0, 0) {

> .

> .

> .

> m_nTimerId = 0;

> .

> .

> .

>}

Вы можете установить любой интервал – я задал 10 секунд только в целях демонстрации задержки.

Добавьте код, который запускает таймер, когда показывается подсказка. Например, если бы существовала функция CCustomTip::Show, вы бы добавили следующий код в метод, показывающий окно:

>void CCustomTip::Show {

> .

> .

> .

> if (m_nTimerId > 0) {

>  VERIFY(KillTimer(m_nTimerId));

>  m_nTimerId = 0;

> }

> VERIFY(::GetCursorPos(&m_LastMousePosition));

> m_nTimerId = SetTimer(1, m_nAutoPopDelay, NULL);

> ASSERT(m_nTimerId != 0);

> .

> .

> .

>}

Добавьте код для обработки сообщений таймера. Добавьте обработчик сообщения WM_TIMER с помощью ClassWizard. Код обработчика должен выглядеть следующим образом:

>void CTitleTip::OnTimer(UINT nIDEvent) {

> CPoint CurrentMousePosition;

> VERIFY(::GetCursorPos(&CurrentMousePosition));

> if (CurrentMousePosition == m_LastMousePosition) {

>  Hide();

> } else {

>  m_LastMousePosition = CurrentMousePosition;

> }

>}

Наконец, добавьте в CCustomTip::Hide код, останавливающий таймер:

>void CCustomTip::Hide() {

> if (m_nTimerId > 0) {

>  VERIFY(KillTimer(m_nTimerId));

>  m_nTimerId = 0;

> } ShowWindow(SW_HIDE);

>}


Таким же образом можно реализовать другие типы задержек стандартных элементов ToolTip, но придется отслеживать больше изменений, чем координаты курсора мыши. Например, для реализации эквивалента TTDT_RESHOW (интервал времени перед показом следующей подсказки при перемещении курсора мыши на другую строку, или инструмент) нужно будет создать переменные для хранения времени скрытия последней подсказки и ее содержимого.

Комментарии: 

Небольшое добавление

Искал способ попроще включить поддержку ToolTips без явного использования класса CToolTipCtrl. И в результате сам сделал следующее:

>int CContentWnd::OnToolHitTest(CPoint point, TOOLINFO* pTI) const {

> int nHit=0;

> CString csText;

> csText="Закрыть окно";

> HWND m_hWnd=this->GetSafeHwnd();

> pTI->hwnd = m_hWnd;

> pTI->uId = (UINT)m_hWnd;

> pTI->uFlags = TTF_IDISHWND;

> pTI->lpszText=new char[csText.GetLength()+1];

> lstrcpy(pTI->lpszText,(LPCTSTR)csText);

> return nHit;

>}

Подсказки можно выводить в любом месте окна