VC++开发GIS系统(56)使用自定义坐标系画点

在之前的文章《VC++开发GIS系统(49)屏幕坐标转换编码》和《VC++开发GIS系统(50)使用自定义平面坐标系》中已经实现了MFC默认坐标向我们自定义的平面坐标的转换。这种情况下我们画点的时候就不能用之前的MFC坐标了,而是要用我们自定义的坐标系统。本文对之前的程序做了修改,完成自定义坐标下点的输入。

输入点的类修改

既然要在输入点的时候使用自定义坐标,那肯定要把自定义坐标作为一个参数传入输入点的类。修改如下:

/*
* 输入点 
*/
class malapointsdll CmalaPointsInput : public CmalaMouseAction
{
public:
    CmalaPointsInput(CView* mView,malaScreen pScreen);//构造函数增加传入坐标系参数
    ~CmalaPointsInput();
    void LButtonDown(UINT nFlags, malaPoint point);
    void GetPointPro();//获取点的参数
private:
    malaPoint mPont;
    malaPointPro mPointPro;
    malaScreen mScreen;//用来保存传入的坐标系参数
};

构造函数修改

CmalaPointsInput::CmalaPointsInput(CView* mView, malaScreen pScreen)
{
    mBaseView = mView;
    mScreen = pScreen;//获取传入的坐标系参数
    GetPointPro();
}

自定义CDC类的修改

既然要在新坐标系中画图,那么自定义CDC类肯定也要传入坐标系参数,修改如下:

/*
* 绘图类
*/
class malabasedll malaCDC
{
public:
    malaCDC(CView* ptView,malaScreen pScreen);//增加传入坐标系参数
    ~malaCDC();
public:
    void pointDrawCircle(malaPoint Point, malaPointPro PntPro);//绘制一个圆点
    void pointDrawRect(malaPoint Point, malaPointPro PntPro);//绘制一个矩形点
    void pointDrawTriangle(malaPoint Point, malaPointPro PntPro);//绘制一个三角形点

private:
    CView* mView;//绘图指针
    malaScreen mScreen;//用于保存坐标系参数

};

构造函数实现修改

malaCDC::malaCDC(CView* ptView,malaScreen pScreen)
{
    mView = ptView;
    mScreen = pScreen;//获取传入的坐标系参数
}

画点函数修改

其实画点的逻辑还是一样,需要更改的有2点:1是要在自定义坐标系下重新构造点的坐标,2是将这个新坐标系的坐标转换成MFC默认的坐标,然后绘图即可。

画圆点的函数修改
/*
* 绘制圆点
*/
void malaCDC::pointDrawCircle(malaPoint Point, malaPointPro PntPro)
{
    //MessageBox(NULL, L"绘制圆形", _T("提示"), MB_OK);
    CClientDC dc(mView);

    CPen pen(0, 1, PntPro.pointColor);
    CPen* OldPen = dc.SelectObject(&pen);
    CBrush MyBrush(PntPro.pointColor);
    CBrush* OldBrush = dc.SelectObject(&MyBrush);
    CPoint Point1, Point2;
    CoordToScreen(Point.x - PntPro.pointRadio, Point.y + PntPro.pointRadio, mScreen, &Point1.x, &Point1.y);
    CoordToScreen(Point.x + PntPro.pointRadio, Point.y - PntPro.pointRadio, mScreen, &Point2.x, &Point2.y);
    dc.Ellipse(CRect(Point1, Point2));
    dc.SelectObject(OldPen);
    dc.SelectObject(OldBrush);
}
画三角点的函数修改
/*
* 绘制三角形点
*/
void malaCDC::pointDrawTriangle(malaPoint Point, malaPointPro PntPro)
{
    //MessageBox(NULL, L"绘制三角形", _T("提示"), MB_OK);
    CClientDC dc(mView);
    CPen pen(0, 1, PntPro.pointColor);
    CPen* OldPen = dc.SelectObject(&pen);
    CBrush MyBrush(PntPro.pointColor);
    CBrush* OldBrush = dc.SelectObject(&MyBrush);
    double radio = PntPro.pointRadio;
    double r1 = sqrtf(3.0) / 2.0 * radio;
    CPoint* MyArray = new CPoint[3];
    
    CoordToScreen(Point.x - r1, Point.y - (double)radio / 2, mScreen, &MyArray[0].x, &MyArray[0].y);
    CoordToScreen(Point.x + r1, Point.y - (double)radio / 2, mScreen, &MyArray[1].x, &MyArray[1].y);
    CoordToScreen(Point.x, Point.y + radio, mScreen, &MyArray[2].x, &MyArray[2].y);

    dc.Polygon(MyArray, 3);
    dc.SelectObject(OldPen);
    dc.SelectObject(OldBrush);
}
画方形点的函数修改
/*
* 绘制矩(方)形点
*/
void malaCDC::pointDrawRect(malaPoint Point, malaPointPro PntPro)
{
    //MessageBox(NULL, L"绘制方形", _T("提示"), MB_OK);
    CClientDC dc(mView);

    CPen pen(0, 1, PntPro.pointColor);
    CPen* OldPen = dc.SelectObject(&pen);
    CBrush MyBrush(PntPro.pointColor);
    CBrush* OldBrush = dc.SelectObject(&MyBrush);
    CPoint Point1, Point2;
    CoordToScreen(Point.x - PntPro.pointRadio, Point.y + PntPro.pointRadio, mScreen, &Point1.x, &Point1.y);
    CoordToScreen(Point.x + PntPro.pointRadio, Point.y - PntPro.pointRadio, mScreen, &Point2.x, &Point2.y);

    dc.Rectangle(CRect(Point1, Point2));
    dc.SelectObject(OldPen);
    dc.SelectObject(OldBrush);
}

调用修改

在malagisView.cpp中,输入点菜单的响应

void CmalagisView::OnButtonPointsInput()
{
    // TODO:  在此添加命令处理程序代码
    mBaseOper = new CmalaPointsInput(this,mScreen);//增加传入坐标系参数
}

点击左键响应

void CmalagisView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO:  在此添加消息处理程序代码和/或调用默认值
        
    malaPoint tmpPoint;
    ScreenToCoord(point.x, point.y, mScreen, &tmpPoint.x, &tmpPoint.y);
    if (mBaseOper)
    {
        mBaseOper->LButtonDown(nFlags, tmpPoint);//传入自定义坐标系参数
    }
    
    CView::OnLButtonDown(nFlags, point);
}
VC++开发GIS系统(55)解决Ribbon状态栏显示内容不全 VC++开发GIS系统(57)文件管理方案设计

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

发表评论