LogoMarkerPropertyPage.cpp
// Copyright 2012 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. // // LogoMarkerPropertyPage.cpp : Implementation of CLogoMarkerPropertyPage #include "stdafx.h" #include "LogoMarkerSymbolVC.h" #include "LogoMarkerPropertyPage.h" #include "stdio.h" ///////////////////////////////////////////////////////////////////////////// // CLogoMarkerPropertyPage ///////////////////////////////////////////////////////////////////////////// // IPropertyPage STDMETHODIMP CLogoMarkerPropertyPage::Show(UINT nCmdShow) { USES_CONVERSION; // If we are showing the property page propulate it // from the Marker symbol object. if ((nCmdShow & (SW_SHOW|SW_SHOWDEFAULT))) { //colors IColorPtr ipColor; m_ipLogoMarker->get_ColorTop(&ipColor); ipColor->get_RGB(&m_colTop); ::SendMessage(m_hRchTop, EM_SETBKGNDCOLOR, 0, (LPARAM) m_colTop); m_ipLogoMarker->get_ColorRight(&ipColor); ipColor->get_RGB(&m_colRight); ::SendMessage(m_hRchRight, EM_SETBKGNDCOLOR, 0, (LPARAM) m_colRight); m_ipLogoMarker->get_ColorLeft(&ipColor); ipColor->get_RGB(&m_colLeft); ::SendMessage(m_hRchLeft, EM_SETBKGNDCOLOR, 0, (LPARAM) m_colLeft); m_ipLogoMarker->get_ColorBorder(&ipColor); ipColor->get_RGB(&m_colBorder); ::SendMessage(m_hRchBorder, EM_SETBKGNDCOLOR, 0, (LPARAM) m_colBorder); //angle, size and offsets char sText[10]; double dText; IMarkerSymbolPtr ipMSymbol(m_ipLogoMarker); ipMSymbol->get_Size(&dText); sprintf( sText, "%.2f\0", dText); ::SendMessage(m_hSpnSize, UDM_SETPOS, 0, MAKELPARAM((int)(dText), 0)); ::SetWindowText(m_hEdtSize, A2T(sText)); ipMSymbol->get_Angle(&dText); sprintf( sText, "%d\0", dText); ::SendMessage(m_hSpnAngle, UDM_SETPOS, 0, MAKELPARAM((int)(dText), 0)); ::SetWindowText(m_hEdtAngle, A2T(sText)); ipMSymbol->get_XOffset(&dText); sprintf( sText, "%+.2f\0", dText); ::SendMessage(m_hSpnXOffset, UDM_SETPOS, 0, MAKELPARAM((int)(dText), 0)); ::SetWindowText(m_hEdtXOffset, A2T(sText)); ipMSymbol->get_YOffset(&dText); sprintf( sText, "%+.2f\0", dText); ::SendMessage(m_hSpnYOffset, UDM_SETPOS, 0, MAKELPARAM((int)(dText), 0)); ::SetWindowText(m_hEdtYOffset, A2T(sText)); m_bShown = true; } // Let the IPropertyPageImpl deal with displaying the page return IPropertyPageImpl<CLogoMarkerPropertyPage>::Show(nCmdShow); } double PointsToUnits(double dVal, esriUnits Units) { switch (Units) { case esriPoints: return dVal; break; case esriInches: return dVal / 72.0; break; case esriCentimeters: return dVal / 72.0 * 2.54; break; case esriMillimeters: return dVal / 72.0 * 25.4; break; default: return dVal; } } double UnitsToPoints(double dVal, esriUnits Units) { switch (Units) { case esriPoints: return dVal; break; case esriInches: return dVal * 72.0; break; case esriCentimeters: return dVal * 72.0 / 2.54; break; case esriMillimeters: return dVal * 72.0 / 25.4; break; default: return dVal; } } void CLogoMarkerPropertyPage::UpdateUnits() { } STDMETHODIMP CLogoMarkerPropertyPage::SetObjects(ULONG nObjects, IUnknown **ppUnk) { // Loop through the objects to find one that supports // the ILogoMarkerSymbol interface. for (ULONG i=0; i < nObjects; i ++) { ILogoMarkerSymbolPtr ipLogo(ppUnk[i]); if (ipLogo != 0) { m_ipLogoMarker = ipLogo; m_ipMSymbol = ipLogo; m_bShown = false; break; } } // Let the IPropertyPageImpl know what objects we have return IPropertyPageImpl<CLogoMarkerPropertyPage>::SetObjects(nObjects, ppUnk); } STDMETHODIMP CLogoMarkerPropertyPage::Apply(void) { // Pass the m_ipLogoMarker member variable to the QueryObject method HRESULT hr = QueryObject(CComVariant((IUnknown*) m_ipLogoMarker)); // Set the page to not dirty SetDirty(FALSE); return S_OK; } ///////////////////////////////////////////////////////////////////////////// // IPropertyPageContext STDMETHODIMP CLogoMarkerPropertyPage::get_Priority(LONG * Priority) { if (Priority == NULL) return E_POINTER; *Priority = 2; return S_OK; } STDMETHODIMP CLogoMarkerPropertyPage::Applies(VARIANT unkArray, VARIANT_BOOL * Applies) { if (Applies == NULL) return E_INVALIDARG; if (V_VT(&unkArray) != (VT_ARRAY|VT_UNKNOWN)) return E_INVALIDARG; // Retrieve the safe array and retrieve the data SAFEARRAY *saArray = unkArray.parray; HRESULT hr = ::SafeArrayLock(saArray); IUnknownPtr *pUnk; hr = ::SafeArrayAccessData(saArray,reinterpret_cast<void**> (&pUnk)); if (FAILED(hr)) return hr; // Loop through the elements looking to see if an object // implementing the IMap interface is present long lNumElements = saArray->rgsabound->cElements; for (long i = 0; i < lNumElements; i++) { ILogoMarkerSymbolPtr ipLogo(pUnk[i]); if (ipLogo != 0) { *Applies = VARIANT_TRUE; break; } } // Cleanup hr = ::SafeArrayUnaccessData(saArray); if (FAILED(hr)) return hr; hr = ::SafeArrayUnlock(saArray); if (FAILED(hr)) return hr; return S_OK; } STDMETHODIMP CLogoMarkerPropertyPage::CreateCompatibleObject(VARIANT kind, VARIANT * pNewObject) { if (pNewObject == NULL) return E_POINTER; return E_NOTIMPL; } STDMETHODIMP CLogoMarkerPropertyPage::QueryObject(VARIANT theObject) { // Check if we have a marker symbol // If we do, apply the setting from the page. CComVariant vObject(theObject); if (vObject.vt != VT_UNKNOWN) return E_UNEXPECTED; // Try and QI to markersymbol ILogoMarkerSymbolPtr ipLogo(vObject.punkVal); if (ipLogo != 0) { // Set properties in the symbol object //colors IColorPtr ipColor(CLSID_RgbColor); ipColor->put_RGB(m_colTop); ipLogo->put_ColorTop(ipColor); ipColor->put_RGB(m_colLeft); ipLogo->put_ColorLeft(ipColor); ipColor->put_RGB(m_colRight); ipLogo->put_ColorRight(ipColor); ipColor->put_RGB(m_colBorder); ipLogo->put_ColorBorder(ipColor); CComBSTR bsText; double dText; IMarkerSymbolPtr ipMSymbol(ipLogo); //size GetDlgItemText(IDC_EDT_SIZE, bsText.m_str); VarR8FromStr(bsText,1033,0, &dText); ipMSymbol->put_Size(dText); //angle GetDlgItemText(IDC_EDT_ANGLE, bsText.m_str); VarR8FromStr(bsText,1033,0, &dText); ipMSymbol->put_Angle(dText); //X and Y offsets GetDlgItemText(IDC_EDT_XOFFSET, bsText.m_str); VarR8FromStr(bsText,1033,0, &dText); ipMSymbol->put_XOffset(dText); GetDlgItemText(IDC_EDT_YOFFSET, bsText.m_str); VarR8FromStr(bsText,1033,0, &dText); ipMSymbol->put_YOffset(dText); } return S_OK; } STDMETHODIMP CLogoMarkerPropertyPage::GetHelpFile(LONG controlID, BSTR * HelpFile) { if (HelpFile == NULL) return E_POINTER; return E_NOTIMPL; } STDMETHODIMP CLogoMarkerPropertyPage::GetHelpId(LONG controlID, LONG * helpID) { if (helpID == NULL) return E_POINTER; return E_NOTIMPL; } STDMETHODIMP CLogoMarkerPropertyPage::Cancel() { // In this case do nothing return S_OK; } ///////////////////////////////////////////////////////////////////////////// // ISymbolPropertyPage STDMETHODIMP CLogoMarkerPropertyPage::put_Units(esriUnits Units) { if (m_lUnits != Units) { m_lUnits = Units; UpdateUnits(); } return S_OK; } STDMETHODIMP CLogoMarkerPropertyPage::get_Units(esriUnits * Units) { if (Units == NULL) return E_POINTER; *Units = m_lUnits; return S_OK; } ///////////////////////////////////////////////////////////////////////////// // Dialog LRESULT CLogoMarkerPropertyPage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { m_Bitmap = ::LoadBitmap(_Module.m_hInst, MAKEINTRESOURCE(IDB_BMP_BUTTON)); ::SendMessage(GetDlgItem(IDC_BTN_TOP), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)m_Bitmap); ::SendMessage(GetDlgItem(IDC_BTN_LEFT), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)m_Bitmap); ::SendMessage(GetDlgItem(IDC_BTN_RIGHT), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)m_Bitmap); ::SendMessage(GetDlgItem(IDC_BTN_BORDER), BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)m_Bitmap); m_hEdtSize = GetDlgItem(IDC_EDT_SIZE); m_hEdtAngle = GetDlgItem(IDC_EDT_ANGLE); m_hEdtXOffset = GetDlgItem(IDC_EDT_XOFFSET); m_hEdtYOffset = GetDlgItem(IDC_EDT_YOFFSET); m_hSpnSize = GetDlgItem(IDC_SPIN_SIZE); m_hSpnAngle = GetDlgItem(IDC_SPIN_ANGLE); m_hSpnXOffset = GetDlgItem(IDC_SPIN_XOFFSET); m_hSpnYOffset = GetDlgItem(IDC_SPIN_YOFFSET); ::SendMessage(m_hSpnSize, UDM_SETRANGE, 0, MAKELPARAM(0, 100)); ::SendMessage(m_hSpnXOffset, UDM_SETRANGE, 0, MAKELPARAM(-100, 100)); ::SendMessage(m_hSpnYOffset, UDM_SETRANGE, 0, MAKELPARAM(-100, 100)); ::SendMessage(m_hSpnAngle, UDM_SETRANGE, 0, MAKELPARAM(-360, 360)); m_hRchLeft = GetDlgItem(IDC_RICH_LEFT); m_hRchRight = GetDlgItem(IDC_RICH_RIGHT); m_hRchTop = GetDlgItem(IDC_RICH_TOP); m_hRchBorder = GetDlgItem(IDC_RICH_BORDER); return 0; } LRESULT CLogoMarkerPropertyPage::OnClickedBtn_border(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { IColorPtr ipColor(CLSID_RgbColor); ipColor->put_UseWindowsDithering(VARIANT_TRUE); ipColor->put_RGB(m_colBorder); VARIANT_BOOL bColorSet; IColorPalettePtr ipPalette(CLSID_ColorPalette); RECT rect; ::GetWindowRect(m_hRchBorder, &rect); ipPalette->TrackPopupMenu(&rect, ipColor, VARIANT_TRUE, (OLE_HANDLE)m_hWnd, &bColorSet); if (bColorSet) { //get newly chosen color ipPalette->get_Color(&ipColor); ipColor->get_RGB(&m_colBorder); ::SendMessage(m_hRchBorder, EM_SETBKGNDCOLOR, 0, (LPARAM)m_colBorder); //apply color to displayed symbol m_ipLogoMarker->put_ColorBorder(ipColor); // Change the page to dirty SetDirty(TRUE); //refresh property sheet m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); } return 0; } LRESULT CLogoMarkerPropertyPage::OnClickedBtn_left(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { IColorPtr ipColor(CLSID_RgbColor); ipColor->put_UseWindowsDithering(VARIANT_TRUE); ipColor->put_RGB(m_colLeft); VARIANT_BOOL bColorSet; IColorPalettePtr ipPalette(CLSID_ColorPalette); RECT rect; ::GetWindowRect(m_hRchLeft, &rect); ipPalette->TrackPopupMenu(&rect, ipColor, VARIANT_TRUE, (OLE_HANDLE)m_hWnd, &bColorSet); if (bColorSet) { //get newly chosen color ipPalette->get_Color(&ipColor); ipColor->get_RGB(&m_colLeft); ::SendMessage(m_hRchLeft, EM_SETBKGNDCOLOR, 0, (LPARAM)m_colLeft); //apply color to displayed symbol m_ipLogoMarker->put_ColorLeft(ipColor); // Change the page to dirty SetDirty(TRUE); //refresh property sheet m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); } return 0; } LRESULT CLogoMarkerPropertyPage::OnClickedBtn_right(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { IColorPtr ipColor(CLSID_RgbColor); ipColor->put_UseWindowsDithering(VARIANT_TRUE); ipColor->put_RGB(m_colRight); VARIANT_BOOL bColorSet; IColorPalettePtr ipPalette(CLSID_ColorPalette); RECT rect; ::GetWindowRect(m_hRchRight, &rect); ipPalette->TrackPopupMenu(&rect, ipColor, VARIANT_TRUE, (OLE_HANDLE)m_hWnd, &bColorSet); if (bColorSet) { //get newly chosen color ipPalette->get_Color(&ipColor); ipColor->get_RGB(&m_colRight); ::SendMessage(m_hRchRight, EM_SETBKGNDCOLOR, 0, (LPARAM)m_colRight); //apply color to displayed symbol m_ipLogoMarker->put_ColorRight(ipColor); // Change the page to dirty SetDirty(TRUE); //refresh property sheet m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); } return 0; } LRESULT CLogoMarkerPropertyPage::OnClickedBtn_top(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { IColorPtr ipColor(CLSID_RgbColor); ipColor->put_UseWindowsDithering(VARIANT_TRUE); ipColor->put_RGB(m_colTop); VARIANT_BOOL bColorSet; IColorPalettePtr ipPalette(CLSID_ColorPalette); RECT rect; ::GetWindowRect(m_hRchTop, &rect); ipPalette->TrackPopupMenu(&rect, ipColor, VARIANT_TRUE, (OLE_HANDLE)m_hWnd, &bColorSet); if (bColorSet) { //get newly chosen color ipPalette->get_Color(&ipColor); ipColor->get_RGB(&m_colTop); ::SendMessage(m_hRchTop, EM_SETBKGNDCOLOR, 0, (LPARAM)m_colTop); //apply color to displayed symbol m_ipLogoMarker->put_ColorTop(ipColor); // Change the page to dirty SetDirty(TRUE); //refresh property sheet m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); } return 0; } LRESULT CLogoMarkerPropertyPage::OnChangeEdt_angle(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (m_bShown) { CComBSTR bsText; double dText; GetDlgItemText(IDC_EDT_ANGLE, bsText.m_str); VarR8FromStr(bsText,1033,0, &dText); m_ipMSymbol->put_Angle(dText); // Change the page to dirty SetDirty(TRUE); //refresh property sheet m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); } return 0; } LRESULT CLogoMarkerPropertyPage::OnChangeEdt_size(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (m_bShown) { CComBSTR bsText; double dText; GetDlgItemText(IDC_EDT_SIZE, bsText.m_str); VarR8FromStr(bsText,1033,0, &dText); m_ipMSymbol->put_Size(dText); // Change the page to dirty SetDirty(TRUE); //refresh property sheet m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); } return 0; } LRESULT CLogoMarkerPropertyPage::OnChangeEdt_xoffset(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (m_bShown) { CComBSTR bsText; double dText; GetDlgItemText(IDC_EDT_XOFFSET, bsText.m_str); VarR8FromStr(bsText,1033,0, &dText); m_ipMSymbol->put_XOffset(dText); // Change the page to dirty SetDirty(TRUE); //refresh property sheet m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); } return 0; } LRESULT CLogoMarkerPropertyPage::OnChangeEdt_yoffset(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { if (m_bShown) { CComBSTR bsText; double dText; GetDlgItemText(IDC_EDT_YOFFSET, bsText.m_str); VarR8FromStr(bsText,1033,0, &dText); m_ipMSymbol->put_YOffset(dText); // Change the page to dirty SetDirty(TRUE); //refresh property sheet m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY); } return 0; } LRESULT CLogoMarkerPropertyPage::OnVScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { USES_CONVERSION; HWND hThisSB = (HWND)lParam; if (LOWORD(wParam) == SB_ENDSCROLL) return 0; //reject spurious messages //get position int nPos = (int)::SendMessage(hThisSB, UDM_GETPOS, 0, 0L); char sText[10]; if (hThisSB == m_hSpnSize) { sprintf( sText, "%.2f\0", (double)nPos); ::SetWindowText(m_hEdtSize, A2T(sText)); } else if (hThisSB == m_hSpnXOffset) { sprintf( sText, "%+.2f\0", (double)nPos); ::SetWindowText(m_hEdtXOffset, A2T(sText)); } else if (hThisSB == m_hSpnYOffset) { sprintf( sText, "%+.2f\0", (double)nPos); ::SetWindowText(m_hEdtYOffset, A2T(sText)); } /* else if (hThisSB == m_hSpnAngle) { sprintf( sText, "%.2f\0", (double)nPos / 100); ::SetWindowText(m_hEdtSize, sText); }*/ return 0; }