- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个派生自 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/
有没有办法获取CTreeCtrl中项目的位置(索引)? 我对特定级别的节点索引感兴趣。 我想在项目“数据”字段中维护项目位置,但问题是我的树已排序,我无法预测项目将接收的位置(好吧,只有当我提前对项目
我使用以下代码更改 CTreeCtrl 中树项的字体: void CTreeCtrlEx::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) {
我有办法在 CTreeCtrl 的特定节点上禁用拖放吗? 我想防止将一个节点拖到同一棵树中同一节点的子节点,并防止将一个节点拖到链接到同一节点或其子节点之一的 ListView 。 最佳答案 这仅取决
我需要保持动态添加的 CTreeCtrl 项 Serialize确实是应该做的吧?如果是,则只需要转换如何变量类型 如果不行怎么办? 序列化函数 if (ar.IsStoring()) { a
是否可以将 CTreeCtrl 样式设置为在展开时显示箭头,就像在这个图像中,而不是通常的 +/- 符号? 最佳答案 确保你有 ComCtrl v6 in your manifest在您的应用程序中启
我有一个 CTreeCtrl,我用内容填充了它。现在我想添加复选框,但只是针对某些复选框。我发现可以使用 m_Tree.ModifyStyle(0, TVS_CHECKBOXES) 激活 TreeCt
我有一个 MFC CTreeCtrl 卡在一个打开了 TVS_CHECKBOXES 样式的对话框中。我的所有树项目旁边都有复选框。在 OnInitDialog 中,我使用 CTreeCtrl::Set
首先,我将 TVS_EX_PARTIALCHECKBOXES 添加到 CTreeCtrl 的扩展样式中: TreeView_SetExtendedStyle(tree->GetSafeHwnd(),
我在运行时在 MFC 应用程序中创建了一个 TreeView ,我已经添加了几个节点,现在我想在节点的点击上做一些事情,所以我如何获得 TreeView 的点击事件? 我的代码是这样的: CTreeC
我有一个 CTreeCtrl 对象(C++、MFC)。此 CTreeCtrl 会记住最后一次选择,如果用户再次打开窗口,最后一次选择将展开并自动选择。但是当我调用 EnsureVisible 来显示最
我有一个派生自 CTreeCtrl 的类。在 OnCreate() 中,我将默认的 CToolTipCtrl 对象替换为自定义对象: int CMyTreeCtrl::OnCreate(LPCREAT
我有一个支持高 dpi 的 MFC 应用程序。该应用程序显示一个 CTreeCtrl,它可以在不同的 dpi 设置下正确绘制展开/折叠(例如 +/-)字形。这是一个 200% 的片段。 为了呈现更现代
有没有办法在展开/折叠树中的所有节点等昂贵操作期间暂停 CTreeCtrl 或其 CTreeView 的呈现?如果它没有类似 PauseRendering(TRUE) 或类似的功能,是否可以拦截绘制消
(VS2008,MFC,功能包) 使用 CTreeCtrl,当控件失去焦点时,我需要“更好地”突出显示所选项目。 我的树是使用资源编辑器中的“TVS_SHOWSELALWAYS”选项创建的,但颜色不够
我必须递归地向树控件中的项目添加子键列表。我正在使用 InsertItem,如下所示。我附加了此元素的路径,以便在单击树控件时可以检索。我可以添加该值但无法检索它。 void CMyDlg::Fill
我有 MyCTreeCtrl 类,我想添加如下消息处理程序: void MyCTreeCtrl::OnBegindrag(NMHDR *pNMHDR, LRESULT *pResult) { } 中间
我有一个 CDockablePane,它包含一个基于 CTreeCtrl 的自定义控件。 当我移动 CDockablePane 时,所有内容都会正确刷新。当我调整 CDockablePane 的大小时
我有一个具有 CTreeCtrl 的应用程序,它显示了特定驱动器的所有文件夹,我想通过拖放来更改同一 CTreeCtrl 中文件夹的顺序。如何做呢。我已经实现了在 CTreeCtrl 中获取文件夹名称
我想要一个列表控件 (CTreeCtrl) 的背景图像。这可能吗?我该怎么做? (这是针对 Visual Studio 2008 C++ mfc 应用程序的) 最佳答案 希望this代码会帮助你。 关
我的对话框中有简单的 CTreeCtrl。它只有两个深度级别,如下所示: 想象一下,用户单击“第三”节点使其被选中,然后他按下也在对话框上的按钮并执行下一个代码: // m_tree is a dia
我是一名优秀的程序员,十分优秀!