Ejemplo n.º 1
0
        private Bitmap DrawToPictureBox(ISymbol pSym, PictureBox pBox)
        {
            IGeometry pGeometry = null;

            System.Drawing.Graphics pGraphics = null;
            pGraphics = System.Drawing.Graphics.FromHwnd(pBox.Handle);
            pGraphics.FillRectangle(System.Drawing.Brushes.White, pBox.ClientRectangle);
            Bitmap    image     = new Bitmap(pBox.Width, pBox.Height, pGraphics);
            IEnvelope pEnvelope = new EnvelopeClass();

            if (pSym is IMarkerSymbol)
            {
                IPoint pPoint = new PointClass();                  //the geometry of a MarkerSymbol
                pPoint.PutCoords(pBox.Width / 2, pBox.Height / 2); //center in middle of pBox
                pGeometry = pPoint;
            }
            if (pSym is ILineSymbol)
            {
                pEnvelope.PutCoords(0, pBox.Height / 2, pBox.Width, pBox.Height / 2);
                IPolyline pPolyline = new PolylineClass();
                pPolyline.FromPoint = pEnvelope.LowerLeft;
                pPolyline.ToPoint   = pEnvelope.UpperRight;
                pGeometry           = pPolyline;
            }
            if (pSym is IFillSymbol)
            {
                pEnvelope.PutCoords(1, 1, pBox.Width - 1, pBox.Height - 1);
                pGeometry = pEnvelope;

                if (pSym is IMultiLayerFillSymbol)
                {
                    IMultiLayerFillSymbol pMultiLayerFillSymbol = pSym as IMultiLayerFillSymbol;
                    //For mLayers As Integer = 0 To pMultiLayerFillSymbol.LayerCount - 1
                    for (int i = 0; i < pMultiLayerFillSymbol.LayerCount; i++)
                    {
                        if (pMultiLayerFillSymbol.get_Layer(i) is IPictureFillSymbol)
                        {
                            IPictureFillSymbol pPictureFillSymbol = pMultiLayerFillSymbol.get_Layer(0) as IPictureFillSymbol;
                            image = Bitmap.FromHbitmap(new IntPtr(pPictureFillSymbol.Picture.Handle));
                            //m.MakeTransparent(System.Drawing.ColorTranslator.FromOle(pPictureFillSymbol.Color.RGB))
                            return(image);
                        }
                        else if (pMultiLayerFillSymbol.get_Layer(i) is ISimpleFillSymbol)
                        {
                            pEnvelope.PutCoords(1, 1, pBox.Width - 1, pBox.Height - 1);
                            pGeometry = pEnvelope;
                        }
                        else if (pMultiLayerFillSymbol.get_Layer(i) is IGradientFillSymbol)
                        {
                            IGradientFillSymbol      pGradientFillSymbol = pMultiLayerFillSymbol.get_Layer(0) as IGradientFillSymbol;
                            IAlgorithmicColorRamp    pRamp   = pGradientFillSymbol.ColorRamp as IAlgorithmicColorRamp;
                            System.Drawing.Rectangle rect    = new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), new System.Drawing.Size(pBox.Width, pBox.Height));
                            LinearGradientBrush      lgBrush = new LinearGradientBrush(rect,
                                                                                       System.Drawing.ColorTranslator.FromOle(pRamp.FromColor.RGB),
                                                                                       System.Drawing.ColorTranslator.FromOle(pRamp.ToColor.RGB),
                                                                                       45);
                            pGraphics.FillRectangle(lgBrush, rect);
                            rect.Width  = rect.Width - 1;
                            rect.Height = rect.Height - 1;
                            pGraphics.DrawRectangle(new Pen(ColorTranslator.FromOle(pGradientFillSymbol.Outline.Color.RGB),
                                                            (float)pGradientFillSymbol.Outline.Width), rect);
                            image = new Bitmap(pBox.Width, pBox.Height, pGraphics);
                        }
                    }
                }
                else if (pSym is IPictureFillSymbol)
                {
                    IPictureFillSymbol pPictureFillSymbol = pSym as IPictureFillSymbol;
                    image = Bitmap.FromHbitmap(new IntPtr(pPictureFillSymbol.Picture.Handle));
                    //m.MakeTransparent(System.Drawing.ColorTranslator.FromOle(pPictureFillSymbol.Color.RGB))
                    return(image);
                }
            }

            IntPtr hDC = GetDC(pBox.Handle);

            pSym.SetupDC(hDC.ToInt32(), null);
            pSym.ROP2 = esriRasterOpCode.esriROPCopyPen;
            if (pGeometry != null)
            {
                pSym.Draw(pGeometry);
            }
            pSym.ResetDC();

            Graphics g2 = Graphics.FromImage(image);
            //获得屏幕的句柄
            IntPtr dc3 = pGraphics.GetHdc();
            //获得位图的句柄
            IntPtr dc2 = g2.GetHdc();

            BitBlt(dc2, 0, 0, pBox.Width, pBox.Height, dc3, 0, 0, SRCCOPY);
            pGraphics.ReleaseHdc(dc3); //释放屏幕句柄
            g2.ReleaseHdc(dc2);        //释放位图句柄
            //image.Save("c:\\MyJpeg.Icon", ImageFormat.Bmp);
            return(image);
        }
