📄 selectfeature.cpp
字号:
#include "StdAfx.h"
#include ".\selectfeature.h"
STDMETHODIMP CSelectFeature::get_Enabled(VARIANT_BOOL * Enabled)
{
if (Enabled == NULL)
return E_POINTER;
CMapCommandBase::get_Enabled(Enabled);
if (VARIANT_TRUE==*Enabled)
{
IMapPtr cpMap;
m_hookHelper.get_FocusMap(&cpMap);
long count;
cpMap->get_LayerCount(&count);
if (0==count)
*Enabled=VARIANT_FALSE;
}
return S_OK;
}
STDMETHODIMP CSelectFeature::OnMouseDown(LONG Button, LONG Shift, LONG X, LONG Y)
{
if (MouseDown(X,Y))
{
GetFocusMapActiveView(&m_cpActiveView);
ToFocusMapPoint(X,Y, &m_cpStartPoint);
}
return S_OK;
}
STDMETHODIMP CSelectFeature::OnMouseMove(LONG Button, LONG Shift, LONG X, LONG Y)
{
if (CMapToolBase::IsMouseDown() && (m_cpStartPoint!=0))
{
IScreenDisplayPtr cpScreenDisplay;
m_cpActiveView->get_ScreenDisplay(&cpScreenDisplay);
if (m_cpEnvelopeFeedback==0)
{
// Start the feedback if its not previously started
m_cpEnvelopeFeedback.CreateInstance(CLSID_NewEnvelopeFeedback);
m_cpEnvelopeFeedback->putref_Display(cpScreenDisplay);
m_cpEnvelopeFeedback->Start(m_cpStartPoint);
}
// Update the feedback to the new point
IPointPtr cpPoint;
ToFocusMapPoint(X,Y, &cpPoint);
m_cpEnvelopeFeedback->MoveTo(cpPoint);
}
return S_OK;
}
STDMETHODIMP CSelectFeature::OnMouseUp(LONG Button, LONG Shift, LONG X, LONG Y)
{
HRESULT hr;
try
{
if (CMapToolBase::IsMouseDown() && (m_cpStartPoint!=0))
{
IGeometryPtr cpGeom;
if (m_cpEnvelopeFeedback == 0)
{
// It was just a click
cpGeom=m_cpStartPoint;
}
else
{
IEnvelopePtr cpEnvelope;
hr=m_cpEnvelopeFeedback->Stop(&cpEnvelope);
if(FAILED(hr)) _com_issue_error(hr);
cpGeom=cpEnvelope;
if(NULL==cpGeom)
cpGeom=m_cpStartPoint;
}
IMapPtr cpMap;
hr=m_hookHelper.get_FocusMap(&cpMap);
if(FAILED(hr)) _com_issue_error(hr);
ISpatialReferencePtr cpSpatialRef;
hr=cpMap->get_SpatialReference(&cpSpatialRef);
if(FAILED(hr)) _com_issue_error(hr);
hr=cpMap->SelectByShape(cpGeom,NULL,VARIANT_FALSE);
if(FAILED(hr)) _com_issue_error(hr);
IEnvelopePtr cpEnvelop;
hr=m_cpActiveView->get_Extent(&cpEnvelop);
if(FAILED(hr)) _com_issue_error(hr);
hr=m_cpActiveView->PartialRefresh(esriViewGeoSelection,NULL,cpEnvelop);
if(FAILED(hr)) _com_issue_error(hr);
}
}catch (_com_error& e)
{
Reset();
return e.Error();
}
// remove capture and release feedback objects
Reset();
return S_OK;
}
STDMETHODIMP CSelectFeature::OnKeyDown(LONG keyCode, LONG Shift)
{
if (keyCode == VK_ESCAPE)
Reset();
return S_OK;
}
STDMETHODIMP CSelectFeature::Refresh(OLE_HANDLE hDC)
{
if (m_cpEnvelopeFeedback!=0)
m_cpEnvelopeFeedback->Refresh(hDC);
return S_OK;
}
void CSelectFeature::Reset()
{
// clear out temp variables release mouse capture in base class
m_cpActiveView = 0;
m_cpStartPoint = 0;
if (m_cpEnvelopeFeedback)
{
IEnvelopePtr cpEnvelope;
m_cpEnvelopeFeedback->Stop(&cpEnvelope);
}
m_cpEnvelopeFeedback = 0;
CMapToolBase::MouseUp();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -