You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							249 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
	
	
							249 lines
						
					
					
						
							10 KiB
						
					
					
				using System; | 
						|
using System.Drawing; | 
						|
using ESRI.ArcGIS.Display; | 
						|
using ESRI.ArcGIS.esriSystem; | 
						|
using ESRI.ArcGIS.Geometry; | 
						|
 | 
						|
namespace KGIS.Plugin.LayerProperty.Utils | 
						|
{ | 
						|
    public class StyleGalleryItemView | 
						|
    { | 
						|
        private static IEnvelope Envelope4BatchDraw; | 
						|
        private static ITransformation Transformation4BatchDraw; | 
						|
        private static IGeometry Geometry4BatchDraw; | 
						|
        public static Bitmap StyleGalleryItemToBmp(int iWidth, int iHeight, IStyleGalleryClass mStyleGlyCs, IStyleGalleryItem mStyleGlyItem) | 
						|
        { | 
						|
            //if (mStyleGlyItem.Item is ISymbol) | 
						|
            //{ | 
						|
            //    return StyleGalleryItemView.SymbolToBitmap(iWidth, iHeight, mStyleGlyItem.Item as ISymbol); | 
						|
            //} | 
						|
            Bitmap bitmap = new Bitmap(iWidth, iHeight); | 
						|
            Graphics graphics = Graphics.FromImage(bitmap); | 
						|
            IntPtr hdc = IntPtr.Zero; | 
						|
            try | 
						|
            { | 
						|
                hdc = graphics.GetHdc(); | 
						|
            } | 
						|
            catch | 
						|
            { | 
						|
            } | 
						|
            try | 
						|
            { | 
						|
                tagRECT tagRECT = default(tagRECT); | 
						|
                tagRECT.right = bitmap.Width; | 
						|
                tagRECT.bottom = bitmap.Height; | 
						|
                mStyleGlyCs.Preview(mStyleGlyItem.Item, hdc.ToInt32(), ref tagRECT); | 
						|
                if (hdc.ToInt32() != 0) | 
						|
                { | 
						|
                    graphics.ReleaseHdc(hdc); | 
						|
                    graphics.Dispose(); | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                if (hdc.ToInt32() != 0) | 
						|
                { | 
						|
                    graphics.ReleaseHdc(hdc); | 
						|
                    graphics.Dispose(); | 
						|
                } | 
						|
                //CoreUtil.AddException(ex); | 
						|
            } | 
						|
            return bitmap; | 
						|
        } | 
						|
        public static Bitmap SymbolToBitmap(int iWidth, int iHeight, ISymbol pSymbol) | 
						|
        { | 
						|
            StyleGalleryItemView.ResetBatchDraw(); | 
						|
            Win32Util.InitBitmap(iWidth, iHeight); | 
						|
            StyleGalleryItemView.DrawSymbol(Win32Util.InnerDC, iWidth, iHeight, pSymbol, 2); | 
						|
            Bitmap bitmap = Win32Util.GetBitmap(iWidth, iHeight); | 
						|
            Win32Util.ReleaseDC(); | 
						|
            return bitmap; | 
						|
        } | 
						|
        public static Bitmap StyleGalleryItemToBmp(int iHeight, IStyleGalleryClass mStyleGlyCs, IStyleGalleryItem mStyleGlyItem) | 
						|
        { | 
						|
            int iWidth = (int)(mStyleGlyCs.PreviewRatio * (double)iHeight); | 
						|
            return StyleGalleryItemView.StyleGalleryItemToBmp(iWidth, iHeight, mStyleGlyCs, mStyleGlyItem); | 
						|
        } | 
						|
        public static Bitmap GetSymbolBitMap(int width, int height, IStyleGalleryClass symbologyStyleClass, ISymbol pSymbol) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                return StyleGalleryItemView.StyleGalleryItemToBmp(width, height, symbologyStyleClass, new ServerStyleGalleryItemClass | 
						|
                { | 
						|
                    Item = pSymbol | 
						|
                }); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                //CoreUtil.AddException(ex); | 
						|
            } | 
						|
            return null; | 
						|
        } | 
						|
        public static Bitmap GetSymbolBitMap(int height, IStyleGalleryClass symbologyStyleClass, ISymbol pSymbol) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                return StyleGalleryItemView.StyleGalleryItemToBmp(height, symbologyStyleClass, new ServerStyleGalleryItemClass | 
						|
                { | 
						|
                    Item = pSymbol | 
						|
                }); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                //CoreUtil.AddException(ex); | 
						|
            } | 
						|
            return null; | 
						|
        } | 
						|
        public static Image CreatePictureFromSymbol(ISymbol pSymbol, double dblWidth, double dblHeight, double dblGap) | 
						|
        { | 
						|
            Bitmap bitmap = new Bitmap((int)dblWidth, (int)dblHeight); | 
						|
            Graphics graphics = Graphics.FromImage(bitmap); | 
						|
            IntPtr hdc = (IntPtr)0; | 
						|
            hdc = graphics.GetHdc(); | 
						|
            StyleGalleryItemView.DrawToDC(hdc.ToInt32(), dblWidth, dblHeight, dblGap, pSymbol, false); | 
						|
            graphics.ReleaseHdc(hdc); | 
						|
            graphics.Dispose(); | 
						|
            return bitmap; | 
						|
        } | 
						|
        public static Image CreatePictureFromSymbol(ISymbol pSymbol, double dblWidth, double dblHeight, double dblGap, bool blnLine) | 
						|
        { | 
						|
            Bitmap bitmap = new Bitmap((int)dblWidth, (int)dblHeight); | 
						|
            Graphics graphics = Graphics.FromImage(bitmap); | 
						|
            IntPtr hdc = (IntPtr)0; | 
						|
            hdc = graphics.GetHdc(); | 
						|
            StyleGalleryItemView.DrawToDC(hdc.ToInt32(), dblWidth, dblHeight, dblGap, pSymbol, blnLine); | 
						|
            graphics.ReleaseHdc(hdc); | 
						|
            graphics.Dispose(); | 
						|
            return bitmap; | 
						|
        } | 
						|
        private static void DrawToDC(int hDC, double dblWidth, double dblHeight, double dblGap, ISymbol pSymbol, bool blnLine) | 
						|
        { | 
						|
            IEnvelope envelope = new EnvelopeClass(); | 
						|
            envelope.PutCoords(dblGap, dblGap, dblWidth - dblGap, dblHeight - dblGap); | 
						|
            ITransformation transformation = StyleGalleryItemView.CreateTransFromDC(hDC, dblWidth, dblHeight); | 
						|
            IGeometry geometry = StyleGalleryItemView.CreateSymShape(pSymbol, envelope, blnLine); | 
						|
            pSymbol.SetupDC(hDC, transformation); | 
						|
            pSymbol.Draw(geometry); | 
						|
            pSymbol.ResetDC(); | 
						|
        } | 
						|
        private static ITransformation CreateTransFromDC(int hDC, double dblWidth, double dblHeight) | 
						|
        { | 
						|
            IEnvelope envelope = new EnvelopeClass(); | 
						|
            envelope.PutCoords(0.0, 0.0, dblWidth, dblHeight); | 
						|
            tagRECT tagRECT = default(tagRECT); | 
						|
            tagRECT.left = 0; | 
						|
            tagRECT.top = 0; | 
						|
            tagRECT.right = (int)dblWidth; | 
						|
            tagRECT.bottom = (int)dblHeight; | 
						|
            return new DisplayTransformationClass | 
						|
            { | 
						|
                VisibleBounds = envelope, | 
						|
                Bounds = envelope, | 
						|
                //DeviceFrame = ref tagRECT, | 
						|
                Resolution = 96.0 | 
						|
            }; | 
						|
        } | 
						|
        private static IGeometry CreateSymShape(ISymbol pSymbol, IEnvelope pEnvelope, bool blnLine) | 
						|
        { | 
						|
            if (pSymbol is IMarkerSymbol) | 
						|
            { | 
						|
                IArea area = pEnvelope as IArea; | 
						|
                return area.Centroid; | 
						|
            } | 
						|
            if (!(pSymbol is ILineSymbol) && !(pSymbol is ITextSymbol)) | 
						|
            { | 
						|
                return pEnvelope; | 
						|
            } | 
						|
            if (blnLine) | 
						|
            { | 
						|
                IPointCollection pointCollection = new PolylineClass(); | 
						|
                IPoint point = new PointClass(); | 
						|
                point.PutCoords(pEnvelope.XMin, pEnvelope.YMax); | 
						|
                object missing = Type.Missing; | 
						|
                pointCollection.AddPoint(point, ref missing, ref missing); | 
						|
                point = new PointClass(); | 
						|
                point.PutCoords(pEnvelope.XMin + pEnvelope.Width / 3.0, pEnvelope.YMin); | 
						|
                missing = Type.Missing; | 
						|
                pointCollection.AddPoint(point, ref missing, ref missing); | 
						|
                point = new PointClass(); | 
						|
                point.PutCoords(pEnvelope.XMax - pEnvelope.Width / 3.0, pEnvelope.YMax); | 
						|
                missing = Type.Missing; | 
						|
                pointCollection.AddPoint(point, ref missing, ref missing); | 
						|
                point = new PointClass(); | 
						|
                point.PutCoords(pEnvelope.XMax, pEnvelope.YMin); | 
						|
                missing = Type.Missing; | 
						|
                pointCollection.AddPoint(point, ref missing, ref missing); | 
						|
                return pointCollection as IPolyline; | 
						|
            } | 
						|
            IPolyline polyline = new PolylineClass(); | 
						|
            IPoint point2 = new PointClass(); | 
						|
            point2.PutCoords(pEnvelope.XMin, pEnvelope.YMin + pEnvelope.Height / 2.0); | 
						|
            IPoint point3 = new PointClass(); | 
						|
            point3.PutCoords(pEnvelope.XMax, pEnvelope.YMin + pEnvelope.Height / 2.0); | 
						|
            polyline.FromPoint = point2; | 
						|
            polyline.ToPoint = point3; | 
						|
            return polyline; | 
						|
        } | 
						|
        public static void ResetBatchDraw() | 
						|
        { | 
						|
            StyleGalleryItemView.Envelope4BatchDraw = null; | 
						|
            StyleGalleryItemView.Transformation4BatchDraw = null; | 
						|
            StyleGalleryItemView.Geometry4BatchDraw = null; | 
						|
        } | 
						|
        public static void DrawSymbol(int hDC, int w, int h, ISymbol pSymbol, int gap) | 
						|
        { | 
						|
            Win32Util.ClearDC(hDC, Color.Transparent, 0, 0, w, h); | 
						|
            if (StyleGalleryItemView.Envelope4BatchDraw == null) | 
						|
            { | 
						|
                StyleGalleryItemView.Envelope4BatchDraw = new EnvelopeClass(); | 
						|
            } | 
						|
            StyleGalleryItemView.Envelope4BatchDraw.PutCoords((double)gap, (double)gap, (double)(w - gap), (double)(h - gap)); | 
						|
            if (StyleGalleryItemView.Transformation4BatchDraw == null) | 
						|
            { | 
						|
                StyleGalleryItemView.Transformation4BatchDraw = StyleGalleryItemView.CreateTransFromDC(hDC, (double)w, (double)h); | 
						|
            } | 
						|
            if (StyleGalleryItemView.Geometry4BatchDraw == null) | 
						|
            { | 
						|
                StyleGalleryItemView.Geometry4BatchDraw = StyleGalleryItemView.CreateSymShape(pSymbol, StyleGalleryItemView.Envelope4BatchDraw); | 
						|
            } | 
						|
            try | 
						|
            { | 
						|
                if (pSymbol is ITextSymbol && pSymbol is ITextSymbol) | 
						|
                { | 
						|
                    ((ITextSymbol)pSymbol).Text = "AaBbYyZz"; | 
						|
                } | 
						|
                pSymbol.SetupDC(hDC, StyleGalleryItemView.Transformation4BatchDraw); | 
						|
                pSymbol.Draw(StyleGalleryItemView.Geometry4BatchDraw); | 
						|
            } | 
						|
            catch (Exception value) | 
						|
            { | 
						|
                Console.Write(value); | 
						|
            } | 
						|
            finally | 
						|
            { | 
						|
                pSymbol.ResetDC(); | 
						|
            } | 
						|
        } | 
						|
        private static IGeometry CreateSymShape(ISymbol pSymbol, IEnvelope pEnvelope) | 
						|
        { | 
						|
            if (pSymbol is IMarkerSymbol) | 
						|
            { | 
						|
                IArea area = (IArea)pEnvelope; | 
						|
                return area.Centroid; | 
						|
            } | 
						|
            if (pSymbol is ILineSymbol || pSymbol is ITextSymbol) | 
						|
            { | 
						|
                IPolyline polyline = (IPolyline)new PolylineClass(); | 
						|
                IPoint point = new PointClass(); | 
						|
                point.X = (pEnvelope.LowerLeft.X + pEnvelope.UpperLeft.X) / 2.0; | 
						|
                point.Y = (pEnvelope.LowerLeft.Y + pEnvelope.UpperLeft.Y) / 2.0; | 
						|
                polyline.FromPoint = point; | 
						|
                point.X = (pEnvelope.LowerRight.X + pEnvelope.UpperRight.X) / 2.0; | 
						|
                point.Y = (pEnvelope.LowerRight.Y + pEnvelope.UpperRight.Y) / 2.0; | 
						|
                polyline.ToPoint = point; | 
						|
                return polyline; | 
						|
            } | 
						|
            return pEnvelope; | 
						|
        } | 
						|
    } | 
						|
}
 | 
						|
 |