2009-03-24 10 views
2

J'ai posté cette question sur le forum MapXtreme mais comme personne ne répond jamais aux questions, j'espère que quelqu'un ici a de l'expérience avec ce produit (mapxtreme est un SDK SIG fait par les gens qui faire MapInfo)Comment puis-je faire un bitmap à partir de MapXtreme Styles

Je travaille sur une application Desktop MapXtreme et nous avons besoin bitmaps de nos caractéristiques styles

J'ai essayé deux façons, mais tout ce que je reçois est un bitmap gris avec un X noir

ici est le code que j'ai utilisé les deux façons sont dans le code mais on est commenté:

public static Bitmap GetStyleBitmap(Style style) 
    { 
     var bm = new Bitmap(16, 16, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
     var rect = new System.Drawing.Rectangle(0, 0, 16, 16); 
     var ss = new StyleSample(); 
     ss.Bounds = rect; 
     if (style is CompositeStyle) 
     { 
      ss.ApplyAreaStyle(((CompositeStyle)style).AreaStyle); 
      ss.ApplyLineStyle(((CompositeStyle)style).LineStyle); 
     } 
     if (style is AreaStyle) 
     { 
      ss.ApplyAreaStyle((AreaStyle)style); 
     } 
     if (style is SimpleLineStyle) 
     { 
      ss.ApplyLineStyle((SimpleLineStyle)style); 
     } 

     //using MapExport 
     var me = new MapExport(ss.Map); 
     var image = me.Export(); 
     return new Bitmap(image); 

     //using StyleSample.DrawToBitmap 
     //ss.DrawToBitmap(bm, rect); 
     //return bm; 
    } 

TIA

Répondre

0

Après avoir attendu une réponse - et d'essayer d'innombrables autres façons - en vain, j'ai décidé de faire tout « à la main » à dire que je regarde simplement l'objet de style obtenir la couleur et dessine un bitmap approprié pour le type de couche (ligne ou polygone).

Il ne gère pas tous les cas et ne gère pas les styles de ligne ou les couleurs intérieures, mais il sert mes fins pour l'instant.

Voici le code qui le fait.

public static Bitmap GetStyleBitmap(FeatureLayer fl) 
    { 
     Feature f = GetFirstFeature(fl); 
     if (f == null) return null; 

     var style = f.Style; 
     Color c; 
     var bm = new Bitmap(16, 16, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
     PointF[] poly = new PointF[] 
     { 
      new PointF(2,5), 
      new PointF(5,2), 
      new PointF(14,7), 
      new PointF(14,14), 
      new PointF(2,14), 
      new PointF(2,4) 
     }; 

     SimpleLineStyle line = null; 
     if (style is CompositeStyle) 
      line = ((CompositeStyle)style).AreaStyle.Border as SimpleLineStyle; 
     if (style is AreaStyle) 
      line = ((AreaStyle)style).Border as SimpleLineStyle; 

     if (line != null) 
     { 
      c = line.Color; 

      using (var gr = Graphics.FromImage(bm)) 
      { 
       gr.DrawPolygon(new Pen(c, 2), poly); 
      } 
      return bm; 
     } 

     line = style as SimpleLineStyle; 

     if (line != null) 
     { 
      c = line.Color; 

      using (var gr = Graphics.FromImage(bm)) 
      { 
       gr.DrawLine(new Pen(c, 2), new PointF(2,2), new PointF(14,14)); 
      } 
     } 
     return bm; 
    } 
0

Le premier code déjà presque travaillé. Je l'ai juste peaufiné un peu pour le réparer. Je l'ai testé pour un style composite qui contient un style simplevectorpointstyle.

/// <summary> 
    /// Creates an icon for the specified style. 
    /// </summary> 
    /// <param name="style">The style.</param> 
    /// <returns></returns> 
    private static Bitmap CreateStyleIcon(Style style) 
    { 
     const int iconSize = 16; //the size of the icon 
     System.Drawing.Rectangle iconArea = new System.Drawing.Rectangle(0, 0, iconSize, iconSize); //a rectangle area for the icon 
     StyleSample ss = new StyleSample { Bounds = iconArea }; 
     if (style is CompositeStyle) 
     { 
      CompositeStyle compsiteStyle = style as CompositeStyle; 
      if (compsiteStyle.AreaStyle != null) //do we have an area style? 
      { 
       ss.ApplyAreaStyle(compsiteStyle.AreaStyle); 
      } 
      if (compsiteStyle.LineStyle != null) //do we have an LineStyle style? 
      { 
       ss.ApplyLineStyle(compsiteStyle.LineStyle); 
      } 
      if (compsiteStyle.SymbolStyle != null) //do we have an SymbolStyle style? 
      { 
       ss.ApplySymbol(compsiteStyle.SymbolStyle); 
      } 
     } 
     if (style is AreaStyle) 
     { 
      ss.ApplyAreaStyle((AreaStyle)style); 
     } 
     if (style is BaseLineStyle) 
     { 
      ss.ApplyLineStyle((BaseLineStyle)style); 
     } 

     //draw the bitmap 
     Bitmap iconBitmap = new Bitmap(iconSize, iconSize, System.Drawing.Imaging.PixelFormat.Format32bppArgb);//the bitmap to draw the icon to 
     ss.DrawToBitmap(iconBitmap, iconArea); 
     return iconBitmap; 
    }