tanyg

how to draw polyline by SimpleDisplayClass?

Discussion created by tanyg on Dec 28, 2010
Latest reply on Jan 3, 2011 by tanyg
hi all:
    i want to draw some polyline in Bitmap using SimpleDisplay,but the bitmap is blank,what's wrong ,
thx!
the code is:


        static void Main(string[] args)
        {
            //ESRI License Initializer generated code.
            m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeEngine },
            new esriLicenseExtensionCode[] { });
            //ESRI License Initializer generated code.
            //Do not make any call to ArcObjects after ShutDownApplication()


            System.Drawing.Point p1 = new System.Drawing.Point(20, 20);
            System.Drawing.Point p2 = new System.Drawing.Point(80, 80);

            IPolyline pc = new PolylineClass();
            pc.FromPoint = ConvertToIPoint(p1);
            pc.ToPoint = ConvertToIPoint(p2);

            IDisplay display = new SimpleDisplayClass();
            IDisplayTransformation tran = display.DisplayTransformation;

            Rectangle r = new Rectangle(0,0,100,100);

            IEnvelope env = (pc as IGeometry).Envelope;
            tran.Bounds = env;
            tran.VisibleBounds = env;

            tagRECT rect = new tagRECT();
            rect.left = 0;
            rect.right = 100;
            rect.top = 0;
            rect.bottom = 100;

            tran.set_DeviceFrame(ref rect);

            Bitmap bmp = new Bitmap(100, 100);

            Graphics g = Graphics.FromImage(bmp);
            g.Clear(Color.White);

            display.StartDrawing(g.GetHdc().ToInt32(), (short)esriScreenCache.esriNoScreenCache);


            ISimpleLineSymbol s = new SimpleLineSymbol();
            s.Style = esriSimpleLineStyle.esriSLSSolid;
            s.Width = 5;

            IRgbColor c = new RgbColorClass();
            c.Red = 255;
            c.Blue = 0;
            c.Green = 0;

            s.Color = c;

            display.SetSymbol(s as ISymbol);
            display.DrawPolyline(pc as IPolyline);

            display.FinishDrawing();

            bmp.Save(@"c:\t.png",ImageFormat.Png);
            g.ReleaseHdc();

            m_AOLicenseInitializer.ShutdownApplication();
        }

        public static IPoint ConvertToIPoint(System.Drawing.Point pt)
        {
            IPoint p = new PointClass();

            IZAware z = p as IZAware;
            z.ZAware = true;

            IMAware m = p as IMAware;
            m.MAware = true;

            p.X = pt.X;
            p.Y = pt.Y;
            p.Z = 0;
            p.M = 0;
            p.SpatialReference = GetSpatialReference();


            return p;
        }

        public static IEnvelope ConvertToEnvelope(Rectangle bound)
        {
            IEnvelope env = new EnvelopeClass();

            IZAware z = env as IZAware;
            z.ZAware = true;

            IMAware m = env as IMAware;
            m.MAware = true;

            env.XMin = bound.Left;
            env.YMin = bound.Top;
            env.Width = bound.Width;
            env.Height = bound.Height;
            env.ZMin = 0;
            env.ZMax = 0;
            env.MMax = 0;
            env.MMin = 0;
            env.SpatialReference = GetSpatialReference();

            return env;
        }
        public static ISpatialReference GetSpatialReference()
        {
            ISpatialReference spatial_ref = null;

            ISpatialReferenceFactory env = new SpatialReferenceEnvironmentClass();

            //Beijing_1954_3_Degree_GK_CM_108E.prj(PCS)
            string prj_string =
                "PROJCS[\"Beijing_1954_3_Degree_GK_CM_108E\",GEOGCS[\"GCS_Beijing_1954\",DATUM[\"D_Beijing_1954\",SPHEROID[\"Krasovsky_1940\",6378245.0,298.3]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Gauss_Kruger\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",108.0],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]";

            int read_bytes;
            env.CreateESRISpatialReference(prj_string, out spatial_ref, out read_bytes);

            double len = 5000 * 1000;
            spatial_ref.SetFalseOriginAndUnits(-len, -len, 1000);
            spatial_ref.SetZFalseOriginAndUnits(-len, 1000);
            spatial_ref.SetMFalseOriginAndUnits(-len, 1000);

            return spatial_ref;
        }

Outcomes