疯子的博客

做一件事,专注一件事
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;

}

posted on 2010-04-25 00:43  老陈  阅读(1359)  评论(0)    收藏  举报