代码之家  ›  专栏  ›  技术社区  ›  foraidt

如何在CTreeCtrl中显示自定义工具提示?

  •  3
  • foraidt  · 技术社区  · 17 年前

    我有一个派生自 CTreeCtrl . 在里面 OnCreate() 我替换默认值 CToolTipCtrl 具有自定义对象的对象:

    int CMyTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
            return -1;
    
        // Replace tool tip with our own which will
        // ask us for the text to display with a TTN_NEEDTEXT message
        CTooltipManager::CreateToolTip(m_pToolTip, this, AFX_TOOLTIP_TYPE_DEFAULT);
        m_pToolTip->AddTool(this, LPSTR_TEXTCALLBACK);
        SetToolTips(m_pToolTip);
    
        // Update: Added these two lines, which don't help either
        m_pToolTip->Activate(TRUE);
        EnableToolTips(TRUE);
        
        return 0;
    }
    

    我的消息处理程序如下所示:

    ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CMyTreeCtrl::OnTtnNeedText)
    

    TTN_NEEDTEXT 消息我用Spy++看了一眼,而且这条消息似乎从未发送过。

    使现代化

    我不确定这是否相关:这个 树形控件 的父窗口的类型为 CDockablePane . 是否需要一些额外的工作来实现这一点?

    5 回复  |  直到 6 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    最后我(部分)解决了这个问题:

    看起来CDockablePane父窗口确实导致了此问题。。。

    然后我编辑了父窗口的 OnCreate()

    int CMyPane::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CDockablePane::OnCreate(lpCreateStruct) == -1)
            return -1;
    
    const DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
        TVS_CHECKBOXES | TVS_DISABLEDRAGDROP | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT |
        TVS_INFOTIP | TVS_NOHSCROLL | TVS_SHOWSELALWAYS;
    
    // TREECTRL_ID is a custom member constant, set to 1
    if(!m_tree.Create(dwStyle, m_treeRect, this, TREECTRL_ID ) )
    {
        TRACE0("Failed to create trace tree list control.\n");
        return -1;
    }
    
    // m_pToolTip is a protected member of CDockablePane
    m_pToolTip->AddTool(&m_tree, LPSTR_TEXTCALLBACK, &m_treeRect, TREECTRL_ID);
    m_tree.SetToolTips(m_pToolTip);
    
    
    return 0;
    

    }

    不幸的是,我们不能简单地打电话 AddTool() 由于基类将以 ASSERT 大约 uFlag 如果未设置刀具ID,则为成员。 因为我们需要设置ID,所以我们还需要设置一个矩形。我创造了一个 CRect 成员并将其设置为 (0, 0, 10000, 10000) 更新: I asked a question regarding this.

    最后是获取工具提示信息的处理程序:

    // Message map entry
    ON_NOTIFY(TVN_GETINFOTIP, TREECTRL_ID, &CMobileCatalogPane::OnTvnGetInfoTip)
    
    
    // Handler
    void CMyPane::OnTvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMTVGETINFOTIP>(pNMHDR);
    
        // This is a CString member
        m_toolTipText.ReleaseBuffer();
        m_toolTipText.Empty();
    
        // Set your text here...
    
        pGetInfoTip->pszText = m_toolTipText.GetBuffer();
    
        *pResult = 0;
    }
    
        2
  •  4
  •   ravenspoint    17 年前

    EnableToolTips(TRUE);
    

    好吧,既然这对你不起作用,既然再也没有专家提供任何帮助,下面我再给你一些建议。虽然它们是跛脚的,但它们可能会让你再次行动:

    • 确保您的OnCreate()rotine正在实际执行。
    • 更换前启用工具提示。
    • 启用工具提示(TRUE);

      CTOLTIPCTRL*PTOLTIPCTRL=(CTOLTIPCTRL*)CWnd::FromHandle((HWND)::SendMessage(m_HWND,LVM_GETTOOLTIPS,0,0L));

        3
  •  1
  •   Javier De Pedro    17 年前

    我还没有尝试使用CTreeCtrl,但我认为您应该调用RelayEvent,让工具提示ctrl知道何时必须显示工具提示。试试这个:

    MyTreeCtrl.h:

    virtual BOOL PreTranslateMessage(MSG* pMsg);
    

    BOOL CMyTreeCtrl::PreTranslateMessage(MSG* pMsg) 
    {
        m_pToolTip.Activate(TRUE);
        m_pToolTip.RelayEvent(pMsg);
    
        return CTreeCtrl::PreTranslateMessage(pMsg);
    }
    

    我希望这有帮助。

        4
  •  1
  •   JeffH    17 年前

    您不需要重写OnTolHitTest()吗?

    (old) Resource 1

    (old) Resource 2:

    除了返回命中代码(nHit),还必须填写TOOLINFO结构。以下是VIRGIL在CMainFrame::OntolHitTest中的实现方式:

     int nHit = MAKELONG(pt.x, pt.y);
     pTI->hwnd = m _ hWnd;
     pTI->uId  = nHit;
     pTI->rect = CRect(CPoint(pt.x-1,pt.y-1),CSize(2,2));
     pTI->uFlags |= TTF _ NOTBUTTON;
     pTI->lpszText = LPSTR _ TEXTCALLBACK;
    

    大多数设置与hwnd和UIDb的设置非常相似,但有些设置与hwnd和UIDb的设置不太一样。我将rect成员设置为以鼠标位置为中心的2像素宽、2像素高的矩形。工具提示控件使用此矩形作为“工具”的边框,我希望它很小,因此将鼠标移动到任何位置都将构成在工具外部移动。我在uFlags中设置了TTF uuuNotButton,因为工具提示与按钮没有关联。这是在afxwin.h中定义的一个特殊MFC标志;MFC使用它为工具提示提供帮助。工具提示还有另一个MFC扩展标志TTF_uuuuwaystip。如果希望MFC即使在窗口未处于活动状态时也显示提示,则可以使用它。 您可能已经注意到,到目前为止,我还没有告诉MFC或工具提示或工具信息提示的实际文本是什么。这就是LPSTR uutexcallback的作用。这个特殊值告诉工具提示控件(MFC使用的内部线程全局控件)回调我的窗口以获取文本。它通过向我的窗口发送带有通知代码TTN NEEDTEXT的WM uuu NOTIFY消息来实现这一点。

        5
  •  0
  •   skst    17 年前

    尝试专门处理所有工具提示ID:

    ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, &CMyTreeCtrl::OnNeedTipText)
    

    如果这不起作用,您可能必须从PreTranslateMessage()手动调用RelayEvent()。

    推荐文章