VC++开发GIS系统(56)使用自定义坐标系画点
发布时间: 2015-12-19
所属分类: VC++开发GIS系统
在之前的文章《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);
}
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。
手机阅读
公众号关注
知识星球
手机阅读
最新GIS干货
私享圈子