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