drawDoc.h
上传用户:y440e3
上传日期:2010-03-08
资源大小:200k
文件大小:15k
源码类别:

GIS编程

开发平台:

Visual C++

  1. // DrawDoc.h : interface of the CDrawDoc class
  2. //
  3. /////////////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_DrawDOC_H__0EFFC62E_8953_11D2_AE7B_444553540000__INCLUDED_)
  5. #define AFX_DrawDOC_H__0EFFC62E_8953_11D2_AE7B_444553540000__INCLUDED_
  6. #if _MSC_VER >= 1000
  7. #pragma once
  8. #endif // _MSC_VER >= 1000
  9. #define pi 3.1415926
  10. #include "data1ret.h"
  11. #include "data2set.h"
  12. #include "linkdataset.h"
  13. typedef struct //用来存储逆操作信息的结构
  14. {
  15. unsigned char Lb; //操作的类别
  16. long l_Start; //在外部文件中的位置
  17. int Index; //在删除和增加操作操作时是删除图形元素的数量
  18. }UndoStruct;
  19. typedef struct //用来存储层的信息的结构
  20. {
  21. char m_Name[21];//层的名称
  22. BOOL b_Display; //是否显示1-显示0-隐藏
  23. int reserved; //备用
  24. }LayerStruct;
  25. class CGraphPara //用来存储图形的基本参数的类
  26. {
  27. protected:
  28. int n_ColorNumbAll; //总的颜色数
  29. int n_LayerNumbAll; //总的图层数
  30. int n_ColorNumb; //系统当前具有的颜色数
  31. int n_LayerNumb; //系统当前具有的图层数
  32. long* m_ColorList; //用来存储颜色列表
  33. LayerStruct* m_LayerList;//用来存储层的列表
  34. public:
  35. CGraphPara()
  36. {
  37. n_ColorNumb=100; //最多具有100种颜色
  38. n_LayerNumb=100; //最多具有100层
  39. m_ColorList=new long[n_ColorNumb];
  40. m_LayerList=new LayerStruct[n_LayerNumb];
  41. n_ColorNumb=4; //目前有4种颜色
  42. n_LayerNumb=1; //目前有一层
  43. //以下初始化几种颜色和一个层
  44. m_ColorList[0]=RGB(0,0,0);
  45. m_ColorList[1]=RGB(255,0,0);
  46. m_ColorList[2]=RGB(0,255,0);
  47. m_ColorList[3]=RGB(0,0,255);
  48. m_LayerList[0].b_Display=1;
  49. strcpy(m_LayerList[0].m_Name,"Layer 0");
  50. }
  51. ~CGraphPara()
  52. {
  53. delete m_LayerList;
  54. delete m_ColorList;
  55. }
  56. public:
  57. COLORREF GetColor(int n); //得到第n种颜色的实际颜色
  58. BOOL GetDisplayStatue(int n); //得到第n层的显示状态
  59. };
  60. typedef struct
  61. {
  62. float x;
  63. float y;
  64. float z;
  65. }PointStruct;
  66. class CDraw:public CObject //基本图形类,用来存储图形的颜色、线型、层等信息
  67. {
  68. protected:
  69. CDraw(){} //构造函数
  70. short m_ColorPen; //笔色
  71. short m_ColorBrush; //填充刷颜色
  72. short m_LineWide; //线宽(像素)
  73. short m_LineType; //线型(像素)
  74. short m_Layer; //所处层
  75. int m_id_only; //图形元素唯一的识别号
  76. BOOL b_Delete; //是否处于删除状态
  77. // DECLARE_SERIAL(CDraw); //串形化
  78. public:
  79. CDraw(short ColorPen,short ColorBrush,short LineWide,
  80. short LineType,short Layer,int id_only,BOOL Delete)
  81. //构造函数
  82. {
  83. m_ColorPen=ColorPen;
  84. m_ColorBrush=ColorBrush;
  85. m_LineWide=LineWide;
  86. m_LineType=LineType;
  87. m_Layer=Layer;
  88. b_Delete=Delete;
  89. m_id_only=id_only;
  90. }
  91. //计算点到直线的距离的函数
  92. float PointLine(float xx,float yy,float x1,float y1,float x2,float y2);
  93. //判断点是否在一个多边形区域中的函数
  94. BOOL PointRgn(float x,float y,int Numble,PointStruct *PointList,float blc);
  95. BOOL IsDelete(); //判断一个图形元素是否删除的函数
  96. float CalDisp(float x1,float y1,float x2,float y2);//计算两点间的距离的函数
  97. void Delete(BOOL Is); //删除或恢复删除图形元素的函数
  98. //从一个文件中存储或读出图形坐标数据的函数
  99. virtual void Save(CFile* file,BOOL Yn);
  100. virtual void Serialize(CArchive& ar); //文档串形化函数
  101. void toChar(char *p_Char);
  102. char *toData(char *p_Char);
  103. virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor)=0;
  104. int GetID();
  105. // int ArcRgn(float x,float y,float r,float angl1,float angl2,int nPoint,PointStruct* Pointxy,int *nCross,PointStruct *Pointxy1);
  106. float GetAngle(float x,float y,float xx,float yy);
  107. // int ArcLine(float x,float y,float r,float *angl1,float *angl2,float *X1,float *Y1,float *X2,float *Y2);
  108. // int CircleLine(float x,float y,float r,float *X1,float *Y1,float *X2,float *Y2);
  109. // int PLineRgn(int nPoint1,PointStruct* Pointxy1,int nPoint2,PointStruct* Pointxy2,int *nCross,PointStruct* Pointxy3);
  110. // int CircleCircle(CCircle* cir1,CCircle* cir2,float *angl1,float *angl2);
  111. // int ArcCircle(CArc* arc1,CCircle* cir2,int *nCross,PointStruct* Pointxy1);
  112. }
  113. ;
  114. class CLine:public CDraw //直线类
  115. {
  116. protected:
  117. DECLARE_SERIAL(CLine); //声明串形化
  118. public:
  119. float m_X1,m_X2,m_Y1,m_Y2; //直线的起点和终点
  120. CLine(){} //不带任何参数的构造函数
  121. //以下是有初始化参数的构造函数
  122. CLine(short ColorPen,short ColorBrush,
  123. short LineWide,short LineType,short Layer,int id_only,
  124. BOOL Delete,float X1,float Y1,float X2,float Y2)
  125. :CDraw(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,Delete)
  126. {
  127. m_X1=X1;
  128. m_Y1=Y1;
  129. m_X2=X2;
  130. m_Y2=Y2;
  131. }
  132. //直线的绘制函数
  133. virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor);
  134. //得到边界矩形的函数
  135. void GetRect(float *minX,float *minY,float *maxX,float *maxY);
  136. BOOL IsPoint(float x,float y,float jl); //判断是否被点选中的函数
  137. virtual void Serialize(CArchive& ar); //串形化函数
  138. //从剪裁板中读出或写入剪裁板的函数
  139. void Save(CFile* file,BOOL Yn);
  140. void toChar(char *p_Char);
  141. char *toData(char *p_Char);
  142. void Move(float x_Move,float y_Move);
  143. int LineLine(CLine* line1,float *xxx1,float *yyy1,float *xxx2,float *yyy2);
  144. };
  145. class CCircle:public CDraw //圆及圆形区域类
  146. {
  147. protected:
  148. DECLARE_SERIAL(CCircle);
  149. public:
  150. float m_CircleX,m_CircleY,m_CircleR; //圆心及半径
  151. BOOL b_Fill; //是否填充 1-圆形区域 0-普通圆
  152. CCircle() //不带任何参数的构造函数
  153. {}
  154. CCircle(short ColorPen,short ColorBrush,
  155. short LineWide,short LineType,short Layer,int id_only,
  156. BOOL Delete,float CircleX,float CircleY,float CircleR,BOOL Fill)
  157. :CDraw(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,Delete)
  158. {
  159. m_CircleX=CircleX;
  160. m_CircleY=CircleY;
  161. m_CircleR=CircleR;
  162. b_Fill=Fill;
  163. }
  164. virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor);
  165. void GetRect(float *minX,float *minY,float *maxX,float *maxY);
  166. virtual IsPoint(float x,float y,float jl);
  167. BOOL IsCircle();
  168. virtual void Save(CFile* file,BOOL Yn);
  169. virtual void Serialize(CArchive& ar);
  170. void toChar(char *p_Char);
  171. char *toData(char *p_Char);
  172. void Move(float x_Move,float y_Move);
  173. int CircleLine(CLine* line1,float *angle1,float *angle2,float *X1, float *Y1, float *X2, float *Y2);
  174. int CircleCircle(CCircle* cir1,float *angl1,float *angl2);
  175. };
  176. class CArc:public CCircle //圆弧类
  177. {
  178. protected:
  179. DECLARE_SERIAL(CArc);
  180. public:
  181. float m_Angle1,m_Angle2; //圆弧的起点和终点角度
  182. CArc() //不带任何参数的构造函数
  183. {}
  184. CArc(short ColorPen,short ColorBrush,short LineWide
  185. ,short LineType,short Layer,int id_only,BOOL Delete,float CircleX
  186. ,float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2)
  187. :CCircle(ColorPen,ColorBrush,LineWide,LineType,Layer,Delete,id_only,CircleX,
  188. CircleY,CircleR,Fill)
  189. {
  190. m_Angle1=Angle1;
  191. m_Angle2=Angle2;
  192. }
  193. virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor);
  194. void Init(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,float CircleX,float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2);
  195. void GetRect(float *minX,float *minY,float *maxX,float *maxY);
  196. virtual BOOL IsPoint(float x,float y,float jl);
  197. BOOL IsInArc(float angle);
  198. void Save(CFile* file,BOOL Yn);
  199. virtual void Serialize(CArchive& ar);
  200. void toChar(char *p_Char);
  201. char *toData(char *p_Char);
  202. int ArcLine(CLine *line1, float *angle1, float *angle2, float *X1, float *Y1, float *X2, float *Y2);
  203. int ArcCircle(CCircle* cir1,int *nCross,PointStruct* Pointxy1);
  204. };
  205. class CPline:public CDraw //连续直线或多边形区域类
  206. {
  207. protected:
  208. int m_Numble; //连续直线或多边形区域的顶点数
  209. BOOL b_Fill; //是否为连续直线
  210. DECLARE_SERIAL(CPline); //声明串形化
  211. ;
  212. public:
  213. PointStruct* m_PointList; //存储顶点的数组指针
  214. CPline() //不带任何参数的构造函数
  215. { m_Numble=0;}
  216. CPline(short ColorPen,short ColorBrush,
  217. short LineWide,short LineType,short Layer,int id_only,
  218. BOOL Delete,int Numble,PointStruct* PointList,BOOL Fill)
  219. :CDraw(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,Delete)
  220. {
  221. m_Numble=Numble;
  222. b_Fill=Fill;
  223. m_PointList=new PointStruct[Numble+1]; //分配空间
  224. if(Numble>0)
  225. {
  226. for(int i=0;i<Numble;i++)
  227. m_PointList[i]=PointList[i];
  228. }
  229. }
  230. ~CPline() //析够函数
  231. {
  232. if(m_Numble>0)
  233. delete m_PointList;
  234. }
  235. virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor);
  236. void GetRect(float *minX,float *minY,float *maxX,float *maxY);
  237. BOOL IsPoint(float x,float y,float jl,float blc);
  238. BOOL IsPLine();
  239. void Save(CFile* file,BOOL Yn);
  240. virtual void Serialize(CArchive& ar);
  241. void toChar(char *p_Char);
  242. char *toData(char *p_Char);
  243. int GetNumb();
  244. void Move(float x_Move,float y_Move);
  245. int LineRgn(CLine* line1,int *nCross,PointStruct* Pointxy1);
  246. int PLineRgn(CPline* pline1,int *nCross,PointStruct* Pointxy1);
  247. int ArcRgn(CArc* arc1,int *nCross,PointStruct *Pointxy1);
  248. };
  249. class CText:public CDraw //标注文本类
  250. {
  251. protected:
  252. float m_StartX; //文本起点横坐标
  253. float m_StartY; //起点纵坐标
  254. float m_Angle1; //标注角度
  255. float m_Angle2; //字体旋转角度
  256. float m_TextHeight; //字体高度
  257. float m_TextWide; //字体宽度
  258. float m_OffWide; //间隔宽度
  259. unsigned char m_TextFont; //字体
  260. CString c_Text; //标注的文本信息
  261. int m_TextLong; //标注信息的长度
  262. DECLARE_SERIAL(CText);
  263. public:
  264. CText() //不带任何参数的构造函数
  265. {}
  266. CText(short ColorPen,short ColorBrush,short LineWide
  267. ,short LineType,short Layer,int id_only,BOOL Delete,float StartX,
  268. float StartY,float Angle1,float Angle2,float TextHeight,float TextWide,
  269. float OffWide,unsigned char TextFont,CString Text)
  270. :CDraw(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,Delete)
  271. {
  272. m_StartX=StartX;
  273. m_StartY=StartY;
  274. m_Angle1=Angle1;
  275. m_Angle2=Angle2;
  276. m_TextHeight=TextHeight;
  277. m_TextWide=TextWide;
  278. m_OffWide=OffWide;
  279. m_TextLong=Text.GetLength(); //计算字符的长度
  280. c_Text=Text;
  281. }
  282. virtual void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor);
  283. void Init(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,float StartX,float StartY,float Angle1,float Angle2,float TextHeight,float TextWide,float OffWide,unsigned char TextFont,CString Text);
  284. void GetRect(float *minX,float *minY,float *maxX,float *maxY);
  285. BOOL IsPoint(float x,float y,float jl,float blc);
  286. void Save(CFile* file,BOOL Yn);
  287. virtual void Serialize(CArchive& ar);
  288. void toChar(char *p_Char);
  289. char *toData(char *p_Char);
  290. int GetLong();
  291. void Move(float x_Move,float y_Move);
  292. };
  293. typedef struct
  294. {
  295. short int Lb; //类别 1-直线 2-连续直线或多边形区域 3-圆 4-圆弧 5-文本
  296. short int Index; //序号
  297. short int pbh; //判别号
  298. }GraphSelectStruct; //用来存储选中图形元素的结构
  299. typedef struct
  300. {
  301. short only_ID;
  302. char Name[20];
  303. } DataInfoStru;
  304. typedef struct //用来记录历史屏幕参数的结构
  305. {
  306. float blc; //比例尺
  307. float sx; //屏幕左下角的横坐标
  308. float sy; //屏幕左下角的纵坐标
  309. }ScreenStruct;
  310. class CDrawDoc : public COleDocument
  311. {
  312. protected: // create from serialization only
  313. CDrawDoc();
  314. DECLARE_DYNCREATE(CDrawDoc)
  315.  
  316. private:
  317. CTypedPtrArray<CObArray,CLine*>m_LineArray; //管理直线对象指针的对象
  318. CTypedPtrArray<CObArray,CPline*>m_PLineArray; //管理连续直线对象指针的对象
  319. CTypedPtrArray<CObArray,CCircle*>m_CircleArray;//管理圆对象指针的对象
  320. CTypedPtrArray<CObArray,CArc*>m_ArcArray; //管理圆弧对象指针的对象
  321. CTypedPtrArray<CObArray,CText*>m_TextArray; //管理标注文字对象指针的对象
  322. // Attributes
  323. public:
  324. BOOL b_IsOleSelect; //是否选中了OLE对象
  325. CGraphPara m_GraphPara; //定义一个管理图形参数的对象
  326. GraphSelectStruct *GraphSelect; //存储选中元素的性质
  327. int n_GraphSelect; //选中图形元素的数目
  328. int m_CurrentScreen; //当前屏幕的序号
  329. int m_MaxScreen; //最多能够有的屏幕数
  330. ScreenStruct* m_Screen; //记录屏幕参数的结构指针
  331. CLine* line1;
  332. Data1Set m_data1;
  333. CData2Set m_data2;
  334. CLinkDataSet m_linkdata1;
  335. int *m_Index;
  336. DataInfoStru DataInfo[30];
  337. short m_NumbData;
  338. protected:
  339. CString FilePath,FileName; //存储逆操作文档的路径和文件名
  340. CFile Fundo; //用来存储逆操作信息的文件指针
  341. UndoStruct* m_UndoList; //存储逆操作的索引信息
  342. int n_CurUnIndex,n_MaxUnIndex; //当前处于操作的次数和总的操作次数
  343. UINT DrawFormat;
  344. // Operations
  345. public:
  346. // Overrides
  347. // ClassWizard generated virtual function overrides
  348. //{{AFX_VIRTUAL(CDrawDoc)
  349. public:
  350. virtual BOOL OnNewDocument(); //建立新文档时调用
  351. virtual void Serialize(CArchive& ar); //串形化函数
  352. virtual void DeleteContents(); //删除文档时调用
  353. virtual void OnCloseDocument(); //关闭文档时调用
  354. virtual BOOL OnOpenDocument(LPCTSTR lpszPathName); //打开文档时调用
  355. virtual BOOL OnSaveDocument(LPCTSTR lpszPathName); //保存文档时调用
  356. //}}AFX_VIRTUAL
  357. // Implementation
  358. public:
  359. void Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,short BackColor);
  360. void DrawGraph(CDC* pDC,int Lb,int Index,int Mode,int Mode1,short BackColor);
  361. void OnEditUndo(); //逆操作函数
  362. int GetMaxIndex(int Lb);//得到各类图形元素顶最大索引号
  363. //以下两个重载函数用来记录一步操作
  364. BOOL AddUndo(int Lb,int Numble,GraphSelectStruct* GraphList);
  365. BOOL AddUndo(float sx,float sy,float blc);
  366. BOOL WriteClipBoard(); //将图形元素写入剪裁板
  367. BOOL ReadClipBoard(float x,float y);
  368. BOOL AddSelectList(int Lb,int Index,int Pbh); //增加一个选中的图形元素
  369. //得到所有图形元素的边界按矩形
  370. BOOL GetRect(float *m_Xmin,float *m_Ymin,float *m_Xmax,float *m_Ymax);
  371. //进行选中图形元素的操作
  372. BOOL PointSelect(float x,float y,float jl,float blc,int *Lb,int *Index,int *pbh);
  373. CLine* AddLine(short ColorPen,short ColorBrush,short
  374. LineWide,short LineType,short Layer,int id_only,float X1,float Y1,
  375. float X2,float Y2); //增加一条直线
  376. CLine* AddLine(); //增加一条直线
  377. CLine* GetLine(int Index); //得到第Index条直线
  378. int GetNumbLines(); //得到直线的数目
  379. CPline* AddPLine(short ColorPen,short ColorBrush,
  380. short LineWide,short LineType,short Layer,int id_only,int Numble,
  381. PointStruct* PointList,BOOL b_Fill);
  382. CPline* AddPLine();
  383. CPline* GetPLine(int Index);
  384. int GetNumbPLines();
  385. CCircle* AddCircle(short ColorPen,short ColorBrush,
  386. short LineWide,short LineType,short Layer,int id_only,
  387. float CircleX,float CircleY,float CircleR,BOOL Fill);
  388. CCircle* AddCircle();
  389. CCircle* GetCircle(int Index);
  390. int GetNumbCircles();
  391. CArc* AddArc(short ColorPen,short ColorBrush,short 
  392. LineWide,short LineType,short Layer,int id_only,float CircleX,
  393. float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2);
  394. CArc* AddArc();
  395. CArc* GetArc(int Index);
  396. int GetNumbArcs();
  397. CText* AddText(short ColorPen,short ColorBrush,short
  398. LineWide,short LineType,short Layer,int id_only,float StartX,
  399. float StartY,float Angle1,float Angle2,float TextHeight,float TextWide,
  400. float OffWide,unsigned char TextFont,int TextLong,CString);
  401. CText* AddText();
  402. void AddScreen(float StartX,float StartY,float blc);//增加一个图形屏幕
  403. CText* GetText(int Index);
  404. int GetNumbTexts();
  405. int GetLineId();
  406. int GetPLineId();
  407. int GetCircleId();
  408. int GetArcId();
  409. int GetTextId();
  410. CDataBaseSet *GetDataSet(int Index);
  411. short GetDataID(int Index);
  412. short GetDataIndex(int ID);
  413. virtual ~CDrawDoc();
  414. #ifdef _DEBUG
  415. virtual void AssertValid() const;
  416. virtual void Dump(CDumpContext& dc) const;
  417. #endif
  418. protected:
  419. // Generated message map functions
  420. protected:
  421. //{{AFX_MSG(CDrawDoc)
  422. afx_msg void OnUpdateSelectClear(CCmdUI* pCmdUI);//是否能够执行"放弃选择“
  423. afx_msg void OnUpdateEditUndo(CCmdUI* pCmdUI); //是否能够执行"Undo"菜单
  424. afx_msg void OnTest();
  425. //}}AFX_MSG
  426. DECLARE_MESSAGE_MAP()
  427. };
  428. /////////////////////////////////////////////////////////////////////////////
  429. //{{AFX_INSERT_LOCATION}}
  430. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.
  431. #endif // !defined(AFX_DrawDOC_H__0EFFC62E_8953_11D2_AE7B_444553540000__INCLUDED_)