Исчерпывающее руководство по написанию всплывающих подсказок | страница 11
> 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.