Step 1:
pPoint.CreateInstance(__uuidof(Point));
pPoint->PutX(pEnvelop->GetXMax()-2.5);
pPoint->PutY(pEnvelop->GetYMax()-3.5);
IUIDPtr pUID;
pUID.CreateInstance(__uuidof(UID));
varVal=L"esriCarto.MarkerNorthArrow";
pUID->PutValue(varVal);
pElementExtent.CreateInstance(__uuidof(Envelope));
pElementExtent->PutCoords(pPoint->GetX(),pPoint->GetY(),pPoint->GetX()+2,pPoint->GetY()+2);
pMapSurround = CreateSurround(pUID, pElementExtent, "North Arrow", pMap, m_pPageLayoutControl->GetPageLayout());
pMarkerNorthArrow=pMapSurround;
//ESRI North -- 字体文件 117 是改文件中指北针的Unicode编码
pSymbol=MakeNorthArrowSymbol(177,"ESRI North"); if(pSymbol) pMarkerNorthArrow->PutMarkerSymbol((IMarkerSymbolPtr)pSymbol); pPoint=NULL; pUID=NULL; pElementExtent=NULL;
step 2: IMapSurroundPtr CMapMakeLayoutHelper::CreateSurround(IUIDPtr pID,IEnvelopePtr pEnv,CString strName,IMapPtr pMap,IPageLayoutPtr pPagelayout) { IGraphicsContainerPtr pGraphicsContainer; IMapFramePtr pMapFrame; IElementPtr pElement; IElementPropertiesPtr pElementProperties; IActiveViewPtr pActiveView; ITrackCancelPtr PTrack; IMapSurroundFramePtr pMapSurroundFrame; pGraphicsContainer=pPagelayout; _variant_t vt(pMap, true); pMapFrame=pGraphicsContainer->FindFrame(vt); pMapSurroundFrame=pMapFrame->CreateSurroundFrame(pID,NULL); pMapSurroundFrame->GetMapSurround()->PutName(_bstr_t(strName)); pElement=pMapSurroundFrame; pElementProperties=pElement; pElementProperties->PutName(_bstr_t("North Arrow")); pActiveView=pPagelayout; pElement->PutGeometry(pEnv); pElement->Activate(pActiveView->GetScreenDisplay()); PTrack.CreateInstance(__uuidof(CancelTracker)); pElement->Draw(pActiveView->GetScreenDisplay(),PTrack); pGraphicsContainer->AddElement(pElement,0); pElement->PutGeometry(pEnv); return pMapSurroundFrame->GetMapSurround(); } Step 3: ISymbolPtr CMapMakeLayoutHelper::MakeNorthArrowSymbol(int intStyle,CString sSymName) { ICharacterMarkerSymbolPtr pCharSym; pCharSym.CreateInstance(__uuidof(CharacterMarkerSymbol)); IRgbColorPtr pRgbColor(__uuidof(RgbColor)); pRgbColor->PutRed(0); pRgbColor->PutGreen(0); pRgbColor->PutBlue(0); IFontPtr pFont(CLSID_StdFont); pFont->put_Name((_bstr_t)sSymName); pCharSym->PutColor(pRgbColor); pCharSym->PutSize(100); pCharSym->PutCharacterIndex(intStyle); pCharSym->PutFont(IFontDispPtr(pFont)); return pCharSym; }