Чтение онлайн

на главную - закладки

Жанры

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

Джек Роджер

Шрифт:

 if (m_ToolTip.Create(this, TTS_ALWAYSTIP) && m_ToolTip.AddTool(this)) {

m_ToolTip.SendMessage(TTM_SETMAXTIPWIDTH, 0, SHRT_MAX);

m_ToolTip.SendMessage(TTM_SETDELAYTIME, TTDT_AUTOPOP, SHRT_MAX);

m_ToolTip.SendMessage(TTM_SETDELAYTIME, TTDT_INITIAL, 200);

m_ToolTip.SendMessage(TTM_SETDELAYTIME, TTDT_RESHOW, 200);

 } else {

 TRACE("Error in creating ToolTip");

 }

}

BOOL CDTDemoView::OnToolTipNeedText(UINT id, NMHDR * pNMHDR, LRESULT * pResult) {

 BOOL bHandledNotify = FALSE;

 CPoint CursorPos;

 VERIFY(::GetCursorPos(&CursorPos));

 ScreenToClient(&CursorPos);

 CRect ClientRect;

 GetClientRect(ClientRect);

 //
Удостовериться, что курсор попадает в клиентскую область окна,

 // потому что библиотека тоже хочет получать эти сообщения для

 // показа подсказок на панели инструментов.

 if (ClientRect.PtInRect(CursorPos)) {

TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;

m_pCircleHit = HitTest(CursorPos);

if (m_pCircleHit) {

// Adjust the text by filling in TOOLTIPTEXT

CString strTip;

const CPoint& Center = m_pCircleHit->GetCenter;

COLORREF Color = m_pCircleHit->GetColor;

strTip.Format("Center: (%d, %d)\nRadius: %d\nColor: (%d, %d, %d)", Center.x, Center.y, m_pCircleHit->GetRadius, (int)GetRValue(Color), (int)GetGValue(Color), (int)GetBValue(Color));

ASSERT(strTip.GetLength < sizeof(pTTT->szText));

::strcpy(pTTT->szText, strTip);

// Set the text color to same color as circle

m_ToolTip.SendMessage(TTM_SETTIPTEXTCOLOR, Color, L);

} else {

pTTT->szText[0] = 0;

}

bHandledNotify = TRUE;

 }

 return bHandledNotify;

}

BOOL CDTDemoView::PreTranslateMessage(MSG* pMsg) {

 if (::IsWindow(m_ToolTip.m_hWnd) && pMsg->hwnd == m_hWnd) {

switch(pMsg->message) {

case WM_LBUTTONDOWN:

case WM_MOUSEMOVE:

case WM_LBUTTONUP:

case WM_RBUTTONDOWN:

case WM_MBUTTONDOWN:

case WM_RBUTTONUP:

case WM_MBUTTONUP:

m_ToolTip.RelayEvent(pMsg);

break;

}

 }

 return CView::PreTranslateMessage(pMsg);

}

void CDTDemoView::OnMouseMove(UINT nFlags, CPoint point) {

 if (::IsWindow(m_ToolTip.m_hWnd)) {

const CCircle* pCircleHit = HitTest(point);

if (!pCircleHit || pCircleHit != m_pCircleHit) {

// Activate
скрывает подсказку.

m_ToolTip.Activate(FALSE);

}

if (pCircleHit) {

m_ToolTip.Activate(TRUE);

m_pCircleHit = pCircleHit;

}

 }

 CView::OnMouseMove(nFlags, point);

}

CDTDemoView::OnInitialUpdate создает DataTip и подготавливает его к использованию. Я вызываю m_ToolTip.Create и передаю ей TTS_ALWAYSTIP, чтобы DataTip показывался независимо от того, активно приложение или нет. Затем я вызываю m_ToolTip.AddTool и передаю ей CDTDemoView, как окно, содержащее инструмент. Из-за того, что последние параметры в CToolTipCtrl::AddTool имеют значения по умолчанию (LPSTR_TEXTCALLBACK как текст подсказки, NULL для параметра lpRectTool и 0 для nIDTool), все окно будет считаться инструментом и нотификационное сообщение TTN_NEEDTEXT будет послано CDTDemoView. Эта сообщение позволяет мне установить текст подсказки в функции CDTDemoView::OnToolTipNeedText.

