当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在CTreeCtrl中显示自定义工具提示?》经验,为你挑选了1个好方法。

我有一个源自的课程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。可能需要一些额外的工作才能使它正常工作吗?



1> foraidt..:

最后!我(部分)解决了它:

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

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

然后,我编辑了父窗口的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()使用更少的参数进行调用,因为如果没有设置工具ID,则基类将以ASSERTabout uFlag成员的形式抱怨。并且由于我们需要设置ID,因此我们还需要设置一个矩形。我创建了一个CRect成员并将其设置(0, 0, 10000, 10000)为CTor。我尚未找到更改工具的矩形尺寸的可行方法,因此这是我的丑陋解决方法。这也是为什么我将此解决方案称为部分解决方案。更新:我问了一个与此有关的问题。

最后,有一个处理程序来获取工具提示信息:

// Message map entry
ON_NOTIFY(TVN_GETINFOTIP, TREECTRL_ID, &CMobileCatalogPane::OnTvnGetInfoTip)


// Handler
void CMyPane::OnTvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast(pNMHDR);

    // This is a CString member
    m_toolTipText.ReleaseBuffer();
    m_toolTipText.Empty();

    // Set your text here...

    pGetInfoTip->pszText = m_toolTipText.GetBuffer();

    *pResult = 0;
}

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有