2010-02-23 1 views
1

저는 근본적으로, 그리고 아마도 간단하고 명백한 것 모두를 놓치고 있습니다.VC++ 6.0에서 도구 설명을 표시 할 수 없습니다.

내 문제 : 보기 (CPlaybackView, CView에서 파생 됨)가 있습니다.
보기에는 CRectTracker (CMpRectTracker)에서 파생 된 여러 개체가 표시됩니다.
이러한 개체에는 각각 부동 소수점 멤버가 포함되어 있습니다.
마우스가 CMpRectTracker를 가리키면 해당 부동 소수점 멤버를 표시하려고합니다. OnIntitialUpdate, PreTranslateMessage, 및 OnMouseMove를 통해 추적 할 수 있지만 처리기 메서드는 실행되지 않습니다. 이것은 Visual C++ v. 6.0에 있습니다.

1. In the view's header file: 

    public: 
     BOOL OnToolTipNeedText(UINT id, NMHDR * pNMHDR, LRESULT * pResult); 

    private: 
     CToolTipCtrl m_ToolTip; 
     CMpRectTracker *m_pCurrentRectTracker;//Derived from CRectTracker 

2. In the view's implementation file: 

    a. In Message Map: 
     ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipNeedText) 

    b. In CPlaybackView::OnInitialUpdate: 
     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"); 
     } 
     this->EnableToolTips(); 

    c. In CPlaybackView::OnMouseMove: 

     if (::IsWindow(m_ToolTip.m_hWnd)) 
     { 
      m_pCurrentRectTracker = NULL; 
      m_ToolTip.Activate(FALSE); 
      if(m_rtMilepostRect.HitTest(point) >= 0) 
      { 
       POSITION pos = pDoc->m_rtMilepostList.GetHeadPosition(); 
       while(pos) 
       { 
        CMpRectTracker tracker = pDoc->m_rtMilepostList.GetNext(pos); 
        if(tracker.HitTest(point) >= 0) 
        { 
         m_pCurrentRectTracker = &tracker; 
         m_ToolTip.Activate(TRUE); 
         break; 
        } 
       } 
      } 
     } 

    d. In CPlaybackView::PreTranslateMessage: 

     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; 
      } 
     } 

    e. Finally, the handler method: 

     BOOL CPlaybackView::OnToolTipNeedText(UINT id, NMHDR * pNMHDR, LRESULT * pResult) 
     { 
      BOOL bHandledNotify = FALSE; 

      CPoint CursorPos; 
      VERIFY(::GetCursorPos(&CursorPos)); 
      ScreenToClient(&CursorPos); 

      CRect ClientRect; 
      GetClientRect(ClientRect); 

      // Make certain that the cursor is in the client rect, because the 
      // mainframe also wants these messages to provide tooltips for the 
      // toolbar. 
      if (ClientRect.PtInRect(CursorPos)) 
      { 
       TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; 
       CString str; 
       str.Format("%f", m_pCurrentRectTracker->GetMilepost()); 
       ASSERT(str.GetLength() < sizeof(pTTT->szText)); 
       ::strcpy(pTTT->szText, str); 
       bHandledNotify = TRUE; 
      } 
      return bHandledNotify; 
     } 

답변

0

이있어 : 여기

내가이 달성하려고 한 일이다

BEGIN_MESSAGE_MAP(CPlaybackView, CThreadView) 
    ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTipNeedText) 
END_MESSAGE_MAP() 

void CPlaybackView::OnInitialUpdate() 
{ 
    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, 2000); 
     m_ToolTip.SendMessage(TTM_SETDELAYTIME, TTDT_INITIAL, 1); 
     m_ToolTip.SendMessage(TTM_SETDELAYTIME, TTDT_RESHOW, 1); 
     m_ToolTip.Activate(FALSE); 
     BOOL ena = EnableToolTips(TRUE); 
    } 
    else 
    { 
     TRACE("Error in creating ToolTip"); 
    } 
} 

void CPlaybackView::OnMouseMove(UINT nFlags, CPoint point) 
{ 
    CPlaybackDoc* pDoc = (CPlaybackDoc*) GetDocument(); 

    if (::IsWindow(m_ToolTip.m_hWnd)) 
    { 
     CMpRectTracker *pRectTracker = HitTest(point); 
     if(pRectTracker) 
     { 
      m_ToolTip.Activate(TRUE); 
     } 
     else 
     { 
      m_ToolTip.Activate(FALSE); 
     } 
    } 
} 

BOOL CPlaybackView::OnToolTipNeedText(UINT id, NMHDR * pNMHDR, LRESULT * pResult) 
{ 
    BOOL bHandledNotify = FALSE; 

    CPoint CursorPos; 
    VERIFY(::GetCursorPos(&CursorPos)); 
    ScreenToClient(&CursorPos); 

    CRect MilepostRect; 
    m_rtMilepostRect.GetTrueRect(MilepostRect); 

    // Make certain that the cursor is in the client rect, because the 
    // mainframe also wants these messages to provide tooltips for the 
    // toolbar. 
    if(MilepostRect.PtInRect(CursorPos)) 
    { 
     TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; 
     CMpRectTracker *pRectTracker = HitTest(CursorPos); 
     if(pRectTracker) 
     { 
      CString str; 
      str.Format("%f", pRectTracker->GetMilepost()); 
      ASSERT(str.GetLength() < sizeof(pTTT->szText)); 
      ::strcpy(pTTT->szText, str); 
      bHandledNotify = TRUE; 
     } 
    } 
    return bHandledNotify; 
} 

BOOL CPlaybackView::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); 
} 

CMpRectTracker* CPlaybackView::HitTest(CPoint &point) 
{ 
    CPlaybackDoc* pDoc = (CPlaybackDoc*) GetDocument(); 
    ASSERT_VALID(pDoc); 

    CMpRectTracker *pTracker = NULL; 
    POSITION pos = pDoc->m_rtMilepostList.GetHeadPosition(); 
    while(pos) 
    { 
     CMpRectTracker tracker = pDoc->m_rtMilepostList.GetNext(pos); 
     if(tracker.HitTest(point) >= 0) 
     { 
      m_CurrentRectTracker = tracker; 
      pTracker = &m_CurrentRectTracker; 
      break; 
     } 
    } 
    return pTracker; 
} 
:

그냥 침대에 넣어를, 여기 결과입니다