PanLeft.cpp
// Copyright 2010 ESRI // // All rights reserved under the copyright laws of the United States // and applicable international laws, treaties, and conventions. // // You may freely redistribute and use this sample code, with or // without modification, provided you include the original copyright // notice and use restrictions. // // See the use restrictions. // #include "PanLeft.h" PanLeft::PanLeft() { m_ipHookHelper.CreateInstance(CLSID_HookHelper); // Load the bitmap IRasterPicturePtr ipRastPict(CLSID_BasicRasterPicture); IPicturePtr ipPict; HRESULT hr = ipRastPict->LoadPicture(CComBSTR(L"./Res/PanLeft.bmp"), &ipPict); if (SUCCEEDED(hr)) { OLE_HANDLE hBitmap; hr = ipPict->get_Handle(&hBitmap); if (SUCCEEDED(hr)) m_hBitmap = hBitmap; } } PanLeft::~PanLeft() { m_ipHookHelper = 0; m_hBitmap = 0; } HRESULT PanLeft::get_Enabled(VARIANT_BOOL* Enabled) { if (!Enabled) return E_POINTER; IMapPtr ipMap; m_ipHookHelper->get_FocusMap(&ipMap); if (ipMap == 0) return S_OK; *Enabled = VARIANT_TRUE; return S_OK; } HRESULT PanLeft::get_Checked(VARIANT_BOOL* Checked) { if (!Checked) return E_POINTER; Checked = VARIANT_FALSE; return S_OK; } HRESULT PanLeft::get_Name(BSTR* Name) { if (!Name) return E_POINTER; *Name = ::AoAllocBSTR(L"Sample_Pan/Zoom_Pan Left"); return S_OK; } HRESULT PanLeft::get_Caption(BSTR* Caption) { if (!Caption) return E_POINTER; *Caption = ::AoAllocBSTR(L"Pan Left"); return S_OK; } HRESULT PanLeft::get_Tooltip(BSTR* Tooltip) { if (!Tooltip) return E_POINTER; *Tooltip = ::AoAllocBSTR(L"Pan Left"); return S_OK; } HRESULT PanLeft::get_Message(BSTR* Message) { if (!Message) return E_POINTER; *Message = ::AoAllocBSTR(L"Pan display left by the pan factor percentage"); return S_OK; } HRESULT PanLeft::get_Bitmap(OLE_HANDLE* bitmap) { if (!bitmap) return E_POINTER; if (m_hBitmap != 0) { *bitmap = m_hBitmap; return S_OK; } return E_FAIL; } HRESULT PanLeft::get_Category(BSTR* categoryName) { if (!categoryName) return E_POINTER; *categoryName = ::AoAllocBSTR(L"Sample_Pan/Zoom"); return S_OK; } // Create the command and set who it will work with HRESULT PanLeft::OnCreate(IDispatch* hook) { if (!hook) return E_POINTER; m_ipHookHelper->putref_Hook(hook); return S_OK; } // When clicked, the button appears pressed HRESULT PanLeft::OnClick() { // Get the active view IMapPtr ipMap; m_ipHookHelper->get_FocusMap(&ipMap); IActiveViewPtr ipActiveView(ipMap); if (ipMap == 0) return S_OK; // Get the extent IEnvelopePtr ipEnv; ipActiveView->get_Extent(&ipEnv); // Create a point to pan to IPointPtr ipPoint(CLSID_Point); double dWidth; ipEnv->get_Width(&dWidth); double dXMin; ipEnv->get_XMin(&dXMin); double dXMax; ipEnv->get_XMax(&dXMax); double dYMin; ipEnv->get_YMin(&dYMin); double dYMax; ipEnv->get_YMax(&dYMax); double dPanFactor; GetPanFactor(&dPanFactor); ipPoint->put_X(((dXMin + dXMax)/2) - (dWidth / (100 / dPanFactor))); ipPoint->put_Y((dYMin + dYMax)/2); // Center the envelope at the point ipEnv->CenterAt(ipPoint); // Set the new extent ipActiveView->put_Extent(ipEnv); // Refresh the active view ipActiveView->Refresh(); return S_OK; } HRESULT PanLeft::GetPanFactor(double* dPanFactor) { *dPanFactor = 50; return S_OK; }