如何利用CTreeCtrl,把如下数据结构InsertItem生成父子结点?!多谢解决给分!
一个结构定义如下:
Struct DecodeNod
{
int m_iIndent; //节点的层次位置
CString DecodeInfo; //解码的信息
};
就是如何把此结构的解码信息根据节点的层次位置生成对应的树父子结点.
例如:
test1(m_iIndent等于1)
test2(m_iIndent等于2)
test3(m_iIndent等于3)
test4(m_iIndent等于2)
test5(m_iIndent等于3)
[解决办法]
int m_iIndent; //节点的层次位置
仅仅这一个信息是做不到的.必须还要有一个表示节点的父结点的标志量.
要不你哪知道哪个是哪个的子结点啊./
[解决办法]
如果你是想把一个这样的节点序列表示成父子节点的话的话,我想应该是可以的!
大概思路如下,希望对你有帮助:
DecodeNod nod = ...;//获得第一个节点或者根节点,根据你的具体情况获得
CTreeCtrl m_TreeCtrl;//树控件
HTREEITEM hItem1 = 0;
HTREEITEM hItem2 = 0, hItem3 = 0;
//下面循环获得所有的节点
for ( ... )
{
if ( nod.m_iIndent == 1 )
{
hItem1 = m_TreeCtrl.InsertItem( nod.DecodeInfo, Image, SelImage, TVI_ROOT/*
这里设置插入的父节点是 TVI_ROOT 这样就保证了 m_iIndent = 1 的节点都是一级子节点,
hItem1 保存此一级子节点,以便跟在它后面的二级子节点能以器作为父节点*/ );
hItem2 = 0; // 这里重新初始化该一级子节点的二级子节点
hItem3 = 0; // 这个不是必须,应该三级之后没有子节点了
}
else if ( nod.m_iIndent == 2 )
{
if ( hItem1 == 0 )
{
//...自己处理了,看你程序想怎么样了。如果二级子节点必须要在以及子节点后的话这里可以直接break;
// 只要第一个子节点是一级子节点,这里应该就不会进入
}
else
{
hItem2 = m_TreeCtrl.InsertItem( nod.DecodeInfo, Image, SelImage, hItem1/*插入一级子节点之后*/ );
}
}
else if ( nod.m_iIndent == 3 )
{
if ( hItem1 == 0 )
{
//... 同上处理
}
else if ( hItem2 == 0 )
{
//... 处理三级子节点是否可以放在一级子节点之后
}
else
{
hItem3 = m_TreeCtrl.InsertItem( nod.DecodeInfo, Image, SelImage, hItem2/*插入一级子节点之后*/ );
}
}
}