⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cxml.cpp

📁 一款45度2D游戏地图编辑器和大家一起分享啊!
💻 CPP
字号:
#include "stdafx.h"
#include "CXML.h"

CXML::CXML(void)
{
}

CXML::~CXML(void)
{
}


//加载XML文件(文件名)
BOOL CXML::LoadXML(char* XmlFile)
{
	IXMLDOMDocument* pDoc;				//DOM解析对象
	if(SUCCEEDED(CoInitialize(NULL)))
	{
		//是否成功创建XML-----DOM对象
		if(SUCCEEDED(CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, 
			IID_IXMLDOMDocument, (void**)&pDoc))) 
		{

			VARIANT_BOOL vBool;
			if(SUCCEEDED(pDoc->put_async(VARIANT_FALSE)))
			{
				CComVariant vFile(XmlFile);
				pDoc->load(vFile,&vBool);			//加载
				if(vBool==VARIANT_TRUE)
				{
					if(ReadXML(pDoc))	//读取
					{
						pDoc->Release();
						pDoc=NULL;
						return TRUE;
					}
					else
					{
						pDoc->Release();
						pDoc=NULL;
						return FALSE;
					}
				}
				else
				{
					return FALSE;
				}
			}
			else 
			{
				return FALSE;
			}
		}
		else
		{
			return FALSE;
		}
	}
	return TRUE;
}

//----------------------------读取XML-----------------------------------
BOOL CXML::ReadXML(IXMLDOMDocument* pDoc)
{
	BOOL result;
	IXMLDOMNode* pNode;
	if(SUCCEEDED(pDoc->QueryInterface(IID_IXMLDOMNode,(void**)(&pNode))))
	{
		result = IterateChildNote(pNode);
	}
	pNode->Release();
	pNode=NULL;
	return result;
}

BOOL CXML::IterateChildNote(IXMLDOMNode* pNode)
{
	USES_CONVERSION;
	BSTR bstrNodeName;				//节点名字
	BSTR bstrNodeType;				//节点类型名字
	BSTR bstrValue;					//节点值
	DOMNodeType eEnum;				//节点类型
	ResStruct* res;					//XML映射结构
	SortMenu* sortmenu;				//类型结构
	//--------------------------------------------
	char* cNodeName;				//char*类型的节点名字
	//--------------------------------------------
	if(pNode)
	{
		pNode->get_nodeName(&bstrNodeName);			//得到节点名字
		pNode->get_nodeTypeString(&bstrNodeType);	//得到节点类型名字
		pNode->get_nodeType(&eEnum);				//得到节点类型
		pNode->get_text(&bstrValue);				//得到节点值
		cNodeName = OLE2T(bstrNodeName);
		if(eEnum == NODE_ELEMENT)
		{
			//如果读到另一种资源
			/*if(strcmp(cNodeName,"RES") == 0)
			{
				sortmenu = new SortMenu;
				IterateAttibutes(pNode,sortmenu);
			}
			else */if(strcmp(cNodeName,"IMG") == 0)
			{
				res = new ResStruct;
				IterateAttibutes(pNode,res);
			}
		}	
	}
	//------------------------递归-----------------------------
	IXMLDOMNode* pNext=NULL;
	IXMLDOMNode* pChild;
	pNode->get_firstChild(&pChild);
	while(pChild)
	{
		IterateChildNote(pChild);
		pChild->get_nextSibling(&pNext);
		pChild->Release();
		pChild=pNext;

	}
	return TRUE;
}

BOOL CXML::IterateAttibutes(IXMLDOMNode* pNode,ResStruct* res)
{
	IXMLDOMNamedNodeMap* pAttrs;
	char* cName;
	char* cValue;
	USES_CONVERSION;
	if(SUCCEEDED(pNode->get_attributes(&pAttrs))&&(pAttrs!=NULL))
	{
		IXMLDOMNode* pChild;
		pAttrs->nextNode(&pChild);	
		int R,G,B;				//颜色RGB
		while(pChild)
		{
			BSTR bstrName;
			VARIANT vValue;
			pChild->get_nodeName(&bstrName);
			pChild->get_nodeValue(&vValue);
			cName = OLE2T(bstrName);
			if(strcmp(cName,"RESID")==0)
			{
				cValue = OLE2T(vValue.bstrVal);
				res->ResId =  atoi(cValue);				//资源ID
				res->TypeId = this->iResTypeId;			//类别ID
			}
			else if (strcmp(cName,"src")==0) {
				cValue = OLE2T(vValue.bstrVal);
				strcpy(res->ResSrc,cValue);			//资源地址
			}	
			else if(strcmp(cName,"width")==0)
			{
				cValue = OLE2T(vValue.bstrVal);
				res->width = atoi(cValue);				//宽
			}
			else if(strcmp(cName,"height")==0)
			{
				cValue = OLE2T(vValue.bstrVal);
				res->height = atoi(cValue);				//宽
			}
			else if(strcmp(cName,"R")==0)
			{
				cValue = OLE2T(vValue.bstrVal);
				R = atoi(cValue);				//R
			}
			else if(strcmp(cName,"G")==0)
			{
				cValue = OLE2T(vValue.bstrVal);
				G = atoi(cValue);				//G
			}
			else if(strcmp(cName,"B")==0)
			{
				cValue = OLE2T(vValue.bstrVal);
				B = atoi(cValue);		
				res->KeyColor = RGB(R,G,B);			//B
				ResVector.push_back(res);			//添加到资源
			}		
			SysFreeString(bstrName);
			VariantClear(&vValue);
			pChild->Release();
			pAttrs->nextNode(&pChild);
		}
	}
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -