Hi everyone. This is an issue I have been trying to tackle for a while and decided to reach out for help. I am creating an ESRI ArcGIS Desktop Add-In that allows the user to draw a polygon and then have it added to the map. I am able to capture the polygon and add it to the map, the issue is the transparency. Currently and by default it is 100% opacity and solid. I want to make it around 50% opacity so the user can see the data behind it.
Here is the code I have so far:
public static void AddPolygonToMap(IActiveView ActiveViewInstance, IGeometry NewGeo) { //Local Variable Declaration var fillShapeElement = default(IFillShapeElement); var element = default(IElement); var graphicsContainer = default(IGraphicsContainer); var simpleFilleSymbol = default(ISimpleFillSymbol); var newRgbColor = default(IRgbColor); var lineSymbol = default(ILineSymbol); //Use the IElement interface to set the Envelope Element's geo element = new PolygonElement(); element.Geometry = NewGeo; //QI for the IFillShapeElement interface so that the symbol property can be set fillShapeElement = element as IFillShapeElement; //Create a new fill symbol simpleFilleSymbol = new SimpleFillSymbol(); //Create a new color marker symbol of the color black; newRgbColor = new RgbColor(); newRgbColor.Red = 0; newRgbColor.Green = 0; newRgbColor.Blue = 0; //Create a new line symbol so that we can set the width outline lineSymbol = new SimpleLineSymbol(); lineSymbol.Color = newRgbColor; lineSymbol.Width = 2; //Setup the Simple Fill Symbol simpleFilleSymbol.Color = newRgbColor; simpleFilleSymbol.Style = esriSimpleFillStyle.esriSFSHollow; simpleFilleSymbol.Outline = lineSymbol; fillShapeElement.Symbol = simpleFilleSymbol; //QI for the graphics container from the active view allows access to basic graphics layer graphicsContainer = ActiveViewInstance as IGraphicsContainer; //Add the new element at Z order 0 graphicsContainer.AddElement((IElement)fillShapeElement, 0); //Show the new graphic ActiveViewInstance.Refresh(); }
I know that this is possible somehow and I am sure it's just a line or two missing but any help would be much appreciated.
V/r,
Josh
Solved! Go to Solution.
Joshua,
I wonder if the technique I pointed to expects your graphics to be simple fills? Below are two polygons one a simple blue fill the other a picture file.
I run the code as described in that link and I get below; so it works well with simple fill but not great with the picture fill.
The code was:
Public Sub MakeTransparent() ' Get map document Dim pMXDoc As IMxDocument Set pMXDoc = ThisDocument ' Get Map Dim pMap As IMap Set pMap = pMXDoc.FocusMap ' Get Graphics Container for map Dim pGC As IGraphicsContainer Set pGC = pMap pGC.Reset ' Get first graphic, assumed to be polygon Dim pElement As IElement Set pElement = pGC.Next Dim rgb As IRgbColor Set rgb = New RgbColor rgb.Red = 255 Do While Not pElement Is Nothing ' Get symbol of graphic and its colour Dim pFillShapeElement As IFillShapeElement Set pFillShapeElement = pElement Dim pFillSymbol As IFillSymbol Set pFillSymbol = pFillShapeElement.Symbol Dim pColour As IColor Set pColour = pFillSymbol.Color Dim psym As ISymbol Set psym = pFillSymbol psym.ROP2 = esriROPMaskPen pFillSymbol.Color = rgb pFillShapeElement.Symbol = pFillSymbol Set pElement = pGC.Next Loop ' Refresh map pMXDoc.ActiveView.Refresh End Sub
Joshua,
Have a look at this thread which discusses this issue. In a link in the final comment to my answer is a solution that you are probably after.
Duncan
Duncan thanks for the reply, I have actually been pointed to this post a couple times but unfortunately IColor only support a value of 0 or 255. So completely solid or completely transparent and I am looking for something in the 50% range.
Ah but did you follow the link in the final comment...
Ducan I did check out the link but all it seemed to be doing was casting the ISimpleFillSymbol to a ISymbol and setting the ROP2 property which did not affect my graphics at all.
Joshua,
I wonder if the technique I pointed to expects your graphics to be simple fills? Below are two polygons one a simple blue fill the other a picture file.
I run the code as described in that link and I get below; so it works well with simple fill but not great with the picture fill.
The code was:
Public Sub MakeTransparent() ' Get map document Dim pMXDoc As IMxDocument Set pMXDoc = ThisDocument ' Get Map Dim pMap As IMap Set pMap = pMXDoc.FocusMap ' Get Graphics Container for map Dim pGC As IGraphicsContainer Set pGC = pMap pGC.Reset ' Get first graphic, assumed to be polygon Dim pElement As IElement Set pElement = pGC.Next Dim rgb As IRgbColor Set rgb = New RgbColor rgb.Red = 255 Do While Not pElement Is Nothing ' Get symbol of graphic and its colour Dim pFillShapeElement As IFillShapeElement Set pFillShapeElement = pElement Dim pFillSymbol As IFillSymbol Set pFillSymbol = pFillShapeElement.Symbol Dim pColour As IColor Set pColour = pFillSymbol.Color Dim psym As ISymbol Set psym = pFillSymbol psym.ROP2 = esriROPMaskPen pFillSymbol.Color = rgb pFillShapeElement.Symbol = pFillSymbol Set pElement = pGC.Next Loop ' Refresh map pMXDoc.ActiveView.Refresh End Sub
Duncan I have tried to implement the proposed solution using the following code but instead of making the graphic transparent it makes it completely disappear from the screen. I appears to be making it invisible.
ESRI.ArcGIS.Display.IScreenDisplay screenDisplay = this.ActiveViewInstance.ScreenDisplay; // Constant screenDisplay.StartDrawing(screenDisplay.hDC, (System.Int16)ESRI.ArcGIS.Display.esriScreenCache.esriNoScreenCache); // Explicit Cast ESRI.ArcGIS.Display.IRgbColor rgbColor = new ESRI.ArcGIS.Display.RgbColorClass(); rgbColor.Red = 255; ESRI.ArcGIS.Display.IColor color = rgbColor; // Implicit Cast ESRI.ArcGIS.Display.ISimpleFillSymbol simpleFillSymbol = new ESRI.ArcGIS.Display.SimpleFillSymbolClass(); simpleFillSymbol.Color = color; ESRI.ArcGIS.Display.ISymbol symbol = simpleFillSymbol as ESRI.ArcGIS.Display.ISymbol; // Dynamic Cast ESRI.ArcGIS.Display.IRubberBand rubberBand = new ESRI.ArcGIS.Display.RubberPolygonClass(); ESRI.ArcGIS.Geometry.IGeometry geometry = rubberBand.TrackNew(screenDisplay, symbol); screenDisplay.SetSymbol(symbol); screenDisplay.DrawPolygon(geometry); screenDisplay.FinishDrawing(); //Try Make Transparent var graphicsContainer = this.ActiveViewInstance.FocusMap as IGraphicsContainer; graphicsContainer.Reset(); var element = graphicsContainer.Next(); ESRI.ArcGIS.Display.IRgbColor rgbColor2 = new ESRI.ArcGIS.Display.RgbColor(); rgbColor2.Red = 255; while (element != null) { var shapeFille = element as IFillShapeElement; var fillSymbol = shapeFille.Symbol as IFillSymbol; var iSymbol = fillSymbol as ISymbol; iSymbol.ROP2 = esriRasterOpCode.esriROPMaskPen; fillSymbol.Color = rgbColor2; shapeFille.Symbol = fillSymbol; element = graphicsContainer.Next(); } this.ActiveViewInstance.Refresh();
Joshua,
Looking at the code nothing leaps out at me. The only thing I can think of is you are creating your graphic polygon via the RubberBand class. I did not do that I created the graphics then ran the code. Can you have an MXD with a drawn graphic on the map (so you are not using the RubberBand) to see if the code works for you. If that does then it suggests something is not happening when you create the graphic via the RubberBand method?
Duncan
IColor has a Transparency property which you can use.
Thanks for the reply but unfortunately IColor only support a value of 0 or 255. So completely solid or completely transparent and I am looking for something in the 50% range.