Исчерпывающее руководство по написанию всплывающих подсказок | страница 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;
>}
Подсказки можно выводить в любом месте окна