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

标签 c++ mfc tooltip mfc-feature-pack

我有一个派生自 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++,它看起来也从未发送过这条消息。

这可能是什么问题?

更新

我不确定这是否相关:CTreeCtrl 的父窗口是 CDockablePane 类型。是否需要做一些额外的工作才能使其发挥作用?

最佳答案

终于!我(部分)解决了它:

看起来确实是 CDockablePane 父窗口导致了这个问题...

首先,我从 CTreeCtrl 派生类中删除了所有特定于工具提示的代码。一切都在父 Pane 窗口中完成。

然后我编辑了父窗口的 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 成员,并在 CTor 中将其设置为 (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;
}

关于c++ - 如何在 CTreeCtrl 中显示自定义工具提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/269837/

相关文章:

c++ - 为什么在这个例子中没有应用 SFINAE?

C++ MFC 将文件写入插入的 USB 驱动器

WPF- 将工具提示背景更改为透明

javascript - 切换工具提示文本

c++ - 对象的 ctor 和 dtor 必须在同一个线程上吗?

c++ - 如何为类成员变量定义threadprivate变量

c++ - 枚举变量的任意值

c++ - CTreeCtrl 禁用拖放特定节点

c++ - 在 C++ 中,CMailItem::Display(VARIANT &Modal) 它正在寻找的 VARIANT 变量是什么?

单击任意位置时javascript隐藏下拉菜单