AO开发笔记(实战篇)-用VC+AO开发独立的应用程序(2)续
在鼠标事件函数中添加如下代码(红色部分): void CAOExStep1View::OnonMouseDownMapcontrol1(long button, long shift, long x, long y, double mapX, double mapY) { if(1 == button) // 鼠标左键按下 { IActiveViewPtr ipAct...
- 作者:Snoopy来源:中国3S网站(httpwww.863s.com)|2006年12月11日
在鼠标事件函数中添加如下代码(红色部分):
void CAOExStep1View::OnonMouseDownMapcontrol1(long button, long shift, long x, long y, double mapX, double mapY)
{
if(1 == button) // 鼠标左键按下
{
IActiveViewPtr ipActiveView;
HRESULT hr=m_ipMapControl->get_ActiveView(&ipActiveView);
if (ipActiveView == NULL) return ;
switch(m_ARTool)
{
case esriARToolNoneSelected:
{
break;
}
case esriARToolMapZoomIn: // 地图放大
{
IEnvelopePtr ipEnvelope;
hr = ipActiveView->get_Extent(&ipEnvelope);
if (FAILED(hr)) return ;
hr = m_ipMapControl->TrackRectangle(&ipEnvelope);
if (FAILED(hr)) return ;
if(ipEnvelope == NULL) return ;
double XMin,YMin,XMax,YMax;
XMin=YMin=XMax=YMax=0.0;
if(S_OK !=ipEnvelope->get_XMin(&XMin)) XMin = 0.0;
if(S_OK !=ipEnvelope->get_YMin(&YMin)) YMin = 0.0;
if(S_OK !=ipEnvelope->get_XMax(&XMax)) XMax = 0.0;
if(S_OK !=ipEnvelope->get_YMax(&YMax)) YMax = 0.0;
if(XMin!=XMax&&YMin!=YMax) // 用户拉框选择区域放大
{
ipActiveView->put_Extent(ipEnvelope);
ipActiveView->Refresh();
}
else // 用户点击进行放大
{
ipActiveView->get_Extent(&ipEnvelope);
if (FAILED(hr)) return ;
IPointPtr ipPoint(CLSID_Point);
ipPoint->put_X(mapX);
ipPoint->put_Y(mapY);
// 设置中心点为用户点击为主
ipEnvelope->CenterAt(ipPoint);
ipEnvelope->Expand(0.5, 0.5, true);
ipActiveView->put_Extent(ipEnvelope);
ipActiveView->Refresh();
}
}
break;
case esriARToolMapZoomOut: // 地图缩小
{
IEnvelopePtr ipEnvelope;
hr = ipActiveView->get_Extent(&ipEnvelope);
if (FAILED(hr)) return ;
IPointPtr ipPoint(CLSID_Point);
ipPoint->put_X(mapX);
ipPoint->put_Y(mapY);
ipEnvelope->CenterAt(ipPoint);
// 设置中心点为用户点击为主
ipEnvelope->Expand(2, 2, true);
ipActiveView->put_Extent(ipEnvelope);
ipActiveView->Refresh();
}
break;
case esriARToolMapPan: // 地图平移
{
m_ipMapControl->Pan();
}
break;
default:
break;
}
}
}
为工具栏前四个按钮添加UPDATE_COMMAND_UI更新函数,代码如下:
//////////////////////////////////////////////////////////////////////////
// 更新工具栏
void CAOExStep1View::OnUpdateMapArrow(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ARTool == esriARToolNoneSelected);
}
void CAOExStep1View::OnUpdateMapPan(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ARTool == esriARToolMapPan);
}
void CAOExStep1View::OnUpdateMapZoomin(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ARTool == esriARToolMapZoomIn);
}
void CAOExStep1View::OnUpdateMapZoomout(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ARTool == esriARToolMapZoomOut);
}
保存修改,编译程序。运行就可以对地图进行放大、缩小、平移、显示全图的操作了(如下图)。
三、本章小结
上面我们添加了地图漫游的功能,并使地图窗口随框架窗口一起缩放。你可能发现我们的程序加载的地图是在设置MapControl控件属性时指定的。我们在下一节中将实现从shp文件加载地图,并实现图层管理的一些功能。