Ejemplo n.º 2
0
        private ISymbol SetColorOfUnknownSymbol(IClone ClonedSymbol, IColor Color)
        {
            ISymbol tempSetColorOfUnknownSymbol = null;

            //
            // This function takes an IClone interface, works out the underlying coclass
            // (which should be some kind of symbol) and then sets the Color property
            // according to the passed in color.
            //
            tempSetColorOfUnknownSymbol = null;
            if (ClonedSymbol == null)
            {
                return(tempSetColorOfUnknownSymbol);
            }
            //
            // Here we figure out which kind of symbol we have. For the simple symbol
            // types, simply setting the color property is OK. However, more complex
            // symbol types require further investigation.
            //
            IFillSymbol          FillSymbol          = null;
            IMarkerFillSymbol    MarkerFillSymbol    = null;
            IMarkerSymbol        MarkerSymbol_A      = null;
            ILineFillSymbol      LineFillSymbol      = null;
            ILineSymbol          LineSymbol          = null;
            IPictureFillSymbol   PictureFillSymbol   = null;
            IMarkerSymbol        MarkerSymbol_B      = null;
            IPictureMarkerSymbol PictureMarkerSymbol = null;
            IMarkerLineSymbol    MarkerLineSymbol    = null;
            IMarkerSymbol        MarkerSymbol_C      = null;
            ILineSymbol          LineSymbol_B        = null;

            if (ClonedSymbol is ISymbol)
            {
                //
                // Check for Fill symbols.
                //
                if (ClonedSymbol is IFillSymbol)
                {
                    //
                    // Check for SimpleFillSymbols or MultiLevelFillSymbols.
                    //
                    if ((ClonedSymbol is ISimpleFillSymbol) | (ClonedSymbol is IMultiLayerFillSymbol))
                    {
                        FillSymbol = (IFillSymbol)ClonedSymbol;
                        //
                        // Here we simply change the color of the Fill.
                        //
                        FillSymbol.Color            = Color;
                        tempSetColorOfUnknownSymbol = (ISymbol)FillSymbol;
                        //
                        // Check for MarkerFillSymbols.
                        //
                    }
                    else if (ClonedSymbol is IMarkerFillSymbol)
                    {
                        MarkerFillSymbol = (IMarkerFillSymbol)ClonedSymbol;
                        //
                        // Here we change the color of the MarkerSymbol.
                        //
                        MarkerSymbol_A = (IMarkerSymbol)SetColorOfUnknownSymbol((IClone)MarkerFillSymbol.MarkerSymbol, Color);
                        MarkerFillSymbol.MarkerSymbol = MarkerSymbol_A;
                        tempSetColorOfUnknownSymbol   = (ISymbol)MarkerFillSymbol;
                        //
                        // Check for LineFillSymbols.
                        //
                    }
                    else if (ClonedSymbol is ILineFillSymbol)
                    {
                        LineFillSymbol = (ILineFillSymbol)ClonedSymbol;
                        //
                        // Here we change the color of the LineSymbol.
                        //
                        LineSymbol = (ILineSymbol)SetColorOfUnknownSymbol((IClone)LineFillSymbol.LineSymbol, Color);
                        LineFillSymbol.LineSymbol   = LineSymbol;
                        tempSetColorOfUnknownSymbol = (ISymbol)LineFillSymbol;
                        //
                        // Check for PictureFillSymbols.
                        //
                    }
                    else if (ClonedSymbol is IPictureFillSymbol)
                    {
                        PictureFillSymbol = (IPictureFillSymbol)ClonedSymbol;
                        //
                        // Here we simply change the color of the BackgroundColor.
                        //
                        PictureFillSymbol.BackgroundColor = Color;
                        tempSetColorOfUnknownSymbol       = (ISymbol)PictureFillSymbol;
                    }
                    //
                    // Check for Marker symbols.
                    //
                }
                else if (ClonedSymbol is IMarkerSymbol)
                {
                    //
                    // Check for SimpleMarkerSymbols, ArrowMarkerSymbols or
                    // CharacterMarkerSymbols.
                    //
                    if ((ClonedSymbol is IMultiLayerMarkerSymbol) | (ClonedSymbol is ISimpleMarkerSymbol) | (ClonedSymbol is IArrowMarkerSymbol) | (ClonedSymbol is ICharacterMarkerSymbol))
                    {
                        MarkerSymbol_B = (IMarkerSymbol)ClonedSymbol;
                        //
                        // For these types, we simply change the color property.
                        //
                        MarkerSymbol_B.Color        = Color;
                        tempSetColorOfUnknownSymbol = (ISymbol)MarkerSymbol_B;
                        //
                        // Check for PictureMarkerSymbols.
                        //
                    }
                    else if (ClonedSymbol is IPictureMarkerSymbol)
                    {
                        PictureMarkerSymbol = (IPictureMarkerSymbol)ClonedSymbol;
                        //
                        // Here we change the BackgroundColor property.
                        //
                        PictureMarkerSymbol.Color   = Color;
                        tempSetColorOfUnknownSymbol = (ISymbol)PictureMarkerSymbol;
                    }
                    //
                    // Check for Line symbols.
                    //
                }
                else if (ClonedSymbol is ILineSymbol)
                {
                    //
                    // Check for MarkerLine symbols.
                    //
                    if (ClonedSymbol is IMarkerLineSymbol)
                    {
                        MarkerLineSymbol = (IMarkerLineSymbol)ClonedSymbol;
                        //
                        // Here we change the color of the MarkerSymbol.
                        //
                        MarkerSymbol_C = (IMarkerSymbol)SetColorOfUnknownSymbol((IClone)MarkerLineSymbol.MarkerSymbol, Color);
                        MarkerLineSymbol.MarkerSymbol = MarkerSymbol_C;
                        tempSetColorOfUnknownSymbol   = (ISymbol)MarkerLineSymbol;
                        //
                        // Check for other Line symbols.
                        //
                    }
                    else if ((ClonedSymbol is ISimpleLineSymbol) | (ClonedSymbol is IHashLineSymbol) | (ClonedSymbol is ICartographicLineSymbol))
                    {
                        LineSymbol_B                = (ILineSymbol)ClonedSymbol;
                        LineSymbol_B.Color          = Color;
                        tempSetColorOfUnknownSymbol = (ISymbol)LineSymbol_B;
                    }
                }
            }

            return(tempSetColorOfUnknownSymbol);
        }
Ejemplo n.º 3
0
        private void DrawToPictureBox(ISymbol pSym, PictureBox pBox)
        {
            IGeometry pGeometry = null;
            IntPtr    hDC;
            IEnvelope pEnvelope;

            pEnvelope = new EnvelopeClass();
            // Reset the PictureBox
            pBox.CreateGraphics().Clear(pBox.BackColor);
            try
            {
                if (pSym is IMarkerSymbol)
                {
                    pEnvelope.PutCoords(pBox.Width / 2, pBox.Height / 2, pBox.Width / 2, pBox.Height / 2);
                    IArea pArea = pEnvelope as IArea;
                    pGeometry = pArea.Centroid;
                }
                else if (pSym is ILineSymbol)
                {
                    pEnvelope.PutCoords(0, pBox.Height / 2, pBox.Width, pBox.Height / 2);
                    IPolyline pPolyline = new PolylineClass();
                    pPolyline.FromPoint = pEnvelope.LowerLeft;
                    pPolyline.ToPoint   = pEnvelope.UpperRight;
                    pGeometry           = pPolyline;
                }
                else if (pSym is IFillSymbol)
                {
                    if (pSym is SimpleFillSymbol)
                    {
                        pEnvelope.PutCoords(5, 5, pBox.Width - 5, pBox.Height - 5);
                        pGeometry = pEnvelope;
                    }
                    else if (pSym is MultiLayerFillSymbol)
                    {
                        IMultiLayerFillSymbol pMultiLayerFillSymbol = pSym as IMultiLayerFillSymbol;
                        //For mLayers As Integer = 0 To pMultiLayerFillSymbol.LayerCount - 1
                        if (pMultiLayerFillSymbol.get_Layer(0) is PictureFillSymbol)
                        {
                            IPictureFillSymbol pPictureFillSymbol = pMultiLayerFillSymbol.get_Layer(0) as IPictureFillSymbol;
                            Bitmap             m = Bitmap.FromHbitmap(new IntPtr(pPictureFillSymbol.Picture.Handle));
                            //m.MakeTransparent(System.Drawing.ColorTranslator.FromOle(pPictureFillSymbol.Color.RGB))
                            pBox.Image = m;
                            return;
                        }
                        else if (pMultiLayerFillSymbol.get_Layer(0) is SimpleFillSymbol)
                        {
                            pEnvelope.PutCoords(5, 5, pBox.Width - 5, pBox.Height - 5);
                            pGeometry = pEnvelope;
                        }
                        else if (pMultiLayerFillSymbol.get_Layer(0) is GradientFillSymbol)
                        {
                            IGradientFillSymbol      pGradientFillSymbol = pMultiLayerFillSymbol.get_Layer(0) as IGradientFillSymbol;
                            IAlgorithmicColorRamp    pRamp   = pGradientFillSymbol.ColorRamp as IAlgorithmicColorRamp;
                            System.Drawing.Rectangle rect    = new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), new System.Drawing.Size(pBox.Width, pBox.Height));
                            LinearGradientBrush      lgBrush = new LinearGradientBrush(rect,
                                                                                       System.Drawing.ColorTranslator.FromOle(pRamp.FromColor.RGB),
                                                                                       System.Drawing.ColorTranslator.FromOle(pRamp.ToColor.RGB),
                                                                                       45);
                            Graphics g = pBox.CreateGraphics();
                            g.FillRectangle(lgBrush, rect);
                            rect.Width  = rect.Width - 1;
                            rect.Height = rect.Height - 1;
                            g.DrawRectangle(new Pen(ColorTranslator.FromOle(pGradientFillSymbol.Outline.Color.RGB),
                                                    (float)pGradientFillSymbol.Outline.Width), rect);
                        }
                    }
                    else if (pSym is PictureFillSymbol)
                    {
                        IPictureFillSymbol pPictureFillSymbol = pSym as IPictureFillSymbol;
                        Bitmap             m = Bitmap.FromHbitmap(new IntPtr(pPictureFillSymbol.Picture.Handle));
                        //m.MakeTransparent(System.Drawing.ColorTranslator.FromOle(pPictureFillSymbol.Color.RGB))
                        pBox.Image = m;
                        return;
                    }
                }

                hDC = GetDC(pBox.Handle);
                pSym.SetupDC(hDC.ToInt32(), null);
                pSym.ROP2 = esriRasterOpCode.esriROPCopyPen;
                if (pGeometry != null)
                {
                    pSym.Draw(pGeometry);
                }

                pSym.ResetDC();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }