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



Класс 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);

>}

>CDTDemoDoc* CDTDemoView::GetDocument() // non-debug version is inline

>{

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