Suite

Dessiner du texte dans PageLayoutControl dans OnAfterDraw ?


J'ai un PagyLayoutControl dans une boîte de dialogue d'aperçu avant impression. Il montre la même étendue et les mêmes couches que le MapControl maître. Les deux contrôles ne sont pas synchronisés, car les modifications apportées dans le PageLayoutControl ne seront pas reflétées dans le MapControl. Je charge donc le même fichier de carte dans le PageLayoutControl et copie les couches du MapControl. Cela fonctionne bien.

Le MapControl ajoute des textes aux entités sélectionnées dans l'événement AfterDraw comme ceci :

private void MapControl_OnAfterDraw(objet expéditeur, ESRI.ArcGIS.Controls.IMapControlEvents2_OnAfterDrawEvent e) { if (e.viewDrawPhase == (int)esriViewDrawPhase.esriViewForeground) { for (int iL = 0; iL < _mapControl.Map.Map. Fonctionnalités IFeatureSelection = _mapControl.Map.Layer[iL] as IFeatureSelection; if ((caractéristiques != null) && (features.SelectionSet != null)) { ICursor cursor; features.SelectionSet.Search(null, true, curseur de sortie); Fonctionnalité IFeature ; while ((feature = ((IFeatureCursor)cursor).NextFeature()) != null) { int iBt1 = feature.Fields.FindField("TEXT1"); if (iBt1 < 0) iBt1 = feature.Fields.FindField("NAME"); if ((feature.Shape != null) && (iBt1 >= 0)) { object ofskz = feature.get_Value(iBt1); if (ofskz != null) { String someText = ofskz.ToString(); _mapControl.DrawShape(feature.Shape); IArea farea = feature.Shape as IArea; ESRI.ArcGIS.Geometry.Point start = new ESRI.ArcGIS.Geometry.Point(); start.X = tarif.LabelPoint.X - 100 ; start.Y = tarif.LabelPoint.Y; ESRI.ArcGIS.Geometry.Point end = new ESRI.ArcGIS.Geometry.Point(); fin.X = tarif.LabelPoint.X + 100 ; fin.Y = farea.LabelPoint.Y; ESRI.ArcGIS.Geometry.Polyline baseline = new ESRI.ArcGIS.Geometry.Polyline(); ligne de base.AddPoint(start); ligne de base.AddPoint(fin); ITextSymbol textSymbol = new TextSymbolClass(); textSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVACenter; objet oTextSym = textSymbol; _mapControl.DrawText((ESRI.ArcGIS.Geometry.IGeometry)baseline, someText, ref oTextSym); } } } } } } }

J'ai essayé de reproduire cela pour le PageLayoutControl mais j'ai échoué, car il n'y a pas de méthodes comme MapControlsDessinerTexteetDessinerForme. je n'ai pas trouvé quelque chose commeDessinerFormeavec le PageLayoutControl. OK, je peux vivre sans que la forme ait été dessinée. Mais c'est le texte qui me dérange. j'ai trouvé et essayéActiveView.ScreenDisplay.DrawTextqui dessine en effet du texte sur la carte, mais il semble qu'il utilise un positionnement différent de celuiMapControl.DrawText. J'ai simplement essayé d'utiliser leIndiquerdébutcomme leIgéométriepourDessinerTexte:

private void Pagelayout_OnAfterDraw(expéditeur de l'objet, ESRI.ArcGIS.Controls.IPageLayoutControlEvents_OnAfterDrawEvent e) { if (e.viewDrawPhase == (int)esriViewDrawPhase.esriViewForeground) { for (int iL = 0; iL++La < _pageLayout) ) { Fonctionnalités IFeatureSelection = _pageLayoutControl.ActiveView.FocusMap.Layer[iL] as IFeatureSelection; if ((caractéristiques != null) && (features.SelectionSet != null)) { ICursor cursor; features.SelectionSet.Search(null, true, curseur de sortie); Fonctionnalité IFeature ; while ((feature = ((IFeatureCursor)cursor).NextFeature()) != null) { int iBt1 = feature.Fields.FindField("TEXT1"); if (iBt1 < 0) iBt1 = feature.Fields.FindField("NAME"); if ((feature.Shape != null) && (iBt1 >= 0)) { object ofskz = feature.get_Value(iBt1); if (ofskz != null) { String someText = ofskz.ToString(); //_mapControl.DrawShape(feature.Shape); IArea farea = feature.Shape as IArea; ESRI.ArcGIS.Geometry.Point start = new ESRI.ArcGIS.Geometry.Point(); start.X = tarif.LabelPoint.X - 100 ; start.Y = farea.LabelPoint.Y; ITextSymbol textSymbol = new TextSymbolClass(); textSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVACenter; objet oTextSym = textSymbol; int mapx; carte int; _pageLayoutControl.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(start, out mapx, out mapy); IPoint point = new ESRI.ArcGIS.Geometry.Point(); point.X = mapx; point.Y = mapy; _pageLayoutControl.ActiveView.ScreenDisplay.DrawText((IGeometry)point, someText); } } } } } } } }

Le texte est dessiné quelque part sur la carte mais pas là où il est dessiné dans le MapControl.débuta une valeur comme 3103951.3241, 2503651.3274, qui me semble être des coordonnées mondiales. J'ai testé pour dessiner à la position de la souris (quelque chose comme 6.4,7.2 - coordonnées d'écran) qui dessine à la bonne position. J'ai donc essayé la conversion avecDePointCartequi a changé les nombres mais sans succès dans le dessin à la bonne position.

Comment trouver la bonne coordonnée d'entrée pour DrawText ? Ou existe-t-il un autre moyen de dessiner du texte dans PageLayoutControl ?


Gardez à l'esprit qu'une mise en page peut avoir plusieurs cartes. Pour dessiner du texte sur une carte particulière dans la mise en page, vous pouvez utiliser IGraphicsContainer.FindFrame et passer l'IMap, ou parcourir tous les éléments jusqu'à ce que vous trouviez un IMapFrame en utilisant IGraphicsContainer.Next(). Assurez-vous d'appeler IGraphicsContainer.Reset avant de commencer et sachez si vous avez des éléments groupés que vous devrez récurser.

Une fois que vous avez trouvé un IMapFrame, convertissez IMapFrame.Map en IActiveViewEvents_Event, connectez AfterDraw et dessinez le texte dans ce gestionnaire.