Читать «Исчерпывающее руководство по написанию всплывающих подсказок» онлайн - страница 9

Роджер Джек

Класс CDTDemoView ответственен за отображение кругов и реализацию элементов DataTip (см. рис.8). В переменной CDTDemoView::m_ToolTip хранится элемент ToolTip, который выступает в качестве DataTip. Я хотел, чтобы этот пример показал вам, как использовать класс CToolTipCtrl напрямую, вместо использования функций класса CWnd. Однако, в данном случае, даже если я захотел использовать CWnd, я бы не смог, потому что мне нужен прямой доступ к элементу ToolTip, чтобы посылать ему сообщения. CWnd не предоставляет документированных способов доступа к создаваемому им элементу ToolTip, а я не хотел бы полагаться на детали конкретной реализации. CDTDemoView::m_pCircleHit хранит круг под курсором мыши. Если ни один из кругов не попадает под курсор мыши, CDTDemoView::m_pCircleHit может быть NULL.

Рис.8. DTDemoView

/////////////////////////////////////////////////////////////////////////////

// DTDemoView.cpp : implementation of the CDTDemoView class

.

.

.

/////////////////////////////////////////////////////////////////////////////

// CDTDemoView HitTest

const CCircle* CDTDemoView::HitTest(const CPoint& Point) {

 CDTDemoDoc* pDoc = GetDocument();

 ASSERT_VALID(pDoc);

 // Проверяем в обратном порядке, чтобы корректно обработать

 // перекрывающиеся круги

 const CCircle *pCircleHit = NULL;

 for (int n = pDoc->GetCircleCount() – 1; n >= 0 && pCircleHit == NULL; n--) {

  if (pDoc->GetCircle(n).HitTest(Point)) {

   pCircleHit = &(pDoc->GetCircle(n));

  }

 }

 return pCircleHit;

}

/////////////////////////////////////////////////////////////////////////////

// CDTDemoView drawing

void CDTDemoView::OnDraw(CDC* pDC) {

 CDTDemoDoc* pDoc = GetDocument();

 ASSERT_VALID(pDoc);

 for (int n = 0; n < pDoc->GetCircleCount(); n++) {

  pDoc->GetCircle(n).Draw(pDC);

 }

}

/////////////////////////////////////////////////////////////////////////////

// CDTDemoView diagnostics

#ifdef _DEBUG

void CDTDemoView::AssertValid() const {

 CView::AssertValid(); } void CDTDemoView::Dump(CDumpContext& dc) const {

 CView::Dump(dc);

}

{

 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDTDemoDoc)));

 return (CDTDemoDoc*)m_pDocument;

}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////

// CDTDemoView message handlers

void CDTDemoView::OnInitialUpdate() {

 CView::OnInitialUpdate();

 CRect ClientRect(0, 0, 1000, 1000);

 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) {