zoukankan      html  css  js  c++  java
  • Serializing CTreeCtrl to / from a text file

    http://www.codeguru.com/Cpp/controls/treeview/misc-advanced/article.php/c713/

    To serialize the tree view control override the Serialize() function. The Serialize() function is a virtual function defined in Cobject.

    In the code below we save the outline to a text file and can read it back from a text file. When saving the outline to the archive, tabs are used to indent the item text. Again, when reading back, tabs are used to determine the level that the newly read item should be placed at.
     

     1 void CTreeCtrlX::Serialize(CArchive& ar) 
    2 {
    3 if (ar.IsStoring())
    4 {
    5 // storing code
    6 HTREEITEM hti = GetRootItem();
    7 while( hti )
    8 {
    9 int indent = GetIndentLevel( hti );
    10 while( indent-- )
    11 ar.WriteString( "\t" );
    12 ar.WriteString( GetItemText( hti ) + "\r\n");
    13 hti = GetNextItem( hti );
    14 }
    15
    16 }
    17 else
    18 {
    19 // loading code
    20 CString sLine;
    21 if( !ar.ReadString( sLine ) )
    22 return;
    23
    24 HTREEITEM hti = NULL;
    25 int indent, baseindent = 0;
    26 while( sLine[baseindent] == '\t' )
    27 baseindent++;
    28 do
    29 {
    30 if( sLine.GetLength() == 0 )
    31 continue;
    32 for( indent = 0; sLine[indent] == '\t'; indent++ )
    33 ; // We don't need a body
    34 sLine = sLine.Right( sLine.GetLength() - indent );
    35 indent -= baseindent;
    36
    37 HTREEITEM parent;
    38 int previndent = GetIndentLevel( hti );
    39 if( indent == previndent)
    40 parent = GetParentItem( hti );
    41 else if( indent > previndent )
    42 parent = hti;
    43 else
    44 {
    45 int nLevelsUp = previndent - indent;
    46 parent = GetParentItem( hti );
    47 while( nLevelsUp-- )
    48 parent = GetParentItem( parent );
    49 }
    50 hti = InsertItem( sLine, parent ? parent : TVI_ROOT, TVI_LAST );
    51 }while( ar.ReadString( sLine ) );
    52
    53 }
    54 }
    55
    56
    57
    58 int CTreeCtrlX::GetIndentLevel( HTREEITEM hItem )
    59 {
    60 int iIndent = 0;
    61
    62 while( (hItem = GetParentItem( hItem )) != NULL )
    63 iIndent++;
    64 return iIndent;
    65 }
    66
    67
    68 // GetNextItem - Get next item as if outline was completely expanded
    69 // Returns - The item immediately below the reference item
    70 // hItem - The reference item
    71 HTREEITEM CTreeCtrlX::GetNextItem( HTREEITEM hItem )
    72 {
    73 HTREEITEM hti;
    74
    75 if( ItemHasChildren( hItem ) )
    76 return GetChildItem( hItem ); // return first child
    77 else{
    78 // return next sibling item
    79 // Go up the tree to find a parent's sibling if needed.
    80 while( (hti = GetNextSiblingItem( hItem )) == NULL ){
    81 if( (hItem = GetParentItem( hItem ) ) == NULL )
    82 return NULL;
    83 }
    84 }
    85 return hti;
    86 }


    //我对它的新改进,适用于有图片的情况
     1 void CFileView::Serialize(CArchive& ar)
    2 {
    3 if (ar.IsStoring())
    4 { // storing code
    5 HTREEITEM hti = m_wndFileView.GetRootItem();
    6 while( hti )
    7 {
    8 int indent = GetIndentLevel( hti );
    9 while( indent-- )
    10 ar.WriteString( _T("\t") );
    11 int nImage = 0;
    12 int nSelectedImage = 0;
    13 m_wndFileView.GetItemImage(hti,nImage,nSelectedImage);
    14 CString str;
    15 str.Format(_T("%d\t%d\t"),nImage,nSelectedImage);
    16 ar.WriteString( str + m_wndFileView.GetItemText( hti ) + "\r\n");
    17 hti = GetNextItem( hti );
    18 }
    19 }
    20 else
    21 { // loading code
    22 CString sLine;
    23 CString nImage;
    24 CString nSelectImage;
    25 if( !ar.ReadString( sLine ) )
    26 return;
    27
    28 HTREEITEM hti = NULL;
    29 int indent, baseindent = 0;
    30 while( sLine[baseindent] == '\t' )
    31 baseindent++;
    32 do
    33 {
    34 if( sLine.GetLength() == 0 )
    35 continue;
    36 for( indent = 0; sLine[indent] == '\t'; indent++ )
    37 ; // We don't need a body
    38 sLine = sLine.Right( sLine.GetLength() - indent );
    39 nImage = sLine[0];
    40 nSelectImage = sLine[2];
    41 sLine = sLine.Right(sLine.GetLength() - 4);
    42 indent -= baseindent;
    43
    44 HTREEITEM parent;
    45 int previndent = GetIndentLevel( hti );
    46 if( indent == previndent)
    47 parent = m_wndFileView.GetParentItem( hti );
    48 else if( indent > previndent )
    49 parent = hti;
    50 else
    51 {
    52 int nLevelsUp = previndent - indent;
    53 parent = m_wndFileView.GetParentItem( hti );
    54 while( nLevelsUp-- )
    55 parent = m_wndFileView.GetParentItem( parent );
    56 }
    57 hti = m_wndFileView.InsertItem( sLine,_ttoi(nImage),_ttoi(nSelectImage), parent ? parent : TVI_ROOT, TVI_LAST );
    58 }while( ar.ReadString( sLine ) );
    59 }


  • 相关阅读:
    【NX二次开发】获取体是实体还是片体UF_MODL_ask_body_type()
    【creo】CREO5.0+VS2019配置(还没写完)
    【NX二次开发】导出x_t、导入x_t例子,UF_PS_export_data、UF_PS_import_data
    UG_PS Parasolid相关的操作
    【NX二次开发】创建老版的基准平面uf5374
    UnityShader之固定管线命令Combine纹理混合【Shader资料4】
    UnityShader之固定管线Fixed Function Shader【Shader资料3】
    UnityShader之Shader分类篇【Shader资料2】
    UnityShader之Shader格式篇【Shader资料1】
    Unity3D事件函数的执行顺序
  • 原文地址:https://www.cnblogs.com/luoshupeng/p/2222033.html
Copyright © 2011-2022 走看看