Я посылаю несколько сообщений элементу DataTip, чтобы подготовить его к использованию. TTM_SETMAXTIPWIDTH посылается с заведомо большим значением (SHRT_MAX) в параметре lParam для установки максимальной ширины подсказки. [2] Это заставляет элемент ToolTip распознавать символы новой строки в строке подсказки (новая возможность IE 4.0 Common Controls DLL). Затем я три раза посылаю сообщение TTM_SETDELAYTIME. [3] В первый раз параметр wParam имеет значение TTDT_AUTOPOP, для установки времени, которое должно пройти до того, как ToolTip исчезнет. Время инициализируется в параметре lParam заведомо большим значением (SHRT_MAX), чтобы отключить автоисчезание подсказок. [4] Теперь я могу контролировать их время жизни. Во второй раз в wParam передается TTDT_INITIAL, что задает интервал между моментом остановки курсора мыши и первым появлением подсказки. Этот интервал устанавливается в 200 миллисекунд, поэтому подсказка появляется довольно быстро. И, наконец, TTDT_RESHOW устанавливает временной интервал между появлением следующей подсказки при перемещении курсора в другой круг. Этот интервал также установлен в 200 миллисекунд. Почему я не использовал CToolTipCtrl::SetDelayTime для установки интервалов? К сожалению, CToolTipCtrl::SetDelayTime позволяет задать только интервал для TTDT_AUTOMATIC.

2

для этой цели можно также использовать CToolTipCtrl::SetMaxTipWidth – прим.пер.

3

что эквивалентно CToolTipCtrl::SetDelayTime – прим.пер.

4

справедливости ради нужно сказать, что значение SHRT_MAX дает задержку порядка 30 секунд, а не отключает автоисчезание полностью – прим.пер.

Реализации CDTDemoView::OnDraw и CDTDemoView::HitTest довольно прозрачны. CDTDemoView::OnDraw проходит по массиву кругов, вызывая для каждого круга CCircle::Draw. Функция CDTDemoView::HitTest проверяет, находится ли переданная ему точка над каким-нибудь кругом, вызывая для каждого круга в массиве CCircle::HitTest. Обратите внимание, что эта проверка выполняется в порядке, обратном используемому в CDTDemoView::OnDraw. Это делается для учитывания z-сортировки (z-order) кругов. Например, если круг Б нарисован поверх круга A, тогда сначала должна вызваться функция проверки круга Б.

Поделиться:
Популярные книги

Адвокат Империи 3

Карелин Сергей Витальевич
3. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 3

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Дурная жена неверного дракона

Ганова Алиса
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Дурная жена неверного дракона

Вонгозеро

Вагнер Яна
1. Вонгозеро
Детективы:
триллеры
9.19
рейтинг книги
Вонгозеро

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Папина дочка

Рам Янка
4. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Папина дочка

Законы Рода. Том 6

Flow Ascold
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6

Как я строил магическую империю 7

Зубов Константин
7. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фантастика: прочее
5.00
рейтинг книги
Как я строил магическую империю 7

Лучший из худший 3

Дашко Дмитрий
3. Лучший из худших
Фантастика:
городское фэнтези
попаданцы
аниме
6.00
рейтинг книги
Лучший из худший 3

Штурмовик из будущего 3

Политов Дмитрий Валерьевич
3. Небо в огне
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Штурмовик из будущего 3

Последний попаданец 2

Зубов Константин
2. Последний попаданец
Фантастика:
юмористическая фантастика
попаданцы
рпг
7.50
рейтинг книги
Последний попаданец 2

Идеальный мир для Лекаря 14

Сапфир Олег
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье