Click here to Skip to main content
15,895,554 members
Articles / Desktop Programming / MFC

A skinned dialog in Python and MFC

Rate me:
Please Sign up or sign in to vote.
4.29/5 (4 votes)
24 Jul 2011CPOL3 min read 47.9K   6.6K   35  
Help to make a skinned dialog program easily in Python, XML with a UI window DLL.
#include "StdAfx.h"
#include ".\xmlparser.h"

//////////////////////////////////////////////////////////////////////////
// Static Init
//////////////////////////////////////////////////////////////////////////
CXMLParser* CXMLParser::m_pXMLParser = NULL;

//////////////////////////////////////////////////////////////////////
// XML Parsing Handler
//////////////////////////////////////////////////////////////////////
static void XMLCALL xml_start(void *data, const char *el, const char **attr)
{
	CXMLParser* pXMLParser = CXMLParser::m_pXMLParser;
	if ( pXMLParser ) {
		pXMLParser->XML_StartElement(data,el,attr);
	}
}

static void XMLCALL xml_end(void *data, const char *el)
{
	CXMLParser* pXMLParser = CXMLParser::m_pXMLParser;
	if ( pXMLParser ) {
		pXMLParser->XML_EndElement(data,el);
	}
}

static void XMLCALL xml_char(void *userData,const XML_Char *s,int len)
{
	CXMLParser* pXMLParser = CXMLParser::m_pXMLParser;
	if ( pXMLParser ) {
		pXMLParser->XML_GetCharData(userData,s,len);
	}
}

static void XMLCALL xml_cd_start(void *userData)
{
	CXMLParser* pXMLParser = CXMLParser::m_pXMLParser;
	if ( pXMLParser ) {
		pXMLParser->XML_StartCDData(userData);
	}
}

static void XMLCALL xml_cd_end(void *userData)
{
	CXMLParser* pXMLParser = CXMLParser::m_pXMLParser;
	if ( pXMLParser ) {
		pXMLParser->XML_EndCDData(userData);
	}
}

//////////////////////////////////////////////////////////////////////////
// XMLParser Process
//////////////////////////////////////////////////////////////////////////
VOID CXMLParser::XML_StartElement(void *data, const char *el, const char **attr)
{
	CUnit* pUnit = new CUnit();
	if ( !pUnit ) return;

	if ( !m_RootUnit ) {
		m_RootUnit = pUnit;
	}

	if ( m_CurrentUnit ) {
		m_CurrentUnit->child_unit.push_back( pUnit );
		pUnit->parent_unit = m_CurrentUnit;
	}

	if ( pUnit ) {
		pUnit->element = el;		
		for (int i = 0;attr[i]; i+= 2)
		{
			string temp = attr[i];
			char* str_id = _strdup( temp.c_str() );
			string attr_id = _strlwr( str_id );
			string attr_value = attr[i + 1];
			if ( str_id ) {
				delete [] str_id;
				str_id = NULL;
			}
			pUnit->attributes[attr_id] = attr_value;
		}
		m_CurrentUnit = pUnit;
	}
}

VOID CXMLParser::XML_EndElement(void *data, const char *el)
{
	if ( m_CurrentUnit ) {
		CUnit* pUnit = m_CurrentUnit->parent_unit;
		if ( pUnit ) {
			m_CurrentUnit = pUnit;
		}
	}
}

VOID CXMLParser::XML_StartCDData(void *userData)
{

}

VOID CXMLParser::XML_EndCDData(void *userData)
{

}

VOID CXMLParser::XML_GetCharData(void *userData,const char *s,int len)
{
	if ( m_CurrentUnit ) {
		m_CurrentUnit->chardata.assign( s , len );
	}
}

//////////////////////////////////////////////////////////////////////////
// XMLParser Object Handler
//////////////////////////////////////////////////////////////////////////
CXMLParser::CXMLParser(void)
{
	m_RootUnit = NULL;
	m_CurrentUnit = NULL;
	m_pXMLParser = NULL;
}

CXMLParser::~CXMLParser(void)
{
	if ( m_RootUnit ) {
		delete m_RootUnit;
		m_RootUnit = NULL;
	}
}

BOOL CXMLParser::Initialize(LPCTSTR lpszFileName)
{
	if ( m_parser ) return FALSE;
	if ( !m_File.Open( lpszFileName , CFile::modeRead ) ) return FALSE;
	
	m_parser = XML_ParserCreate(NULL);
	m_pXMLParser = this;

	// setting handler
	XML_SetElementHandler(m_parser, xml_start, xml_end);
	XML_SetCharacterDataHandler(m_parser,xml_char);
	XML_SetCdataSectionHandler(m_parser,xml_cd_start,xml_cd_end);

	return TRUE;
}

VOID CXMLParser::Finalize()
{
	if ( m_File.hFileNull != m_File.m_hFile) {
		m_File.Close();
	}
	if ( m_parser ) {
		XML_ParserFree(m_parser);
		m_parser = NULL;
	}
}

BOOL CXMLParser::DoParsing()
{
	if ( m_File.m_hFile == m_File.hFileNull ) {
		return FALSE;
	}

	BOOL bDone = FALSE;
	UINT nReadByte = 0;
	while ( nReadByte = m_File.Read(m_caBuff,nBufferSize) )
	{
		if ( XML_Parse(m_parser,m_caBuff,nReadByte,bDone) == XML_STATUS_ERROR ) {
			CString strErr;
			strErr.Format( "Parse error at line:%d %s\n", 
				XML_GetCurrentLineNumber(m_parser) , 
				XML_ErrorString(XML_GetErrorCode(m_parser)));
			MessageBox(NULL,strErr,NULL,NULL);
		}
		if ( bDone ) break;
	}
	return TRUE;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer SEC
Korea (Republic of) Korea (Republic of)
Worked and Working as Windows, Game Software, Mobile Developer.

Comments and Discussions