c++ - CTreeCtrl 保存运行时添加的项目

标签 c++ serialization mfc treeview

我需要保持动态添加的 CTreeCtrl 项

Serialize确实是应该做的吧? 如果是,则只需要转换如何变量类型

如果不行怎么办?

序列化函数

if (ar.IsStoring())
{
    ar >> m_tree1;
}
else
{
    ar << m_tree1;
}

最佳答案

序列化一棵树并不那么复杂。这是一个带有一些伪代码且没有错误检查的函数。

您唯一需要做的就是序列化节点数据...

此代码未针对编译器进行检查,但应说明如何实现此目的。代码已记录。

...
SerializeTree(m_tree.GetRootItem(), ar);
...

void SerializeTree(CTreeCtrl &tree, HTREEITEM hItem, CArchive &ar)
{
  if ar.IsStoring())
  {
    // Count items on this level
    DWORD dwCnt = 0;
    for (HTREEITEM hNext = hItem; hNext; hNext = tree.GetNextItem(hNext,TVGN_NEXT)
      ++dwCnt;
    // output data on this level
    ar << dwCnt;
    for (HTREEITEM hNext = hItem; hNext; hNext = tree.GetNextItem(hNext,TVGN_NEXT)
    {
      // Output data of this node
      OutputDataOfNode(tree,hNext,ar);
      // Stream children of this node
      SerializeTree(tree,tree.GetChildItem(hNext),ar);
    }
  }
  else
  {
    // Get number of nodes on this level
    DWORD dwCnt;
    ar >> dwCnt;
    while (dwCnt--)        
    {
      // Insert a new node
      HTREEITEM hNext = tree.InsertItem(_T(""),hItem ? hItem : TVI_ROOT, TVI_LAST);
      // Read data of node into the new node hNext
      ReadDataOfNode(tree,hNext,ar);
      // Now read all children
      SerializeTree(tree,hNext,ar);
    }
  }
}       

关于c++ - CTreeCtrl 保存运行时添加的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47279309/

相关文章:

c++ - 是否可以在 RAD Studio 10 c++ 中设置 Window (x, y) Position?

c++ - 测试 AVX 寄存器是否包含一些相等的整数

c++ - 如何连接字符?

Java:序列化单例的实际用例?

hibernate - 如何在序列化过程中限制hibernate相关对象

spring - 带有 Spring MongoTemplates 的 Jackson 自定义反序列化器/序列化器

c++ - OnHScroll 或 OnVScroll 执行两次

c++ - 在 Linux 或 Windows 中的精确时间段安排任务

visual-studio-2010 - 当浏览模式设置为文件夹浏览时 CMFCEditBrowseCtrl 崩溃

c++ - MFC,如何从主窗口关闭模态对话框?