أكثر

رسم نص في PageLayoutControl في OnAfterDraw؟

رسم نص في PageLayoutControl في OnAfterDraw؟


لدي PagyLayoutControl في مربع حوار معاينة الطباعة. يظهر نفس النطاق والطبقات مثل MapControl الرئيسية. لا تتم مزامنة كلا عنصري التحكم ، لأن التغييرات التي تم إجراؤها في PageLayoutControl لن تنعكس في MapControl. لذلك أقوم بتحميل نفس ملف الخريطة في PageLayoutControl ونسخ الطبقات من MapControl. هذا يعمل بشكل جيد.

يضيف MapControl بعض النصوص إلى الميزات المحددة في حدث AfterDraw مثل هذا:

MapControl_OnAfterDraw الخاصة باطلة (مرسل الكائن ، ESRI.ArcGIS.Controls.IMapControlEvents2_OnAfterDrawEvent e) {if (e.viewDrawPhase == (int) esriViewDrawPhase.esriViewForeground) {لـ (int iL = 0؛ iL. IFeatureSelection features = _mapControl.Map.Layer [iL] as IFeatureSelection؛ if ((features! = null) && (features.SelectionSet! = null)) {ICursor cursor؛ features.SelectionSet.Search (null، true، out cursor)؛ ميزة IF Feature؛ while ((feature = ((IFeatureCursor) cursor) .NextFeature ())! = فارغة) {int iBt1 = feature.Fields.FindField ("TEXT1") ؛ إذا (iBt1 <0) iBt1 = feature.Fields.FindField ("NAME") ؛ if ((feature.Shape! = null) && (iBt1> = 0)) {object ofskz = feature.get_Value (iBt1)؛ إذا (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 = farea.LabelPoint.X - 100 ؛ start.Y = farea.LabelPoint.Y ؛ ESRI.ArcGIS.Geometry.Point end = new ESRI.ArcGIS.Geometry.Point () ؛ end.X = farea.LabelPoint.X + 100 ؛ end.Y = farea.LabelPoint.Y ؛ ESRI.ArcGIS.Geometry.Polyline baseline = new ESRI.ArcGIS.Geometry.Polyline () ؛ خط الأساس. إضافة نقطة (بداية) ؛ خط الأساس. إضافة (النهاية) ؛ ITextSymbol textSymbol = new TextSymbolClass () ؛ textSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVACenter ؛ كائن oTextSym = textSymbol ؛ _mapControl.DrawText ((ESRI.ArcGIS.Geometry.IGeometry) خط الأساس ، someText ، المرجع oTextSym) ؛ }}}}}}}

حاولت إعادة إنتاج هذا لـ PageLayoutControl لكنني فشلت ، لأنه لا توجد طرق مثل MapControlsDrawTextوDrawShape. لم أجد شيئًا مثلDrawShapeباستخدام PageLayoutControl. حسنًا ، يمكنني العيش بدون رسم الشكل. لكن النص هو ما يزعجني. لقد وجدت وحاولتActiveView.ScreenDisplay.DrawTextالذي يرسم بالفعل نصًا على الخريطة ، ولكن يبدو أنه يستخدم موضعًا مختلفًا عنMapControl.DrawText. أنا ببساطة حاولت استخدامهدفبدايةمثلIGeometryإلى عن علىDrawText:

Pagelayout_OnAfterDraw الخاصة الفارغة (مرسل الكائن ، ESRI.ArcGIS.Controls.IPageLayout.ControlEvents_OnAfterDrawEvent e) {if (e.viewDrawPhase == (int) esriViewDrawPhase.esriViewForeground) {لـ (iLapage = 0 ؛ iLocus) ) {IFeatureSelection features = _pageLayoutControl.ActiveView.FocusMap.Layer [iL] as IFeatureSelection؛ if ((features! = null) && (features.SelectionSet! = null)) {ICursor cursor؛ features.SelectionSet.Search (null، true، out cursor)؛ ميزة IF Feature؛ while ((feature = ((IFeatureCursor) cursor) .NextFeature ())! = فارغة) {int iBt1 = feature.Fields.FindField ("TEXT1") ؛ إذا (iBt1 <0) iBt1 = feature.Fields.FindField ("NAME") ؛ if ((feature.Shape! = null) && (iBt1> = 0)) {object ofskz = feature.get_Value (iBt1) ؛ إذا (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 = farea.LabelPoint.X - 100 ؛ start.Y = farea.LabelPoint.Y ؛ ITextSymbol textSymbol = new TextSymbolClass () ؛ textSymbol.VerticalAlignment = esriTextVerticalAlignment.esriTVACenter ؛ كائن oTextSym = textSymbol ؛ كثافة العمليات مابكس إنت مابي _pageLayoutControl.ActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint (بدء ، خارج mapx ، خارج mapy) ؛ نقطة IPoint = جديد ESRI.ArcGIS.Geometry.Point () ؛ point.X = مابكس ؛ point.Y = مابي ؛ _pageLayoutControl.ActiveView.ScreenDisplay.DrawText ((قياس IGeometry) نقطة ، someText) ؛ }}}}}}}}

يتم رسم النص في مكان ما على الخريطة ولكن ليس في مكان رسمه في MapControl.بدايةلها قيمة مثل 3103951.3241 ، 2503651.3274 ، والتي تبدو لي أنها إحداثيات عالمية. لقد اختبرت الرسم في موضع الماوس (شيء مثل 6.4،7.2 - إحداثيات الشاشة) الذي يرسم في الموضع الصحيح. لذلك حاولت التحويل معFromMapPointالتي غيرت الأرقام ولكن دون جدوى في الرسم في الموضع الصحيح.

كيف أجد تنسيق الإدخال الصحيح لـ DrawText؟ أم أن هناك طريقة بديلة لرسم النص في PageLayoutControl؟


ضع في اعتبارك أن تخطيط الصفحات يمكن أن يحتوي على خرائط متعددة. لرسم نص على خريطة معينة في التخطيط ، يمكنك استخدام IGraphicsContainer.FindFrame وتمرير IMap ، أو التكرار عبر جميع العناصر حتى تجد إطار IMapFrame باستخدام IGraphicsContainer.Next (). تأكد من الاتصال بـ IGraphicsContainer.Reset قبل البدء وكن على دراية بما إذا كان لديك عناصر مجمعة ستحتاج إلى التكرار.

بمجرد العثور على IMapFrame ، أرسل IMapFrame.Map إلى IActiveViewEvents_Event ، وقم بتوصيل AfterDraw ، وارسم النص في هذا المعالج.