#ifndef WellXYDCEXT_H
#define WellXYDCEXT_H
#pragma once
#include "NGraphExtend.h"
extern AFX_EXT_API COLORREF HexToColorRefExt(CString strHex);
extern AFX_EXT_API void DrawFrameLineExt(CXyDC* pDC, CPoint2D pt1, CPoint2D pt2, const GDFLOGPEN& logPen);
extern AFX_EXT_API void DrawFrameRectExt(CXyDC* pDC, CRect8 rect, const GDFLOGPEN& logPen);
extern AFX_EXT_API void DrawFillPolygonExt(CXyDC* pDC, CCurveEx& curve, GDFLOGBRUSH & brush);
extern AFX_EXT_API void DrawPolyLineExt(CXyDC* pDC, CCurveEx& curve, const GDFLOGPENEXT& logPen);
extern AFX_EXT_API void DrawPolyLineExt(CXyDC *pDC,CPoint2D* pPoint, int iCount, const GDFLOGPENEXT& logPen);
extern AFX_EXT_API void DrawFillRectExt(CXyDC *pDC,CRect8 &rect, GDFLOGBRUSH &brush);
extern AFX_EXT_API void DrawLineExt(CXyDC* pDC, CPoint2D pt1, CPoint2D pt2, const GDFLOGPENEXT& logPen);
extern AFX_EXT_API void SetClipPtsForPrint(CXyDC* pDC, int n, LPPOINT& pts);
extern AFX_EXT_API void DrawTextExt(CXyDC* pDC, CPoint2D pt1, LPCTSTR str, GDFLOGFONTEXT& font, double dAngle, int iHorAlign, int iVerAlign);
extern AFX_EXT_API void DrawTextExt(CXyDC* pDC, CText& text);
//曲线充填符号
#define PLINE_SOLID_BEZIER PLINE_BEZIER //B样条平滑充填
#define PLINE_SOLID_BCLOSE PLINE_BC //B样条闭合平滑充填
#define PLINE_SOLID_SPLINE PLINE_SPLINE //S样条平滑充填
#define PLINE_SOLID_SCLOSE PLINE_SPLINEC //S样条平滑充填闭合
#define PLINE_SOLID_CENTER 0x00001000 //居中充填
#define PLINE_SOLID_SINGLE 0x00002000 //单行充填
class AFX_EXT_CLASS CCurveFillSymbol : public CCurveView
{
public:
CCurveFillSymbol();
virtual ~CCurveFillSymbol();
protected:
virtual void DoFillContent(CXyDC& dc, CRect8 range);
public:
//初始化属性列表
//virtual void InitPropertiesList();
//在调用Set函数设置数值后自动调用,为了根据符号名称设置符号指针
//virtual void AfterSetPropertyValue(LPCTSTR proName);
public:
virtual void Serialize(CArchive& ar, const short &ver);
virtual int Read(CFile &fr, const short &ver);
virtual void Write(CFile &fw, const short &ver, double cc);
virtual void Draw(CXyDC &dc, CCurveEx *curve);
virtual void ScaleProperty(double sx, double sy);
virtual void WriteDML(CFile &fw, const short &ver, double cc, int nBaseTabNum);
virtual int ReadDML(CFile &fr, const short &ver, void* pXmlParse);
virtual void WritePCG(CFile &fw, const short &ver, double cc, int nBaseTabNum);
virtual int ReadPCG(CFile &fr, const short &ver, void* pXmlParse);
void operator=(CCurveFillSymbol& cr);
//int PositionNew(int bReplace);
void EnableFillCenter(BOOL bEnable);
BOOL IsFillCenter();
void EnableFillSingle(BOOL bEnable);
BOOL IsFillSingle();
CString MarkName; //符号名称
CSize8 m_space; //符号间的空白间隔
CSize8 m_size; //符号大小
CSize8 m_scale; //符号尺寸绽放比例
void* pDraw; //符号指针
BOOL m_bBitmap; //使用位图填充
};
class AFX_EXT_CLASS CFONT
{
public:
CFONT(void);
virtual ~CFONT(void);
virtual void SerializeFont(CArchive& ar, const short& ver);
virtual int ReadFont(CFile& fr, const short& ver);
virtual void WriteFont(CFile& fw, const short& ver);
int ReadFontOld(CFile& fr);
virtual void WriteDMLFont(CFile& fw, const short& ver, int nBaseTabNum);
virtual void WritePCGFont(CFile& fw, const short& ver, int nBaseTabNum);
//分析字体内容,返回分析的有效属性个数,为-1时表示分析错误
virtual int ReadDMLFont(CFile& fr, const short& ver, CXmlParse& xp);
virtual int ReadPCGFont(CFile& fr, const short& ver, CXmlParse& xp);
void operator=(const CFONT& font);
virtual void ScaleProperty(double sx, double sy);
void SetTitle(CString str) { m_strTitle = str; }
CString GetTitle() { return m_strTitle; }
public:
enum EScriptMode
{
modeNormal = 0,
modeSuper = 1, //上标
modeSub = 2 //下标
};
public:
LOGFONT m_logFont; //字型
COLORREF m_frColor; //字体颜色
COLORREF m_bkColor; //背景充填颜色
double m_dWidth; //字宽
double m_dHeight; //字高
double m_dTextSpace; //字间距
int m_nScript; //显示方式: 0常规,1上标,2下标
BOOL m_bTransparent;// 是否透明(仅在派生类GDFLOGFONT中使用)
protected:
CString m_strTitle; //节点名
};
class AFX_EXT_CLASS CTextSegment
{
public:
CTextSegment(void);
virtual ~CTextSegment(void);
CTextSegment* operator = (CTextSegment& ss);
CString DML_ToString(CFONT* pdt);
CString PCG_ToString(CFONT* pdt);
int PCG_ParseFont(CXmlParse& xp, const short& ver);
//对转义字符进行处理
void ToSaveString(CString& str); //转换为保存的串
void ToViewString(CString& str); //转换为可显示的串
public:
LOGFONT* m_pLogFont;//可以为NULL,为NULL时使用CText类的字体定义
COLORREF color; //文字的颜色
CString strText; //这段的显示文本
double scale_w; //宽度缩放因子
double scale_h; //高度缩放因子
CFONT::EScriptMode script; //上下标类型
};
class AFX_EXT_CLASS CDrawTextLine
{
public:
CDrawTextLine(void);
~CDrawTextLine(void);
//带有上下标或设置字体的文本例子:Script为Super时表示上标,为Sub时表示下标
//“新例子上标内容恢复正常”
void Draw(void* pXyDC);
//将一行文字根据设置分隔为多个串
int SplitString(CString strText);
//“老上下标例子^u0.5 上标^n^d0.5 下标^n中华大地”
int SplitStringOld(CString strText);
double GetLineRealWidth(double textWidth); //获得一行的实际宽度
//将所有的文字串输出为一行文本
CString DML_ToString();
int GetSegmentCount();
CTextSegment* GetSegment(int n);
protected:
class AFX_EXT_CLASS CSegmentString : public CTextSegment
{
public:
CSegmentString(void);
~CSegmentString(void);
CSegmentString* operator = (CSegmentString& ss);
int DML_ParseFont(CString& strFont);
CString DML_ToString(CDrawTextLine* pdt = NULL);
public:
int StatisticsCount(); //统计文字个数
//内部统计得到
CSize m_size; //根据当前字体计算的高宽,为了加快计算
int count; //统计的字个数,汉字作为一个字处理,作为光标的定位使用
};
TObjectSet m_seg;
protected:
//新格式操作
int GetNextString(const CString& strText, CString& strOutText, bool& bFontSet, int nStart);
CString GetFontString(CString& txt);
//老格式操作
int GetNextString(const CString& strText, CString& strOutText, CFONT::EScriptMode& nScriptType, int nStart);
double GetFontSizeScale(CString& txt);
void TextOut(void* pXyDC, double x, double y, CString str);
bool TryToDeleteFont(CSegmentString* ps); //如果ps中的字体与m_pLogFont相同时删除
public:
//总的参数设置
LOGFONT* m_pLogFont; //一般指向CText类中的字体
COLORREF color; //文字的颜色
double angle;
double y0;
double x0;
CSize m_size; //显示文本的矩形尺寸
UINT m_textAlign;
};
class CDrawTextExt
{
public:
CDrawTextExt() {};
public:
void DrawTextExt(CXyDC* pDC,CPoint2D pt1, LPCTSTR str, GDFLOGFONT& font, double dAngle, int iHorAlign, int iVerAlign);
void Draw(CXyDC* pDC, CText& text, COLORREF color);
protected:
//BOOL CreateSelectBrush(CXyDC* pDC, COLORREF color, int type);
void DrawRect(CXyDC* pDC, CText& text, CCurveEx* pCurveRect = NULL /*=NULL*/);
int GetTextLineCount(CText& text);
void DrawScriptText(CString str, double x0, double y0, LOGFONT* lf, COLORREF color);
};
#endif