【发布时间】:2014-07-03 09:04:42
【问题描述】:
简介及相关资料:
我需要实现以下场景:
用户展开一个节点,例如
Node 1;用户展开另一个节点,例如
Node 2;折叠上一个节点(
Node 1);
为了直观地解释我的意思,我们将使用以下示例图像:
现在当用户点击Assembly 1 节点或其子节点Components 时,我需要折叠所有其他节点。下面的示例图片说明了这一点:
我为实现此行为所做的努力:
浏览互联网,稍加思考,我能够编写折叠节点及其子节点的辅助函数:
void CollapseNode( HWND hTree, HTREEITEM hti )
{
if( TreeView_GetChild( hTree, hti ) != NULL )
{
TreeView_Expand( hTree, hti, TVE_COLLAPSE );
hti = TreeView_GetChild( hTree, hti );
do
{
CollapseNode( hTree, hti );
}
while( ( hti = TreeView_GetNextSibling( hTree, hti ) ) != NULL );
}
}
通读 MSDN 文档,我发现 TVN_ITEMEXPANDING 和 TVN_ITEMEXPANDED 消息可能有用。
我还发现NM_CLICK 通知似乎很有趣,因为我可以使用TVM_HITTEST 消息来测试是否点击了+/- 按钮。
我还发现TVN_KEYDOWN 消息可以帮助我在用户按下左箭头 或右箭头 键时进行扩展。
问题:
我想不出使用上述消息来解决我的任务的算法。
问题:
您能否建议我一种处理上述消息的算法,以便我可以调用我的CollapseNode(..) 函数?
类似这样的:
在NM_CLICK 中进行测试,然后调用您的函数 或将最后展开的项目存储在变量中并折叠它以响应TVN_ITEMEXPANDED开始。
谢谢。
【问题讨论】:
-
毅力+100分!我昨天看到了你的 CP 消息,然后发现你已经解决了这个障碍,只是遇到了 ClearText + XP 问题。我现在肯定不羡慕你!我有一个想法,虽然我误读了你的问题,需要重新思考。我只是爬回树上,直到找到其父节点为根的节点。然后我会关闭根的所有其他孩子。我会看看我是否不能敲出一些代码。 :)
-
@enhzflep:我害怕你“保释我”,但是当你被雇用时,责任又会不断出现。自从我们上次“发言”以来,我遇到了各种问题,但设法成功解决了这些问题,除了 ClearType (我怀疑一个会得到解决,因为创建透明树视图的算法是问题。如果我可以用自定义绘制透明地绘制节点,那么事情会没事的 )。感谢您尝试提供帮助!最好的问候,很高兴再次听到你的声音:)
-
很抱歉。确实,不下雨的时候,就是倾盆大雨!嘿,我正在考虑您的问题,而且,您似乎只希望一次打开 TestProject 的一个孙子(及其后代)。那是对的吗?如果是这样,您不能在扩展节点时简单地关闭其他节点(仅)吗?我的意思是,除非在所有节点都展开的情况下创建树,否则第一个图像是不可能的,不是吗?要显示组件,您必须展开 Assembly1、2 或 3 - 所以我想知道您是否真的只需要处理 TVN_EXPANDED 通知?
-
@enhzflep:这只是一个示例图片。实际上,当创建的树节点全部折叠时。我想保存最后一个展开的节点句柄,当用户展开新节点以折叠保存的句柄然后将新节点存储到该变量中时。我只是在实现这一点时遇到了问题……总之,你的结论是正确的。
-
啊!好吧,我想我有一个几乎可行的解决方案。我会在晚饭后完成它。
标签: c++ winapi collapse treeviewitem