www.pudn.com > MapXgis.rar > MapXEagleBar.cpp
// MapXEagleBar.cpp : 实现文件
//
#include "stdafx.h"
#include "MapXSampleMDI.h"
#include "MapXEagleBar.h"
#include ".\mapxeaglebar.h"
// CMapXEagleBar
IMPLEMENT_DYNAMIC(CMapXEagleBar, CCJControlBar)
CMapXEagleBar::CMapXEagleBar()
{
}
CMapXEagleBar::~CMapXEagleBar()
{
}
BEGIN_MESSAGE_MAP(CMapXEagleBar, CCJControlBar)
//{{AFX_MSG_MAP(CWarnListBar)
ON_WM_SIZE()
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_EVENTSINK_MAP(CMapXEagleBar, CCJControlBar)
ON_EVENT(CMapXEagleBar, IDC_MAP_EAGLE, DISPID_MOUSEUP,OnMouseUpInMap, VTS_I2 VTS_I2 VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
END_EVENTSINK_MAP()
// CMapXEagleBar 消息处理程序
int CMapXEagleBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CCJControlBar::OnCreate(lpCreateStruct) == -1)
return -1;
//创建鹰眼图控件
if (!m_eagleMapx.Create(NULL, WS_VISIBLE, CRect(0,0,250,250), this,IDC_MAP_EAGLE))
return -1;
//创建一个图层,用于显示鹰眼图上矩形Feature
m_eagleMapx.GetLayers().CreateLayer("RectLayer");
return 0;
}
void CMapXEagleBar::OnSize(UINT nType, int cx, int cy)
{
CCJControlBar::OnSize(nType, cx, cy);
if (cx != 0 && cy != 0)
m_eagleMapx.MoveWindow(0,0,cx,cy,TRUE);
}
void CMapXEagleBar::OnMapViewChange(double X1,double Y1,double X2,double Y2)
{
double x2,y2,x4,y4; //声明坐标变量
VARIANT scx, scy, scx1, scy1; //声明屏幕坐标变量
VARIANT mapx1,mapy1,mapx2,mapy2; //声明地图坐标变量
//声明FeatureFactory变量并获取缺省值
CMapXFeatureFactory cFactory=m_eagleMapx.GetFeatureFactory();
CMapXLayer layer; //声明图层变量
CMapXFeature feature; //声明Feature变量
CMapXFeatures features; //声明Features变量
CMapXPoints points; //声明Points变量
points.CreateDispatch(points.GetClsid());
//进行坐标变换
m_eagleMapx.ConvertCoordV(&scx,&scy,COleVariant(X1),COleVariant(Y1),miMapToScreen);
m_eagleMapx.ConvertCoordV(&scx1,&scy1,COleVariant(X2),COleVariant(Y2),miMapToScreen);
m_eagleMapx.ConvertCoordV(&scx,&scy1,&mapx1,&mapy1,miScreenToMap);
m_eagleMapx.ConvertCoordV(&scx1,&scy,&mapx2,&mapy2,miScreenToMap);
//获得矩形框顶点坐标
x2=mapx1.dblVal;
y2=mapy1.dblVal;
x4=mapx2.dblVal;
y4=mapy2.dblVal;
//得到添加矩形Feature的图层
layer=m_eagleMapx.GetLayers().Item("RectLayer");
features=layer.AllFeatures();
//没有添加矩形Feature的图层,则新建
if(features.GetCount() == 0)
{
//添加四个顶点构成一个矩形框
points.AddXY(X1,Y1); //添加顶点1
points.AddXY(x2,y2); //添加顶点2
points.AddXY(X2,Y2); //添加顶点3
points.AddXY(x4,y4); //添加顶点4
//创建矩形Feature
COleVariant vtPoints;
vtPoints.vt = VT_DISPATCH;
vtPoints.pdispVal = points.m_lpDispatch;
vtPoints.pdispVal->AddRef();
feature=cFactory.CreateRegion(vtPoints);
//设置矩形Feature的属性
CMapXStyle style=feature.GetStyle();
style.SetRegionPattern(miPatternNoFill); //设置矩形的填充方式
style.SetRegionBorderColor(miColorRed); //设置矩形边框颜色
style.SetRegionBorderWidth(2); //设置矩形边框宽度
feature.SetStyle(style.m_lpDispatch);
//添加已经创建的矩形Feature
m_eaglefeature = layer.AddFeature(feature);
}
else //否则更新Feature的矩形大小与位置
{
m_eaglefeature.GetParts().Item(1).RemoveAll(); //除去已有的顶点
m_eaglefeature.GetParts().Item(1).AddXY(X1,Y1); //添加顶点1
m_eaglefeature.GetParts().Item(1).AddXY(x2,y2); //添加顶点2
m_eaglefeature.GetParts().Item(1).AddXY(X2,Y2); //添加顶点3
m_eaglefeature.GetParts().Item(1).AddXY(x4,y4); //添加顶点4
m_eaglefeature.Update(); //更新Feature属性
}
//更新显示图层
layer.Refresh();
}
bool CMapXEagleBar::OnMouseUpInMap(short ButtonFlag, short ShiftFlag, OLE_XPOS_PIXELS X, OLE_YPOS_PIXELS Y)
{
if(ButtonFlag!=MK_LBUTTON)
return false;
// TODO: 在此添加消息处理程序代码和/或调用默认值
//得到原矩形框左上和右下两个顶点的坐标
double MapOld_x1=m_eaglefeature.GetParts().Item(1).Item(1).GetX();
double MapOld_x3=m_eaglefeature.GetParts().Item(1).Item(3).GetX();
double MapOld_y1=m_eaglefeature.GetParts().Item(1).Item(1).GetY();
double MapOld_y3=m_eaglefeature.GetParts().Item(1).Item(3).GetY();
//转换坐标体系为屏幕坐标
float ScreenOld_x1,ScreenOld_x3,ScreenOld_y1,ScreenOld_y3;
m_eagleMapx.ConvertCoord(&ScreenOld_x1, &ScreenOld_y1, &MapOld_x1, &MapOld_y1, miMapToScreen);
m_eagleMapx.ConvertCoord(&ScreenOld_x3, &ScreenOld_y3, &MapOld_x3, &MapOld_y3, miMapToScreen);
//计算原中心点(屏幕坐标)
float ScreenOldCenter_X=(ScreenOld_x1+ScreenOld_x3)/2;
float ScreenOldCenter_Y=(ScreenOld_y1+ScreenOld_y3)/2;
//新中心点(屏幕坐标)
float ScreenNewCenter_X=X;
float ScreenNewCenter_Y=Y;
//计算两点距离
float distance_x=ScreenNewCenter_X-ScreenOldCenter_X;
float distance_y=ScreenNewCenter_Y-ScreenOldCenter_Y;
//计算新矩形框左上和右下两个顶点的坐标
float ScreenNew_x1=ScreenOld_x1+distance_x;
float ScreenNew_x3=ScreenOld_x3+distance_x;
float ScreenNew_y1=ScreenOld_y1+distance_y;
float ScreenNew_y3=ScreenOld_y3+distance_y;
//转换坐标系为MAP坐标
double x1,x3,y1,y3;
m_eagleMapx.ConvertCoord(&ScreenNew_x1, &ScreenNew_y1, &x1, &y1, miScreenToMap);
m_eagleMapx.ConvertCoord(&ScreenNew_x3, &ScreenNew_y3, &x3, &y3, miScreenToMap);
//得到另外两个顶点的MAP坐标
VARIANT scx1, scy1, scx3, scy3;
VARIANT mapx2,mapy2,mapx4,mapy4;
m_eagleMapx.ConvertCoordV(&scx1,&scy1,COleVariant(x1),COleVariant(y1),miMapToScreen);
m_eagleMapx.ConvertCoordV(&scx3,&scy3,COleVariant(x3),COleVariant(y3),miMapToScreen);
m_eagleMapx.ConvertCoordV(&scx1,&scy3,&mapx2,&mapy2,miScreenToMap);
m_eagleMapx.ConvertCoordV(&scx3,&scy1,&mapx4,&mapy4,miScreenToMap);
double x2=mapx2.dblVal;
double y2=mapy2.dblVal;
double x4=mapx4.dblVal;
double y4=mapy4.dblVal;
//重画矩形框
m_eaglefeature.GetParts().Item(1).RemoveAll(); //除去已有的顶点
m_eaglefeature.GetParts().Item(1).AddXY(x1,y1); //添加顶点1
m_eaglefeature.GetParts().Item(1).AddXY(x2,y2); //添加顶点2
m_eaglefeature.GetParts().Item(1).AddXY(x3,y3); //添加顶点3
m_eaglefeature.GetParts().Item(1).AddXY(x4,y4); //添加顶点4
//更新显示图层
m_eaglefeature.Update(); //更新Feature属性
//发送自定义消息通知mapX_MDI_view
CDoublePoint point;
point.X=m_eaglefeature.GetCenterX();
point.Y=m_eaglefeature.GetCenterY();
AfxGetMainWnd()->SendMessage(WM_MAPX_EAGLE_FEATURE_MOVE, ButtonFlag, (LPARAM)&point);
return true;
}