VC++开发GIS系统(216)重绘区之获取可视范围的所有区

之前的文章已经实现了 输入区 的相应功能,但现在只完成了绘图并保存的过程,如图示:

但现在的问题是当窗口发生重绘时,图形就消失了,所以这里有必要实现区的重绘功能。为了更高的绘图性能,这里设计在重绘时只绘制可见区域的图形,并设计函数如下。

函数定义

在_malaIO.h中的CPolyIO类中添加如下声明

public:
  void getAllPolys(malaScreen &pScreen, vector<malaPolyFile>&pAllPolys, CString &fileName);//获取某个文件中某一范围的所有的区
  • pScreen 当前屏幕坐标
  • pAllPolys 获取所有可见的区
  • fileName 区文件路径

函数实现

在_malaIO.cpp的CPolyIO类中实现上述函数

//获取某个文件中某一范围的所有的区
void CPolyIO::getAllPolys(malaScreen &pScreen, vector<malaPolyFile>&pAllPolys, CString &fileName)
{
  CFile file;
  file.Open(LPCTSTR(fileName), CFile::modeRead | CFile::modeCreate | CFile::modeNoTruncate);
  CArchive ar(&file, CArchive::load);
  if (pAllPolys.size())
    pAllPolys.clear();

  vector<malaPoint> tPoly;
  malaPolyPro tPolyPro;
  malaPoint tPoint;
  int pointNum;
  while (1)
  {
    try
    {
      ar >> tPolyPro.polyId >> tPolyPro.polyStyle >> tPolyPro.borderStyle >> tPolyPro.borderColor >> tPolyPro.borderWidth >> tPolyPro.fillColor >> tPolyPro.fillStyle;
      ar >> pointNum;
    }
    catch (CException* e)
    {
      break;
    }

    for (int i = 0; i < pointNum; i++)
    {
      try
      {
        ar >> tPoint.x >> tPoint.y;
      }
      catch (CException* e)
      {
        break;
      }
      tPoly.push_back(tPoint);
    }
    //检查是否在可视范围内

    malaLogic mylog;
    malaRect lineRc = mylog.getRect(tPoly);
    malaRect screenRc;
    screenRc.xmin = pScreen.lbx;
    screenRc.ymin = pScreen.lby;
    ScreenToCoord(pScreen.wScreen, 0, pScreen, &screenRc.xmax, &screenRc.ymax);

    if (mylog.isRectIntersect(lineRc, screenRc))
    {
      malaPolyFile MyPoly(tPoly, tPolyPro);
      pAllPolys.push_back(MyPoly);
    }
    tPoly.clear();
  }
  ar.Close();
  file.Close();
}

getRect 参考:VC++开发GIS系统(160)重绘线之获取一个图形的外接矩形

isRectIntersect 参考:VC++开发GIS系统(161)判断两个矩形是否相交

详细代码可以参考:GitHub

VC++开发GIS系统(215)输入区之菜单响应 几个有用的GIS接口

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论