QMapObj.h
上传用户:oybseng
上传日期:2015-04-27
资源大小:7831k
文件大小:7k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // QMapObj.h: interface for the CQMapObj class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_QMAPOBJ_H__3AC4257E_9950_4FE0_8E31_E4DB67D13C55__INCLUDED_)
  5. #define AFX_QMAPOBJ_H__3AC4257E_9950_4FE0_8E31_E4DB67D13C55__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include "afxtempl.h"
  10. #include "..includeQBaseObj.h"
  11. #include "..includeQCoordSys.h"
  12. class CBoundaryRect;
  13. class CQSelObjManager;
  14. class CQLayerObj;
  15. class CQPoint;
  16. class CQPointArray;
  17. typedef CTypedPtrArray<CObArray,CQLayerObj*>  CQLayers;
  18. class AFX_EXT_CLASS CQMapObj : public CObject
  19. {
  20. public:
  21. virtual void Serialize(CArchive & ar);
  22. virtual BOOL DataSave(const char * sz);
  23. virtual BOOL DataOpen(const char * sz);
  24. CQMapObj();
  25. virtual ~CQMapObj();
  26. virtual void Save(const char * sz);
  27. BOOL Open(const char * sz);
  28. //初始化图幅边界矩形 
  29. void InitBoundary();
  30. void CalculateBoundary(CBoundaryRect * prect);
  31. //图幅显示
  32. virtual void Display(CQCoordSys * pCoorSys,CDC *pDC,int nDrawMode, int nSpecialMode,COLORREF * pColor);
  33. virtual void Move(double dx,double dy); //图幅移动
  34. virtual void Rotate(CQPoint & pt,double fAngle);
  35. //点选
  36. virtual CQBaseObj * Select(CQSelObjManager *pSelObjs,CQCoordSys *pCoorSys,CQPoint &pt, double & fEffectedDistance);
  37. //框选 返回选中的图元数量
  38. virtual int Select(CQSelObjManager * pSelObjs,CQCoordSys * pCoorSys,CBoundaryRect &rectSel);
  39. virtual CQBaseObj * SingleSelect(CQSelObjManager *pSelObjs,CQCoordSys *pCoorSys,
  40. CQPoint &pt, double & fEffectedDistance, int nSelectObjType = 0);
  41. //TODO: 捕捉点pt附近的对象,捕捉到的点存放在ptAry中,返回捕捉点的个数,注意有效距离是逻辑坐标
  42. //virtual int CapturePoint(CQPointArray & ptAry,CQCoordSys *pCoorSys,CQPoint &pt, double & fEffectedDistance,CObList *pObjList = NULL);
  43. //显示图幅的背景
  44. virtual void DisplayBackground(CQCoordSys *pCoorSys,CDC * pDC );
  45. //在屏幕上显示全图
  46. void DisplayAllInView(CQCoordSys *pCoorSys,CView * pView);
  47. void AddObject(CQBaseObj * pObj ); //添加图元对象到图幅
  48. void DeleteObject(CQBaseObj * pObj); //从图幅中删除图元对象
  49. void RemoveObject(CQBaseObj * pObj); //从图幅中移出图元对象
  50. void AddLayer(CQLayerObj * pLayer);      //添加图层对象
  51. inline void DelLayer(CQLayerObj * pLayer);        //删除图幅中的图层对象,传入指针变为NULL
  52. inline void DelLayer(int nIndex );
  53. void RemoveLayer(CQLayerObj * pLayer); //从图幅中移出图层对象
  54. void RemoveLayerByIndex(int nIndex); //从图幅中移出第nIndex个图层
  55. int IndexLayer(long lLayerID);           //根据图层ID查找图层的下标,下标从0开始
  56. inline int GetLayerCount() const ;             //获取图层个数
  57. inline CQLayerObj * GetLayer(int nIndex);    //获取第nIndex个图层
  58. CQLayerObj * FindLayer(CString szLayerName); //已图层的名称查找图层
  59. CQLayerObj * FindLayer(long lLayerID);
  60. inline CQBaseObj * FindObj(long lObjID); //在图幅范围内查找对象
  61. void SetModifiedFlag(DWORD f);           //造成工程修改的操作标识的设置
  62. inline void MoveLayerPrev(CQLayerObj * pLayer,int nCount);
  63. inline void MoveLayerNext(CQLayerObj * pLayer,int nCount);
  64. inline void MoveLayerToTop(CQLayerObj * pLayer);
  65. inline void MoveLayerToBottom(CQLayerObj * pLayer);
  66. inline void ExchangeLayerPos(CQLayerObj * pLayer1,CQLayerObj * pLayer2);
  67. inline void ExchangeLayerPos(int nPos1,int nPos2);
  68. inline int  GetLayerIndex(CQLayerObj * pLayer);
  69. inline void SetLayerIndex(CQLayerObj * pLayer, int nIndex);
  70. CBoundaryRect * GetMapBoundary();
  71. //获取图幅的当前图层
  72. CQLayerObj * GetCurLayer();
  73. //获取当前图层的下标序号
  74. inline int GetCurLayerIndex();
  75. //将下标为nIdnex的图层对象设置为当前图层
  76. inline void  SetCurLayer(int nIndex);
  77. //将图层对象设置成为当前图层
  78. inline void  SetCurLayer(CQLayerObj * pLayer);
  79. //判断图幅中是否有图元存在
  80. inline void ClearAll(bool bCreateNewLayer= false);
  81. BOOL IsEmpty() ;
  82. //获取当前图幅的全路径
  83. inline CString GetMapPath();
  84. inline CQLayers * GetLayers();
  85. CQCoordSys * GetCoordSysPointer();
  86. //将传入的图幅指针指向的图幅对象中的所有对象转移到本图幅对象中
  87. //两个图幅对象的所有图层结构必须完全一样才能执行本功能
  88. // 所有图元x坐标的按照中心点x坐标和缩放倍数缩放,dFlex>1会放大,dFlex<1会缩小[9/5/2006 Jchen]
  89. void XFlex(double dcp_x,double dFlex);
  90. // 所有图元y坐标的按照中心点y坐标和缩放倍数缩放,dFlex>1会放大,dFlex<1会缩小[9/5/2006 Jchen]
  91. void YFlex(double dcp_y,double dFlex);
  92. /*
  93. public:
  94. //图幅的状态操作
  95. inline BOOL  GetDeletedFlag(); //判断图幅是否处在删除状态
  96. inline BOOL  GetShowFlag(); //判断图元是否处于隐藏状态
  97. inline void  SetDeleteFlag(BOOL bDelete); //设置图幅的删除状态
  98. inline void  SetShowFlag(BOOL bShow); //设置图幅的隐藏状态
  99. inline BOOL GetCanEditableFlag();
  100. void SetEditable(BOOL bEditable);
  101. */
  102. public:
  103. long GetMaxObjID(); //获取当前图幅中的最大图元ID号
  104. long GetMaxLayerID(); //获取当前图幅中的最大图层ID号
  105. inline long GetMapID(); //获取当前图幅ID
  106. inline void SetMapID(long lID ); //设置当前图幅ID
  107. inline CString GetMapName(); //获取当前图幅名
  108. inline void SetMapName(CString sz ); //设置当前图幅名
  109. inline CString GetMapDiscription()const; //获取当前图幅描述
  110. inline void SetMapDiscription(CString sz) ; //设置当前图幅描述
  111. CBoundaryRect * GetBoundary() ; //获取当前图幅的边界矩形
  112. inline long GetScale()const; //获取当前图幅的比例尺
  113. void SetScale(long lScale = 10000); //设置当前图幅的比例尺
  114. inline int GetCoordSys(CString * pszCoordSys = NULL);//获取当前图幅的坐标系统
  115. inline void SetCoordSys(int nCoordSys );  //设置当前图幅的坐标系统
  116. inline void MapToStr(CString * pStr); //将图幅信息写入字符串
  117. inline void GetMapCorner(CQPoint mapcorner[4]);//获取标准分幅时图幅的四个角点坐标
  118. inline void SetMapCorner(CQPoint mapcorner[4]);//设置标准分幅时图幅的四个角点坐标
  119. inline CQPoint GetTopRightCorner(); //获取图幅的右上角点坐标
  120. inline CQPoint GetTopLeftCorner(); //获取图幅的左上角点坐标
  121. inline CQPoint GetBottomLeftCorner(); //获取图幅的左下角点坐标
  122. inline CQPoint GetBottomRightCorner(); //获取图幅的右下角点坐标
  123. inline void SetTopRightCorner(CQPoint pt); //获取图幅的右上角点坐标
  124. inline void SetTopLeftCorner(CQPoint pt); //获取图幅的左上角点坐标
  125. inline void SetBottomLeftCorner(CQPoint pt); //获取图幅的左下角点坐标
  126. inline void SetBottomRightCorner(CQPoint pt); //获取图幅的右下角点坐标
  127. virtual void ReadFromFile(CFile * pf);
  128. virtual void WriteToFile(CFile * pf);
  129. CQSelObjManager * GetSelObjManager();
  130. protected:
  131. long SetMapIDByRandom();        //利用随机数 
  132. long m_lMapID; //图幅的ID
  133. CString m_szMapName; //图幅的名称
  134. CBoundaryRect m_BoundingRect; //图幅的边界矩形
  135. CString m_szMapDiscription; //图幅描述
  136. long m_lScale;                  //比例尺
  137. int m_nCoordSys;                //坐标系统
  138. int m_nElevationSys;            //高程系统
  139. double m_faLongitude[6];        //左右经度范围,分别用三个整数存储度分秒的数值
  140. double m_faLatitude[6];         //上下纬度范围,分别用三个整数存储度分秒的数值
  141. CQLayers m_LayerList;           //图层集合对象
  142. CQLayerObj * m_pCurLayer ;      //当前图层指针
  143. //当图幅不是标准分幅时候,记录图幅的四个角点坐标,从左下起逆时针方向存储
  144. CQPoint  m_aMapCorner[4];
  145. //记录图幅的全路径名,用于改变文件的属性状态,不参与文件存储
  146. //由于防止两个或两个以上的进程同时对一个文件进行操作
  147. CString m_szPathName;
  148. DWORD   m_dwModifiedFlag;
  149. CQCoordSys m_CoordSys;    //坐标系统
  150. CQSelObjManager * m_pSelObjs; //选中对象管理
  151. };
  152. #endif // !defined(AFX_QMAPOBJ_H__3AC4257E_9950_4FE0_8E31_E4DB67D13C55__INCLUDED_)