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; 
}