gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:50:49 27 4
gpt4 key购买 nike

我有一个派生自 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com