CTreeCtrl保存成XML 从XML中加载项的辅助类(使用tinyxml)
头文件:
#pragma once
// Don't forget the TinyXML include :-)
#include "../TinyXML/tinyxml.h"
class CTreeHelp //: public CTreeCtrl
{
public:
CTreeHelp(CTreeCtrl* tree);
virtual ~CTreeHelp(void);
public:
bool LoadFromXML( const CString& a_strFile,HTREEITEM hTreeItem=NULL );
bool SaveToXML( const CString& a_strFile,HTREEITEM hTreeItem=NULL );
public:
void Load( TiXmlNode* a_pNode,HTREEITEM hTreeItem=NULL );
void Save( TiXmlNode* a_pNode,HTREEITEM item=NULL );
protected:
CTreeCtrl* m_Tree;
void LoadItem( TiXmlNode* a_pNode, HTREEITEM a_hTreeParent );
int GetIndentLevel( HTREEITEM hItem );
HTREEITEM GetNextItem( HTREEITEM hItem );
};
实现文件
#include "StdAfx.h"
#include "TreeCtrlHelp.h"
#include <direct.h> // Needed for getcwd()
CTreeHelp::CTreeHelp(CTreeCtrl* tree)
{
m_Tree=tree;
}
CTreeHelp::~CTreeHelp(void)
{
}
bool CTreeHelp::LoadFromXML( const CString& a_strFile,HTREEITEM hTreeItem/*=NULL */ )
{
TiXmlNode* pXML = NULL;
TiXmlDocument xmlDoc;
char szBuf[ _MAX_PATH + 1 ];
CString strTemp = a_strFile;
getcwd( szBuf, sizeof( szBuf ) );
strcat( szBuf, _T("\\") );
strcat( szBuf, strTemp.GetBuffer( 1 ) );
if( xmlDoc.LoadFile( szBuf ) )
{
// XML root
pXML = xmlDoc.FirstChild( _T("Items") );
if( NULL == pXML )
return false;
// Load our tree control
Load( pXML ,hTreeItem);
// Expand all entries
m_Tree->Expand( m_Tree->GetRootItem(), TVE_EXPAND );
return true;
}
return false;
}
bool CTreeHelp::SaveToXML( const CString& a_strFile,HTREEITEM hTreeItem/*=NULL */ )
{
// Save XML
TiXmlNode* pXML = NULL;
TiXmlDocument xmlDoc;
// XML header
xmlDoc.InsertEndChild( TiXmlDeclaration( _T("1.0"), _T("GB2312"), _T("yes" ) ));
// XML root
pXML = xmlDoc.InsertEndChild( TiXmlElement( _T("Items" ) ));
// Save our tree control
Save( pXML ,hTreeItem);
// Save XML
CString strFile = a_strFile;
return xmlDoc.SaveFile( strFile.GetBuffer( 1 ) );
}
void CTreeHelp::Load( TiXmlNode* a_pNode,HTREEITEM hTreeItem/*=NULL */ )
{
ASSERT( NULL != a_pNode );
TiXmlNode* pItem = NULL;
pItem = a_pNode->FirstChild( _T("Item") );
// Iterate all siblings
while( NULL != pItem )
{
LoadItem( pItem, hTreeItem );
pItem = pItem->NextSibling( _T("Item") );
}
}
void CTreeHelp::Save( TiXmlNode* a_pNode,HTREEITEM item/*=NULL */ )
{
ASSERT( NULL != a_pNode );
TiXmlNode* pParent = a_pNode;
TiXmlNode* pNewNode = NULL;
HTREEITEM hItem ;
if (item)
{
hItem= item;
}
else
{
hItem=m_Tree->GetRootItem();
}
int iIndent = 0; int iLastIndent = 0;
while( hItem )
{
iIndent = GetIndentLevel( hItem );
int iDiff = iIndent - iLastIndent;
if( iDiff > 0 )
{
ASSERT( NULL != pNewNode );
while( iDiff-- )
pNewNode = pNewNode->InsertEndChild( TiXmlElement( _T("Item" ) ));
ASSERT( NULL != pNewNode );
pParent = pNewNode->Parent();
}
else if( iDiff < 0 )
{
iDiff--; // Correct difference to get the right parent
pParent = pNewNode;
while( iDiff++ < 0 )
pParent = pParent->Parent();
ASSERT( NULL != pParent );
pNewNode = pParent->InsertEndChild( TiXmlElement( _T("Item") ) );
}
else
{
ASSERT( NULL != pParent );
pNewNode = pParent->InsertEndChild( TiXmlElement( _T("Item") ) );
}
iLastIndent = iIndent;
// Save current item
TiXmlElement* pElement = pNewNode->ToElement();
ASSERT( NULL != pElement );
pElement->SetValue( _T("Item") );
pElement->SetAttribute( _T("Title"),m_Tree->GetItemText(hItem));
pElement->SetAttribute( _T("Type"),m_Tree->GetItemData(hItem));
// The next item, please ...
hItem =GetNextItem( hItem );
}
}
void CTreeHelp::LoadItem( TiXmlNode* a_pNode, HTREEITEM a_hTreeParent )
{
ASSERT( NULL != a_pNode );
TiXmlElement* pEl = a_pNode->ToElement();
ASSERT( NULL != pEl );
HTREEITEM hItem = NULL;
TiXmlNode* pChild = NULL;
TVINSERTSTRUCT insert;
if( NULL == a_hTreeParent )
{
insert.hParent=TVI_ROOT;
//insert.hInsertAfter=TVI_ROOT;
}
else
{
//insert.hInsertAfter=a_hTreeParent;
insert.hParent=a_hTreeParent;
}
insert.item.state=TVIS_EXPANDED ;
insert.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_PARAM|TVIF_STATE|TVIF_SELECTEDIMAGE;
int type=0;
CString strtitle=pEl->Attribute( _T("Title" ));
insert.item.pszText=strtitle.GetBuffer();
pEl->QueryIntAttribute( _T("Type" ),&type);
insert.item.lParam=type;
insert.item.iImage=type;
insert.item.iSelectedImage=5;
hItem = m_Tree->InsertItem( &insert);
pChild = a_pNode->IterateChildren( _T("Item"), NULL );
while( pChild )
{
LoadItem( pChild, hItem );
pChild = a_pNode->IterateChildren( _T("Item"), pChild );
}
}
int CTreeHelp::GetIndentLevel( HTREEITEM hItem )
{
int iIndent = 0;
while( (hItem = m_Tree->GetParentItem( hItem )) != NULL )
iIndent++;
return iIndent;
}
HTREEITEM CTreeHelp::GetNextItem( HTREEITEM hItem )
{
HTREEITEM hItemRet = NULL;
if( false == m_Tree->ItemHasChildren( hItem ) )
{
while( ( hItemRet = m_Tree->GetNextSiblingItem( hItem ) ) == NULL )
{
if( ( hItem = m_Tree->GetParentItem( hItem ) ) == NULL )
return NULL;
}
}
else
{
return m_Tree->GetChildItem( hItem );
}
return hItemRet;
}
浙公网安备 33010602011771号