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