selectfeature.cpp

来自「在vc环境下」· C++ 代码 · 共 158 行

CPP
158
字号
#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 + =
减小字号Ctrl + -
显示快捷键?