You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
3.4 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//////////////////////////////////////////////////////////////////////////////
//文件: XmlParse.h
//主要功能: 分析保存的XML双狐扩展名为DML文件),将其关键字及值分别开
//
//程序编写: 2008-05-08
//
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include "layer.h"
class AFX_EXT_CLASS CXmlParse //ggff
{
public:
CXmlParse(void);
virtual ~CXmlParse(void);
void Clear(void);
CString ReadFileName(CFile& fr);
//读取一串XML包括关键字及其值
//分析该串XML语句如果正确将关键字保存在m_strKey中数值保存在m_valArray中
int ReadBeginSection(CFile& fr);
int ReadEndSection(CFile& fr, BOOL bHadBegin);
BOOL IsIncludeValue(void);
//读取一串XML的值结束符号为空格、TAB键、回车及<(标示一新段的开始), 返回值表示是否一个新段的开始
BOOL ReadValue(CFile& fr);
BOOL ReadInner(CFile& fr);
//不区分大小写比较键值
BOOL IsKey(CString lpszKeyString); //与当前m_strKey值比较
BOOL IsKey(const CString& key, LPCTSTR lpszKeyString);
BOOL ParaseKeyValue(CString strKeyValue, CString& key, CString& val); //分析的字符串以=分隔KEY与VALUE
BOOL ParaseKeyValue(int nIndex, CString& key, CString& val); //分析的字符串以=分隔KEY与VALUE
int ReadRect(CFile& fr, CRect8& rect); //读取矩形范围DML关键写及值
//已经将信息读取到了该类中,仅进行分析并形成需要的元素
int ParaseAndReadRect(CFile& fr, CRect8& rect);
int ParaseLayer(CLayer* pLayer, void* pxy);
int ParaseFont(LOGFONT& logFont, CSize8& size);
int ParaseFont(LOGFONT& logFont, CSize8& size, COLORREF& color, int& script);
int DML_ParaseHowToViewCurve(CHowToViewCurve* phtv, void* pxy);
int DML_ParaseHowToViewPoint(CHowToViewPoint* phtp, void* pxy);
int DML_WriteMemoryBlock(CFile& fw, BYTE* lpData, DWORD nDataLength, LPCTSTR strType, int nBaseTabNum = 0);
BYTE* DML_ReadMemoryBlock(CFile& fr, DWORD& nOutDataLength, CString& strType);
int PCG_ParaseHowToViewCurve(CHowToViewCurve* phtv, void* pxy);
int PCG_ParaseHowToViewPoint(CHowToViewPoint* phtp, void* pxy);
int PCG_WriteMemoryBlock(CFile& fw, BYTE* lpData, DWORD nDataLength, LPCTSTR strType, const short& ver = 0, int nBaseTabNum = 0);
BYTE* PCG_ReadMemoryBlock(CFile& fr, DWORD& nOutDataLength, CString& strType);
BOOL IsEndSection() { return m_bOneLineEndSection; } //ggff2025
int ParaseAndReadCoordinate(CFile& fr, CPointList& coords);
int ParaseAndReadList(CFile& fr); //具体数据保存在m_valArray中
protected:
int ReadSection(CFile& fr, BOOL bBegin); //读取一串XML其开始符号为<,结束符号为>
int ReadValueOne(CFile& fr, BOOL *bNewSection); //读取一串XML的值结束符号为<
void ConvertCopy(char * &line,int len, char* &dest);
int ScanfString(CStringArray &m_type, char* str, int len);
BOOL m_bIncludeValue;
public:
BOOL m_bOneLineEndSection; //ggff 2025 用来表示读了一条语句是否是一个完成xml语句ReadBeginSection只是读取< >中的语句,不区分是否 < > 和< /> 所以增加这个(用于区分<Title></Title> 与 <Title />这两种情况)
CString m_strKey;
CStringArray m_valArray;
CString FormatFontDML(LOGFONT& lf, CSize8& size, LPCTSTR elementName = nullptr);
CString FormatFontPCG(LOGFONT& lf, CSize8& size);
CString FormatFontPCG(LOGFONT& lf, CSize8& size, COLORREF& color, int script);
void SetDelimiter(char c) { m_cDelimiter = c; }; //ggff2025 xml文件中有时需要读取多行文本将多行文本的分隔符号设置一下。
static CString SetEscapeCharToChar(CString& str); //替换文本中转义字符 ggff2025
static CString SetCharToEscapeChar(CString& str);
protected:
char m_cDelimiter;
};