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 }


转载于:https://www.cnblogs.com/luoshupeng/archive/2011/10/23/2222033.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值