using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; #if AdvTree namespace DevComponents.Tree #elif DOTNETBAR namespace DevComponents.DotNetBar #endif { /// /// Paints the ElementStyle /// public class ElementStyleDisplay { /// Creates new instance of the object. public ElementStyleDisplay() { } /// /// Paints text for given style. /// /// Display information. /// Text to paint. /// Default font if no font by style is specified. public static void PaintText(ElementStyleDisplayInfo e, string text, Font defaultFont) { PaintText(e, text, defaultFont, false); } /// /// Paints text for given style. /// /// Display information. /// /// Default font if no font by style is specified. /// Specifies whether to use default font for painting regardless of style settings. public static void PaintText(ElementStyleDisplayInfo e, string text, Font defaultFont, bool useDefaultFont) { PaintText(e, text, defaultFont, useDefaultFont, e.Style.TextFormat); } /// /// Paints text for given style. /// /// Display information. /// /// Default font if no font by style is specified. /// Specifies whether to use default font for painting regardless of style settings. public static void PaintText(ElementStyleDisplayInfo e, string text, Font defaultFont, bool useDefaultFont, eTextFormat textFormat) { Rectangle textBounds = e.Bounds; bool disposeStyle = false; ElementStyle style = GetElementStyle(e.Style, out disposeStyle); if (text == "" || textBounds.IsEmpty) { if (disposeStyle) style.Dispose(); return; } Font font = style.Font; if (font == null || useDefaultFont) font = defaultFont; textBounds.X += style.MarginLeft + style.PaddingLeft; textBounds.Width -= (style.MarginLeft + style.MarginRight + style.PaddingLeft + style.PaddingRight); textBounds.Y += style.MarginTop + style.PaddingTop; textBounds.Height -= (style.MarginTop + style.MarginBottom + style.PaddingTop + style.PaddingBottom); if (!style.TextShadowColor.IsEmpty && Math.Abs(style.TextShadowColor.GetBrightness() - style.TextColor.GetBrightness()) > .2) { using (SolidBrush brush = new SolidBrush(style.TextShadowColor)) { Rectangle r = textBounds; r.Offset(style.TextShadowOffset); TextDrawing.DrawString(e.Graphics, text, font, style.TextShadowColor, r, textFormat); //e.Graphics.DrawString(text,font,brush,r,style.StringFormat); } } Color textColor = style.TextColor; if (textColor.IsEmpty && style.TextShadowColor.IsEmpty) textColor = SystemColors.ControlText; if (!textColor.IsEmpty) TextDrawing.DrawString(e.Graphics, text, font, textColor, textBounds, textFormat); if (disposeStyle) style.Dispose(); } /// Returns new Region object for given ElementStyle. /// New instance of Region object. /// Information to describe ElementStyle. public static Region GetStyleRegion(ElementStyleDisplayInfo e) { Rectangle rectPath = e.Bounds; if (e.Style.PaintBorder && e.Style.CornerType != eCornerType.Square) { rectPath.Width--; rectPath.Height--; } Region r = new Region(); using (GraphicsPath path = ElementStyleDisplay.GetBackgroundPath(e.Style, rectPath)) { r.MakeEmpty(); r.Union(path); // Widen path for the border... if (e.Style.PaintBorder && (e.Style.CornerType == eCornerType.Rounded || e.Style.CornerType == eCornerType.Diagonal || e.Style.CornerTypeTopLeft == eCornerType.Rounded || e.Style.CornerTypeTopLeft == eCornerType.Diagonal || e.Style.CornerTypeTopRight == eCornerType.Rounded || e.Style.CornerTypeTopRight == eCornerType.Diagonal || e.Style.CornerTypeBottomLeft == eCornerType.Rounded || e.Style.CornerTypeBottomLeft == eCornerType.Diagonal || e.Style.CornerTypeBottomRight == eCornerType.Rounded || e.Style.CornerTypeBottomRight == eCornerType.Diagonal)) { using (Pen pen = new Pen(Color.Black, (e.Style.BorderTopWidth > 0 ? e.Style.BorderTopWidth : 1))) { path.Widen(pen); } //Region r2 = new Region(path); r.Union(path); } } return r; //GraphicsPath path=ElementStyleDisplay.GetBackgroundPath(e.Style,e.Bounds,false); //return new Region(path); } /// /// Returns the clipping for the content of the element style. /// /// /// public static GraphicsPath GetInsideClip(ElementStyleDisplayInfo e) { Rectangle rectPath = e.Bounds; // GDI bug if (e.Style.PaintBorder) { if (e.Style.PaintTopBorder) { rectPath.Y += e.Style.BorderTopWidth; rectPath.Height -= e.Style.BorderTopWidth; if (e.Style.BorderTop == eStyleBorderType.Etched || e.Style.BorderTop == eStyleBorderType.Double) { rectPath.Y += e.Style.BorderTopWidth; rectPath.Height -= e.Style.BorderTopWidth; } } if (e.Style.PaintBottomBorder) { rectPath.Height -= e.Style.BorderBottomWidth; if (e.Style.BorderBottom == eStyleBorderType.Etched || e.Style.BorderBottom == eStyleBorderType.Double) rectPath.Height -= e.Style.BorderBottomWidth; } if (e.Style.PaintLeftBorder) { rectPath.X += e.Style.BorderLeftWidth; rectPath.Width -= e.Style.BorderLeftWidth; if (e.Style.BorderLeft == eStyleBorderType.Etched || e.Style.BorderLeft == eStyleBorderType.Double) { rectPath.X += e.Style.BorderLeftWidth; rectPath.Width -= e.Style.BorderLeftWidth; } } if (e.Style.PaintRightBorder) { rectPath.Width -= e.Style.BorderRightWidth; if (e.Style.BorderRight == eStyleBorderType.Etched || e.Style.BorderRight == eStyleBorderType.Double) rectPath.Width -= e.Style.BorderRightWidth; } } GraphicsPath path = ElementStyleDisplay.GetBackgroundPath(e.Style, rectPath); return path; } /// /// Paints the element style on the canvas. /// /// Holds information necessary to paint style on canvas. public static void Paint(ElementStyleDisplayInfo e) { ElementStyleDisplay.PaintBackground(e); ElementStyleDisplay.PaintBackgroundImage(e); ElementStyleDisplay.PaintBorder(e); } private static eCornerType GetCornerType(eCornerType baseType, eCornerType specificType) { if (specificType != eCornerType.Inherit) return specificType; return baseType; } /// /// Paint style border. /// /// Style display information. public static void PaintBorder(ElementStyleDisplayInfo e) { bool disposeStyle = false; ElementStyle style = GetElementStyle(e.Style, out disposeStyle); Rectangle backBounds = GetBackgroundRectangle(style, e.Bounds); Rectangle bounds = ElementStyleDisplay.GetBorderRectangle(style, backBounds); try { if (bounds.Width < 2 || bounds.Height < 2) { return; } eCornerType cornerTopLeft = GetCornerType(style.CornerType, style.CornerTypeTopLeft); eCornerType cornerTopRight = GetCornerType(style.CornerType, style.CornerTypeTopRight); eCornerType cornerBottomLeft = GetCornerType(style.CornerType, style.CornerTypeBottomLeft); eCornerType cornerBottomRight = GetCornerType(style.CornerType, style.CornerTypeBottomRight); if (style.PaintBorder && style.Border == eStyleBorderType.Solid && cornerTopLeft == eCornerType.Rounded && cornerTopRight == eCornerType.Rounded && cornerBottomLeft == eCornerType.Rounded && cornerBottomRight == eCornerType.Rounded && style.BorderLeftWidth == style.BorderWidth && style.BorderRightWidth == style.BorderWidth && style.BorderTopWidth == style.BorderWidth && style.BorderBottomWidth == style.BorderWidth) { if (style.BorderWidth == 1) { bounds.Width++; bounds.Height++; } DisplayHelp.DrawRoundGradientRectangle(e.Graphics, bounds, style.BorderColor, style.BorderColor2, style.BorderGradientAngle, style.BorderWidth, style.CornerDiameter); return; } else if (style.PaintAllBorders && style.Border == eStyleBorderType.Solid && cornerTopLeft == eCornerType.Square && cornerTopRight == eCornerType.Square && cornerBottomLeft == eCornerType.Square && cornerBottomRight == eCornerType.Square && style.BorderLeftWidth == style.BorderWidth && style.BorderRightWidth == style.BorderWidth && style.BorderTopWidth == style.BorderWidth && style.BorderBottomWidth == style.BorderWidth) { if (style.BorderWidth == 1) { bounds.Width++; bounds.Height++; } DisplayHelp.DrawGradientRectangle(e.Graphics, bounds, style.BorderColor, style.BorderColor2, style.BorderGradientAngle, style.BorderWidth); return; } else if (style.Border == eStyleBorderType.None && style.BorderRight == eStyleBorderType.Etched && style.BorderLeft == eStyleBorderType.None && style.BorderTop == eStyleBorderType.None && style.BorderBottom == eStyleBorderType.None) { DisplayHelp.DrawGradientRectangle(e.Graphics, new Rectangle(bounds.Right - 2, bounds.Y, 3, bounds.Height + 1), style.BorderColorLight, style.BorderColorLight2, 90, 1); DisplayHelp.DrawGradientLine(e.Graphics, new Point(bounds.Right, bounds.Y), new Point(bounds.Right, bounds.Bottom + 1), style.BorderColor, style.BorderColor2, 90, 1); return; } if (!style.BorderColor2.IsEmpty || !style.BorderColorLight.IsEmpty) { if (style.Border == eStyleBorderType.Solid) { using ( GraphicsPath path = DisplayHelp.GetRoundedRectanglePath(bounds, style.CornerDiameter, eStyleBackgroundPathPart.Complete, cornerTopLeft, cornerTopRight, cornerBottomLeft, cornerBottomRight) ) { DisplayHelp.DrawGradientPathBorder(e.Graphics, path, style.BorderColor, style.BorderColor2, style.BorderGradientAngle, style.BorderWidth); } return; } else if (style.Border == eStyleBorderType.Etched) { Rectangle r = bounds; r.Width -= style.BorderWidth; r.Height -= style.BorderWidth; r.Offset(style.BorderWidth, style.BorderWidth); if (r.Width > 2 && r.Height > 2) { using ( GraphicsPath path = DisplayHelp.GetRoundedRectanglePath(r, style.CornerDiameter, eStyleBackgroundPathPart. Complete, cornerTopLeft, cornerTopRight, cornerBottomLeft, cornerBottomRight) ) { DisplayHelp.DrawGradientPathBorder(e.Graphics, path, style.BorderColorLight, style.BorderColorLight2, style.BorderLightGradientAngle, style.BorderWidth); } r.Offset(-style.BorderWidth, -style.BorderWidth); using ( GraphicsPath path = DisplayHelp.GetRoundedRectanglePath(r, style.CornerDiameter, eStyleBackgroundPathPart. Complete, cornerTopLeft, cornerTopRight, cornerBottomLeft, cornerBottomRight) ) { DisplayHelp.DrawGradientPathBorder(e.Graphics, path, style.BorderColor, style.BorderColor2, style.BorderGradientAngle, style.BorderWidth); } } return; } else if ((style.BorderTop == eStyleBorderType.Double && style.BorderLeft == eStyleBorderType.Double && style.BorderRight == eStyleBorderType.Double && style.BorderBottom == eStyleBorderType.Double) || (style.BorderTop == eStyleBorderType.None && style.BorderLeft == eStyleBorderType.Double && style.BorderRight == eStyleBorderType.Double && style.BorderBottom == eStyleBorderType.Double)) { Rectangle r = bounds; Region oldClip = null; bool clipSet = false; if (style.BorderTop == eStyleBorderType.None) { Rectangle clipRect = r; clipRect.Width++; clipRect.Height++; e.Graphics.SetClip(clipRect); r.Y -= 3; r.Height += 3; } using ( GraphicsPath path = DisplayHelp.GetBorderPath(r, style.CornerDiameter, eStyleBackgroundPathPart.Complete, cornerTopLeft, cornerTopRight, cornerBottomLeft, cornerBottomRight, style.PaintLeftBorder, style.PaintRightBorder, style.PaintTopBorder, style.PaintBottomBorder)) { using (Pen pen = new Pen(style.BorderColor, style.BorderWidth)) path.Widen(pen); DisplayHelp.FillPath(e.Graphics, path, style.BorderColor, style.BorderColor2); } r.Inflate(-style.BorderWidth, -style.BorderWidth); using ( GraphicsPath path = DisplayHelp.GetBorderPath(r, style.CornerDiameter, eStyleBackgroundPathPart.Complete, cornerTopLeft, cornerTopRight, cornerBottomLeft, cornerBottomRight, style.PaintLeftBorder, style.PaintRightBorder, style.PaintTopBorder, style.PaintBottomBorder)) { using (Pen pen = new Pen(style.BorderColor, style.BorderWidth)) path.Widen(pen); DisplayHelp.FillPath(e.Graphics, path, style.BorderColorLight, style.BorderColorLight2); } if (clipSet) e.Graphics.Clip = oldClip; return; } } Color colorStart = style.BorderColor; Color colorEnd = style.BorderColor2; Color colorLightStart = style.BorderColorLight; Color colorLightEnd = style.BorderColorLight2; BorderDrawInfo borderDrawInfo = new BorderDrawInfo(style.PaintLeftBorder, style.PaintRightBorder, style.PaintTopBorder, style.PaintBottomBorder, e.IsTwistedDoubleBorder); if (style.PaintLeftBorder) { Color color = style.BorderColor; if (!style.BorderLeftColor.IsEmpty) color = style.BorderLeftColor; Point[] p = new Point[2]; // Corner type square is default setting p[0] = bounds.Location; p[1].X = bounds.X; p[1].Y = bounds.Bottom; if (cornerTopLeft != eCornerType.Square) { p[0].Y += style.CornerDiameter; } if (cornerBottomLeft != eCornerType.Square) { p[1].Y -= style.CornerDiameter; } ElementStyleDisplay.DrawBorderLine(e.Graphics, p, style.BorderLeft, style.BorderLeftWidth, color, colorEnd, colorLightStart, colorLightEnd, eBorderSide.Left, borderDrawInfo); if (style.PaintTopBorder && cornerTopLeft != eCornerType.Square) { if (cornerTopLeft == eCornerType.Diagonal) { p[0].X = bounds.X; p[0].Y = bounds.Y + style.CornerDiameter; p[1].X = bounds.X + style.CornerDiameter; p[1].Y = bounds.Y; ElementStyleDisplay.DrawBorderLine(e.Graphics, p, style.BorderLeft, style.BorderLeftWidth, color, colorEnd, colorLightStart, colorLightEnd, eBorderSide.TopLeft, borderDrawInfo); } else if (cornerTopLeft == eCornerType.Rounded) { ArcData a = GetCornerArc(bounds, style.CornerDiameter, eCornerArc.TopLeft); // new ArcData(bounds.X,bounds.Y,style.CornerDiameter*2,style.CornerDiameter*2,180,90); ElementStyleDisplay.DrawCornerArc(e.Graphics, a, style.BorderLeft, style.BorderLeftWidth, color); } } if (style.PaintBottomBorder && cornerBottomLeft != eCornerType.Square) { if (cornerBottomLeft == eCornerType.Diagonal) { p[0].X = bounds.X; p[0].Y = bounds.Bottom - style.CornerDiameter; p[1].X = bounds.X + style.CornerDiameter; p[1].Y = bounds.Bottom; ElementStyleDisplay.DrawBorderLine(e.Graphics, p, style.BorderLeft, style.BorderLeftWidth, color, colorEnd, colorLightStart, colorLightEnd, eBorderSide.BottomLeft, borderDrawInfo); } else if (cornerBottomLeft == eCornerType.Rounded) { ArcData a = GetCornerArc(bounds, style.CornerDiameter, eCornerArc.BottomLeft); // new ArcData(bounds.X,bounds.Y,style.CornerDiameter*2,style.CornerDiameter*2,180,90); ElementStyleDisplay.DrawCornerArc(e.Graphics, a, style.BorderLeft, style.BorderLeftWidth, color); } } } if (style.PaintTopBorder) { Color color = style.BorderColor; if (!style.BorderTopColor.IsEmpty) color = style.BorderTopColor; Point[] p = new Point[2]; // Default setting for Square corner type on both sides p[0] = bounds.Location; p[1].X = bounds.Right; p[1].Y = bounds.Y; if (cornerTopLeft != eCornerType.Square) { p[0].X += style.CornerDiameter; } if (cornerTopRight != eCornerType.Square) { p[1].X -= style.CornerDiameter; } ElementStyleDisplay.DrawBorderLine(e.Graphics, p, style.BorderTop, style.BorderTopWidth, color, colorEnd, colorLightStart, colorLightEnd, eBorderSide.Top, borderDrawInfo); } if (style.PaintBottomBorder) { Color color = style.BorderColor; if (!style.BorderBottomColor.IsEmpty) color = style.BorderBottomColor; Point[] p = new Point[2]; // Default for Square corner type on both sides p[0].X = bounds.X; p[0].Y = bounds.Bottom; p[1].X = bounds.Right; p[1].Y = bounds.Bottom; if (cornerBottomLeft != eCornerType.Square) { p[0].X += style.CornerDiameter; } if (cornerBottomRight != eCornerType.Square) { p[1].X -= style.CornerDiameter; } ElementStyleDisplay.DrawBorderLine(e.Graphics, p, style.BorderBottom, style.BorderBottomWidth, color, colorEnd, colorLightStart, colorLightEnd, eBorderSide.Bottom, borderDrawInfo); } if (style.PaintRightBorder) { Color color = style.BorderColor; if (!style.BorderRightColor.IsEmpty) color = style.BorderRightColor; Point[] p = new Point[2]; // Default for Square corner type on both sides p[0].X = bounds.Right; p[0].Y = bounds.Y; p[1].X = bounds.Right; p[1].Y = bounds.Bottom; if (cornerTopRight != eCornerType.Square) { p[0].Y += style.CornerDiameter; } if (cornerBottomRight != eCornerType.Square) { p[1].Y -= style.CornerDiameter; } ElementStyleDisplay.DrawBorderLine(e.Graphics, p, style.BorderRight, style.BorderRightWidth, color, colorEnd, colorLightStart, colorLightEnd, eBorderSide.Right, borderDrawInfo); if (style.PaintTopBorder && cornerTopRight != eCornerType.Square) { if (cornerTopRight == eCornerType.Diagonal) { p[0].X = bounds.Right - style.CornerDiameter; p[0].Y = bounds.Y; p[1].X = bounds.Right; p[1].Y = bounds.Y + style.CornerDiameter; ElementStyleDisplay.DrawBorderLine(e.Graphics, p, style.BorderLeft, style.BorderRightWidth, color, colorEnd, colorLightStart, colorLightEnd, eBorderSide.TopRight, borderDrawInfo); } else if (cornerTopRight == eCornerType.Rounded) { ArcData a = GetCornerArc(bounds, style.CornerDiameter, eCornerArc.TopRight); // new ArcData(bounds.X,bounds.Y,style.CornerDiameter*2,style.CornerDiameter*2,180,90); ElementStyleDisplay.DrawCornerArc(e.Graphics, a, style.BorderLeft, style.BorderLeftWidth, color); } } if (style.PaintBottomBorder && cornerBottomRight != eCornerType.Square) { if (cornerBottomRight == eCornerType.Diagonal) { p[0].X = bounds.Right; p[0].Y = bounds.Bottom - style.CornerDiameter; p[1].X = bounds.Right - style.CornerDiameter; p[1].Y = bounds.Bottom; ElementStyleDisplay.DrawBorderLine(e.Graphics, p, style.BorderLeft, style.BorderRightWidth, color, colorEnd, colorLightStart, colorLightEnd, eBorderSide.BottomRight, borderDrawInfo); } else if (cornerBottomRight == eCornerType.Rounded) { ArcData a = GetCornerArc(bounds, style.CornerDiameter, eCornerArc.BottomRight); // new ArcData(bounds.X,bounds.Y,style.CornerDiameter*2,style.CornerDiameter*2,180,90); ElementStyleDisplay.DrawCornerArc(e.Graphics, a, style.BorderLeft, style.BorderLeftWidth, color); } } } } finally { if (disposeStyle) style.Dispose(); } } private static Pen CreatePen(eStyleBorderType border, int lineWidth, Color color) { Pen pen = new Pen(color, lineWidth); pen.Alignment = PenAlignment.Inset; pen.DashStyle = ElementStyleDisplay.GetDashStyle(border); return pen; } private static void DrawBorderLine(Graphics g, Point[] p, eStyleBorderType border, int lineWidth, Color colorStart, Color colorEnd, Color colorLightStart, Color colorLightEnd, eBorderSide side, BorderDrawInfo drawInfo) { if (border == eStyleBorderType.Etched || border == eStyleBorderType.Double) { if (colorLightStart.IsEmpty) { colorLightStart = System.Windows.Forms.ControlPaint.Light(colorStart); colorStart = System.Windows.Forms.ControlPaint.Dark(colorStart); } if (drawInfo.IsTwistedDoubleBorder && (side == eBorderSide.Bottom || side == eBorderSide.Right)) { Color ct1 = colorStart; Color ct2 = colorEnd; colorStart = colorLightStart; colorEnd = colorLightEnd; colorLightStart = ct1; colorLightEnd = ct2; } DisplayHelp.DrawGradientLine(g, p[0], p[1], colorStart, colorEnd, 90, lineWidth); if (side == eBorderSide.Top) { p[0].Y += lineWidth; p[1].Y += lineWidth; if (drawInfo.HasLeftBorder) p[0].X += 1; if (drawInfo.HasRightBorder) p[1].X -= 1; } else if (side == eBorderSide.Bottom) { p[0].Y -= lineWidth; p[1].Y -= lineWidth; if (!drawInfo.IsTwistedDoubleBorder) { if (drawInfo.HasLeftBorder) p[0].X += 1; if (drawInfo.HasRightBorder) p[1].X -= 1; } } else if (side == eBorderSide.Left || side == eBorderSide.BottomLeft || side == eBorderSide.TopLeft) { p[0].X += lineWidth; p[1].X += lineWidth; if (drawInfo.HasTopBorder) p[0].Y += 1; if (drawInfo.HasBottomBorder) p[1].Y -= 1; } else if (side == eBorderSide.Right || side == eBorderSide.BottomRight || side == eBorderSide.TopRight) { p[0].X -= lineWidth; p[1].X -= lineWidth; if (!drawInfo.IsTwistedDoubleBorder) { if (drawInfo.HasTopBorder) p[0].Y += 1; if (drawInfo.HasBottomBorder) p[1].Y -= 1; } } DisplayHelp.DrawGradientLine(g, p[0], p[1], colorLightStart, colorLightEnd, 90, lineWidth); } else { if (colorEnd.IsEmpty) { SmoothingMode sm = g.SmoothingMode; g.SmoothingMode = SmoothingMode.None; using (Pen pen = CreatePen(border, lineWidth, colorStart)) g.DrawLine(pen, p[0], p[1]); g.SmoothingMode = sm; } else DisplayHelp.DrawGradientLine(g, p[0], p[1], colorStart, colorEnd, 90, lineWidth); } } private static void DrawCornerArc(Graphics g, ArcData arc, eStyleBorderType border, int lineWidth, Color color) { SmoothingMode sm = g.SmoothingMode; if (sm == SmoothingMode.None) g.SmoothingMode = SmoothingMode.HighQuality; using (Pen pen = CreatePen(border, lineWidth, color)) { g.DrawArc(pen, arc.X, arc.Y, arc.Width, arc.Height, arc.StartAngle, arc.SweepAngle); } if (sm == SmoothingMode.None) g.SmoothingMode = sm; } private static DashStyle GetDashStyle(eStyleBorderType border) { DashStyle style = DashStyle.Solid; switch (border) { case eStyleBorderType.Dash: style = DashStyle.Dash; break; case eStyleBorderType.DashDot: style = DashStyle.DashDot; break; case eStyleBorderType.DashDotDot: style = DashStyle.DashDotDot; break; case eStyleBorderType.Dot: style = DashStyle.Dot; break; } return style; } internal static ElementStyle GetElementStyle(ElementStyle style, out bool dispose) { dispose = false; if (style.Class == "") return style; IElementStyleClassProvider provider = GetIElementStyleClassProvider(); if (provider != null) { ElementStyle baseStyle = provider.GetClass(style.Class); if (baseStyle != null) { if (style.Custom) { ElementStyle copy = baseStyle.Copy(); copy.ApplyStyle(style); dispose = true; return copy; } return baseStyle; } } return style; } private static IElementStyleClassProvider GetIElementStyleClassProvider() { #if DOTNETBAR if (Rendering.GlobalManager.Renderer is Rendering.Office2007Renderer) { return ((Rendering.Office2007Renderer)Rendering.GlobalManager.Renderer).ColorTable as IElementStyleClassProvider; } #endif return null; } /// /// Paints style background. /// /// Style display information. public static void PaintBackground(ElementStyleDisplayInfo e) { PaintBackground(e, true); } /// /// Paints style background. /// /// Style display information. public static void PaintBackground(ElementStyleDisplayInfo e, bool shapeBackground) { Region oldClip = e.Graphics.Clip; if (oldClip != null) e.Graphics.SetClip(e.Bounds, CombineMode.Intersect); else e.Graphics.SetClip(e.Bounds, CombineMode.Replace); bool disposeStyle = false; ElementStyle style = GetElementStyle(e.Style, out disposeStyle); SmoothingMode sm = e.Graphics.SmoothingMode; e.Graphics.SmoothingMode = SmoothingMode.Default; // Paint Background Rectangle bounds = DisplayHelp.GetDrawRectangle(ElementStyleDisplay.GetBackgroundRectangle(style, e.Bounds)); GraphicsPath path = null; if (shapeBackground && !IsSquareCornerType(style)) { path = ElementStyleDisplay.GetBackgroundPath(style, GetBorderRectangle(e.Style, e.Bounds)); } else { path = new GraphicsPath(); path.AddRectangle(ElementStyleDisplay.GetBackgroundRectangle(style, e.Bounds)); } eBackgroundColorBlendType blendType = style.BackColorBlend.GetBlendType(); if (blendType != eBackgroundColorBlendType.Invalid) { if (blendType == eBackgroundColorBlendType.Relative) { try { if (style.BackColorGradientType == eGradientType.Linear) { Rectangle rb = bounds; rb.Inflate(1, 1); using (LinearGradientBrush brush = DisplayHelp.CreateLinearGradientBrush(rb, style.BackColor, style.BackColor2, style.BackColorGradientAngle)) { brush.InterpolationColors = style.BackColorBlend.GetColorBlend(); e.Graphics.FillPath(brush, path); } } else if (style.BackColorGradientType == eGradientType.Radial) { int d = (int)Math.Sqrt(bounds.Width * bounds.Width + bounds.Height * bounds.Height) + 4; GraphicsPath fillPath = new GraphicsPath(); fillPath.AddEllipse(bounds.X - (d - bounds.Width) / 2, bounds.Y - (d - bounds.Height) / 2, d, d); using (PathGradientBrush brush = new PathGradientBrush(fillPath)) { brush.CenterColor = style.BackColor; brush.SurroundColors = new Color[] { style.BackColor2 }; brush.InterpolationColors = style.BackColorBlend.GetColorBlend(); e.Graphics.FillPath(brush, path); } fillPath.Dispose(); } } catch { blendType = eBackgroundColorBlendType.Invalid; } } else { Graphics g = e.Graphics; bounds = e.Bounds; if (oldClip != null) { e.Graphics.SetClip(oldClip, CombineMode.Replace); e.Graphics.SetClip(path, CombineMode.Intersect); } else e.Graphics.SetClip(path, CombineMode.Replace); BackgroundColorBlendCollection bc = style.BackColorBlend; for (int i = 0; i < bc.Count; i += 2) { BackgroundColorBlend b1 = bc[i]; BackgroundColorBlend b2 = null; if (i + 1 < bc.Count) b2 = bc[i + 1]; if (b1 != null && b2 != null) { Rectangle rb = new Rectangle(bounds.X, bounds.Y + (int)b1.Position, bounds.Width, (b2.Position == 1f ? bounds.Height : (int)b2.Position) - (int)b1.Position); using (LinearGradientBrush brush = DisplayHelp.CreateLinearGradientBrush(rb, b1.Color, b2.Color, style.BackColorGradientAngle)) g.FillRectangle(brush, rb); } } } } if (blendType == eBackgroundColorBlendType.Invalid) { if (style.BackColor2.IsEmpty) { if (!style.BackColor.IsEmpty) { using (SolidBrush brush = new SolidBrush(style.BackColor)) e.Graphics.FillPath(brush, path); //if(e.Style.BackColor.A==255) //{ // // Correct problems with FillPath where path was not filled properly... // using(Pen pen=new Pen(e.Style.BackColor,1)) // e.Graphics.DrawPath(pen,path); //} } } else if (!style.BackColor.IsEmpty) { if (style.BackColorGradientType == eGradientType.Linear) { Rectangle rb = bounds; rb.X--; rb.Height++; rb.Width += 2; using (LinearGradientBrush brush = DisplayHelp.CreateLinearGradientBrush(rb, style.BackColor, style.BackColor2, style.BackColorGradientAngle)) { e.Graphics.FillPath(brush, path); } } else if (style.BackColorGradientType == eGradientType.Radial) { int d = (int)Math.Sqrt(bounds.Width * bounds.Width + bounds.Height * bounds.Height) + 4; GraphicsPath fillPath = new GraphicsPath(); fillPath.AddEllipse(bounds.X - (d - bounds.Width) / 2, bounds.Y - (d - bounds.Height) / 2, d, d); using (PathGradientBrush brush = new PathGradientBrush(fillPath)) { brush.CenterColor = style.BackColor; brush.SurroundColors = new Color[] { style.BackColor2 }; e.Graphics.FillPath(brush, path); } fillPath.Dispose(); } } } if (path != null) path.Dispose(); e.Graphics.SmoothingMode = sm; if (oldClip != null) { e.Graphics.Clip = oldClip; oldClip.Dispose(); oldClip = null; } else e.Graphics.ResetClip(); if (disposeStyle) style.Dispose(); } private static bool IsSquareCornerType(ElementStyle style) { return (style.CornerType == eCornerType.Square || style.CornerType == eCornerType.Inherit) && (style.CornerTypeTopLeft == eCornerType.Square || style.CornerTypeTopLeft == eCornerType.Inherit) && (style.CornerTypeTopRight == eCornerType.Square || style.CornerTypeTopRight == eCornerType.Inherit); } /// /// Paints style background image. /// /// Style display information. public static void PaintBackgroundImage(ElementStyleDisplayInfo e) { bool disposeStyle = false; ElementStyle style = GetElementStyle(e.Style, out disposeStyle); GraphicsPath path = null; try { if (style.BackgroundImage == null) return; Rectangle bounds = ElementStyleDisplay.GetBackgroundRectangle(style, e.Bounds); if (e.Graphics.SmoothingMode == SmoothingMode.AntiAlias) { Rectangle r = e.Bounds; //r.Width--; //r.Height--; path = ElementStyleDisplay.GetBackgroundPath(style, r); } else path = ElementStyleDisplay.GetBackgroundPath(style, e.Bounds); ImageAttributes imageAtt = null; if (style.BackgroundImageAlpha != 255) { //ColorMatrix colorMatrix = new ColorMatrix(); //colorMatrix.Matrix33 = 255 - style.BackgroundImageAlpha; float[][] matrixItems ={ new float[] {1, 0, 0, 0, 0}, new float[] {0, 1, 0, 0, 0}, new float[] {0, 0, 1, 0, 0}, new float[] {0, 0, 0, (float)style.BackgroundImageAlpha/255, 0}, new float[] {0, 0, 0, 0, 1}}; System.Drawing.Imaging.ColorMatrix colorMatrix = new System.Drawing.Imaging.ColorMatrix(matrixItems); imageAtt = new ImageAttributes(); imageAtt.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); } Region clip = e.Graphics.Clip; e.Graphics.SetClip(path, CombineMode.Intersect); eStyleBackgroundImage imagePosition = style.BackgroundImagePosition; bool transform = false; Image backgroundImage = style.BackgroundImage; if (e.RightToLeft) { if (imagePosition == eStyleBackgroundImage.TopLeft) { imagePosition = eStyleBackgroundImage.TopRight; transform = true; } else if (imagePosition == eStyleBackgroundImage.TopRight) imagePosition = eStyleBackgroundImage.TopLeft; else if (imagePosition == eStyleBackgroundImage.BottomLeft) imagePosition = eStyleBackgroundImage.BottomRight; else if (imagePosition == eStyleBackgroundImage.BottomRight) imagePosition = eStyleBackgroundImage.BottomLeft; } if (transform) { backgroundImage = backgroundImage.Clone() as Image; backgroundImage.RotateFlip(RotateFlipType.RotateNoneFlipX); } switch (imagePosition) { case eStyleBackgroundImage.Stretch: { if (imageAtt != null) e.Graphics.DrawImage(backgroundImage, bounds, 0, 0, backgroundImage.Width, backgroundImage.Height, GraphicsUnit.Pixel, imageAtt); else e.Graphics.DrawImage(backgroundImage, bounds, 0, 0, backgroundImage.Width, backgroundImage.Height, GraphicsUnit.Pixel); break; } case eStyleBackgroundImage.Zoom: { Size backImageSize = backgroundImage.Size; Rectangle newImageBounds = Rectangle.Empty; float horizontalRatio = ((float)bounds.Width) / ((float)backImageSize.Width); float verticalRatio = ((float)bounds.Height) / ((float)backImageSize.Height); if (horizontalRatio >= verticalRatio) { newImageBounds.Height = bounds.Height; newImageBounds.Width = (int)((backImageSize.Width * verticalRatio) + 0.5); if (bounds.X >= 0) { newImageBounds.X = (bounds.Width - newImageBounds.Width) / 2; } } else { newImageBounds.Width = bounds.Width; newImageBounds.Height = (int)((backImageSize.Height * horizontalRatio) + 0.5); if (bounds.Y >= 0) { newImageBounds.Y = (bounds.Height - newImageBounds.Height) / 2; } } bounds = newImageBounds; if (imageAtt != null) { e.Graphics.DrawImage(backgroundImage, bounds, 0, 0, backgroundImage.Width, backgroundImage.Height, GraphicsUnit.Pixel, imageAtt); } else e.Graphics.DrawImage(backgroundImage, bounds, 0, 0, backgroundImage.Width, backgroundImage.Height, GraphicsUnit.Pixel); break; } case eStyleBackgroundImage.Center: { Rectangle destRect = new Rectangle(bounds.X, bounds.Y, Dpi.Width(backgroundImage.Width), Dpi.Height(backgroundImage.Height)); if (bounds.Width > destRect.Width) destRect.X += (bounds.Width - destRect.Width) / 2; if (bounds.Height > destRect.Height) destRect.Y += (bounds.Height - destRect.Height) / 2; if (imageAtt != null) e.Graphics.DrawImage(backgroundImage, destRect, 0, 0, backgroundImage.Width, backgroundImage.Height, GraphicsUnit.Pixel, imageAtt); else e.Graphics.DrawImage(backgroundImage, destRect, 0, 0, backgroundImage.Width, backgroundImage.Height, GraphicsUnit.Pixel); break; } case eStyleBackgroundImage.TopLeft: case eStyleBackgroundImage.TopRight: case eStyleBackgroundImage.BottomLeft: case eStyleBackgroundImage.BottomRight: { Rectangle destRect = new Rectangle(bounds.X, bounds.Y, Dpi.Width(backgroundImage.Width), Dpi.Height(backgroundImage.Height)); if (imagePosition == eStyleBackgroundImage.TopRight) destRect.X = bounds.Right - destRect.Width; else if (imagePosition == eStyleBackgroundImage.BottomLeft) destRect.Y = bounds.Bottom - destRect.Height; else if (imagePosition == eStyleBackgroundImage.BottomRight) { destRect.Y = bounds.Bottom - destRect.Height; destRect.X = bounds.Right - destRect.Width; } if (imageAtt != null) e.Graphics.DrawImage(backgroundImage, destRect, 0, 0, backgroundImage.Width, backgroundImage.Height, GraphicsUnit.Pixel, imageAtt); else e.Graphics.DrawImage(backgroundImage, destRect, 0, 0, backgroundImage.Width, backgroundImage.Height, GraphicsUnit.Pixel); break; } case eStyleBackgroundImage.Tile: { if (imageAtt != null) { if (bounds.Width > backgroundImage.Width || bounds.Height > backgroundImage.Height) { int x = bounds.X, y = bounds.Y; while (y < bounds.Bottom) { while (x < bounds.Right) { Rectangle destRect = new Rectangle(x, y, Dpi.Width(backgroundImage.Width), Dpi.Height(backgroundImage.Height)); if (destRect.Right > bounds.Right) destRect.Width = destRect.Width - (destRect.Right - bounds.Right); if (destRect.Bottom > bounds.Bottom) destRect.Height = destRect.Height - (destRect.Bottom - bounds.Bottom); e.Graphics.DrawImage(backgroundImage, destRect, 0, 0, destRect.Width, destRect.Height, GraphicsUnit.Pixel, imageAtt); x += Dpi.Width(backgroundImage.Width); } x = bounds.X; y += Dpi.Height(backgroundImage.Height); } } else { e.Graphics.DrawImage(backgroundImage, new Rectangle(0, 0, Dpi.Width(backgroundImage.Width), Dpi.Height(backgroundImage.Height)), 0, 0, backgroundImage.Width, backgroundImage.Height, GraphicsUnit.Pixel, imageAtt); } } else { TextureBrush brush = new TextureBrush(backgroundImage); brush.WrapMode = WrapMode.Tile; e.Graphics.FillPath(brush, path); brush.Dispose(); } break; } } if (transform) { backgroundImage.Dispose(); } if (clip != null) { e.Graphics.Clip = clip; clip.Dispose(); } else e.Graphics.ResetClip(); } finally { if (path != null) path.Dispose(); if (disposeStyle) style.Dispose(); } } /// /// Returns background rectangle for given style by taking in account margins. /// /// Reference to style object. /// Style bounds /// Background rectangle. public static Rectangle GetBackgroundRectangle(ElementStyle style, Rectangle bounds) { // Reduce the bounds rectangle size by the margin size bounds.X += style.MarginLeft; bounds.Width -= (style.MarginLeft + style.MarginRight); bounds.Y += style.MarginTop; bounds.Height -= (style.MarginTop + style.MarginBottom); return bounds; } private static Rectangle GetBorderRectangle(ElementStyle style, Rectangle bounds) { if (style.PaintRightBorder) { if (style.BorderRightWidth <= 1) bounds.Width -= style.BorderRightWidth; else bounds.Width -= style.BorderRightWidth / 2; } if (style.PaintBottomBorder) { if (style.BorderBottomWidth <= 1) bounds.Height -= style.BorderBottomWidth; else bounds.Height -= style.BorderBottomWidth / 2; } if (style.PaintLeftBorder && style.BorderLeftWidth > 1) { bounds.X += style.BorderLeftWidth / 2; bounds.Width -= style.BorderLeftWidth / 2; } if (style.PaintTopBorder && style.BorderTopWidth > 1) { bounds.Y += style.BorderTopWidth / 2; bounds.Height -= style.BorderTopWidth / 2; } return bounds; } private static Rectangle GetTextRectangle(ElementStyle style, Rectangle bounds) { bounds = ElementStyleDisplay.GetBackgroundRectangle(style, bounds); // Reduce the bounds rectangle size by the padding size bounds.X += style.PaddingLeft; bounds.Width -= (style.PaddingLeft + style.PaddingRight); bounds.Y += style.PaddingTop; bounds.Height -= (style.PaddingTop + style.PaddingBottom); return bounds; } /// /// Returns GraphicsPath for given style. /// /// Reference to style. /// Style bounds. /// New instance of GraphicsPath public static GraphicsPath GetBackgroundPath(ElementStyle style, Rectangle bounds) { return GetBackgroundPath(style, bounds, eStyleBackgroundPathPart.Complete); } /// /// Returns GraphicsPath for given style. /// /// Reference to style. /// Style bounds. /// New instance of GraphicsPath public static GraphicsPath GetBackgroundPath(ElementStyle style, Rectangle bounds, eStyleBackgroundPathPart pathPart) { GraphicsPath path = new GraphicsPath(); Rectangle clientRectangle; //if(drawPath) clientRectangle =/*DisplayHelp.GetDrawRectangle*/(ElementStyleDisplay.GetBackgroundRectangle(style, bounds)); //else // clientRectangle =/*DisplayHelp.GetDrawRectangle*/(ElementStyleDisplay.GetBackgroundRectangle(style, bounds)); if (pathPart == eStyleBackgroundPathPart.Complete && style.CornerTypeBottomLeft == eCornerType.Inherit && style.CornerTypeBottomRight == eCornerType.Inherit && style.CornerTypeTopLeft == eCornerType.Inherit && style.CornerTypeTopRight == eCornerType.Inherit) { switch (style.CornerType) { case eCornerType.Square: { path.AddRectangle(clientRectangle); break; } case eCornerType.Rounded: { ArcData ad = GetCornerArc(clientRectangle, style.CornerDiameter, eCornerArc.TopLeft); path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle); ad = GetCornerArc(clientRectangle, style.CornerDiameter, eCornerArc.TopRight); path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle); ad = GetCornerArc(clientRectangle, style.CornerDiameter, eCornerArc.BottomRight); path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle); ad = GetCornerArc(clientRectangle, style.CornerDiameter, eCornerArc.BottomLeft); path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle); path.CloseAllFigures(); break; } case eCornerType.Diagonal: { path.AddLine(clientRectangle.X, clientRectangle.Bottom - style.CornerDiameter - 1, clientRectangle.X, clientRectangle.Y + style.CornerDiameter); path.AddLine(clientRectangle.X + style.CornerDiameter, clientRectangle.Y, clientRectangle.Right - style.CornerDiameter, clientRectangle.Y); path.AddLine(clientRectangle.Right, clientRectangle.Y + style.CornerDiameter, clientRectangle.Right, clientRectangle.Bottom - style.CornerDiameter - 1); path.AddLine(clientRectangle.Right - style.CornerDiameter - 1, clientRectangle.Bottom, clientRectangle.X + style.CornerDiameter, clientRectangle.Bottom); path.CloseAllFigures(); break; } } } else { if (pathPart == eStyleBackgroundPathPart.TopHalf) clientRectangle.Height = clientRectangle.Height / 2; else if (pathPart == eStyleBackgroundPathPart.BottomHalf) { int h = clientRectangle.Height; clientRectangle.Height = clientRectangle.Height / 2; clientRectangle.Y += (h - clientRectangle.Height - 1); } eCornerType corner = style.CornerTypeTopLeft; if (corner == eCornerType.Inherit) corner = style.CornerType; if (pathPart == eStyleBackgroundPathPart.BottomHalf) corner = eCornerType.Square; if (corner == eCornerType.Rounded) { ArcData ad = GetCornerArc(clientRectangle, style.CornerDiameter, eCornerArc.TopLeft); path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle); } else if (corner == eCornerType.Diagonal) { path.AddLine(clientRectangle.X, clientRectangle.Y + style.CornerDiameter, clientRectangle.X + style.CornerDiameter, clientRectangle.Y); } else { path.AddLine(clientRectangle.X, clientRectangle.Y + 2, clientRectangle.X, clientRectangle.Y); path.AddLine(clientRectangle.X, clientRectangle.Y, clientRectangle.X + 2, clientRectangle.Y); } corner = style.CornerTypeTopRight; if (corner == eCornerType.Inherit) corner = style.CornerType; if (pathPart == eStyleBackgroundPathPart.BottomHalf) corner = eCornerType.Square; if (corner == eCornerType.Rounded) { ArcData ad = GetCornerArc(clientRectangle, style.CornerDiameter, eCornerArc.TopRight); path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle); } else if (corner == eCornerType.Diagonal) { path.AddLine(clientRectangle.Right - style.CornerDiameter - 1, clientRectangle.Y, clientRectangle.Right, clientRectangle.Y + style.CornerDiameter); } else { path.AddLine(clientRectangle.Right - 2, clientRectangle.Y, clientRectangle.Right, clientRectangle.Y); path.AddLine(clientRectangle.Right, clientRectangle.Y, clientRectangle.Right, clientRectangle.Y + 2); } corner = style.CornerTypeBottomRight; if (corner == eCornerType.Inherit) corner = style.CornerType; if (pathPart == eStyleBackgroundPathPart.TopHalf) corner = eCornerType.Square; if (corner == eCornerType.Rounded) { ArcData ad = GetCornerArc(clientRectangle, style.CornerDiameter, eCornerArc.BottomRight); path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle); } else if (corner == eCornerType.Diagonal) { path.AddLine(clientRectangle.Right, clientRectangle.Bottom - style.CornerDiameter - 1, clientRectangle.Right - style.CornerDiameter - 1, clientRectangle.Bottom); } else { path.AddLine(clientRectangle.Right, clientRectangle.Bottom - 2, clientRectangle.Right, clientRectangle.Bottom); path.AddLine(clientRectangle.Right, clientRectangle.Bottom, clientRectangle.Right - 2, clientRectangle.Bottom); } corner = style.CornerTypeBottomLeft; if (corner == eCornerType.Inherit) corner = style.CornerType; if (pathPart == eStyleBackgroundPathPart.TopHalf) corner = eCornerType.Square; if (corner == eCornerType.Rounded) { ArcData ad = GetCornerArc(clientRectangle, style.CornerDiameter, eCornerArc.BottomLeft); path.AddArc(ad.X, ad.Y, ad.Width, ad.Height, ad.StartAngle, ad.SweepAngle); } else if (corner == eCornerType.Diagonal) { path.AddLine(clientRectangle.X + 2, clientRectangle.Bottom, clientRectangle.X, clientRectangle.Bottom - style.CornerDiameter - 1); } else { path.AddLine(clientRectangle.X + 2, clientRectangle.Bottom, clientRectangle.X, clientRectangle.Bottom); path.AddLine(clientRectangle.X, clientRectangle.Bottom, clientRectangle.X, clientRectangle.Bottom - 2); } } return path; } public static void AddCornerArc(GraphicsPath path, Rectangle bounds, int cornerDiameter, eCornerArc corner) { if (cornerDiameter > 0) { ArcData a = GetCornerArc(bounds, cornerDiameter, corner); path.AddArc(a.X, a.Y, a.Width, a.Height, a.StartAngle, a.SweepAngle); } else { if (corner == eCornerArc.TopLeft) { path.AddLine(bounds.X, bounds.Y + 2, bounds.X, bounds.Y); } else if (corner == eCornerArc.BottomLeft) { path.AddLine(bounds.X + 2, bounds.Bottom, bounds.X, bounds.Bottom); } else if (corner == eCornerArc.TopRight) { path.AddLine(bounds.Right - 2, bounds.Y, bounds.Right, bounds.Y); } else if (corner == eCornerArc.BottomRight) { path.AddLine(bounds.Right, bounds.Bottom - 2, bounds.Right, bounds.Bottom); } } } internal static ArcData GetCornerArc(Rectangle bounds, int cornerDiameter, eCornerArc corner) { ArcData a; if (cornerDiameter == 0) cornerDiameter = 1; int diameter = cornerDiameter * 2; switch (corner) { case eCornerArc.TopLeft: a = new ArcData(bounds.X, bounds.Y, diameter, diameter, 180, 90); break; case eCornerArc.TopRight: a = new ArcData(bounds.Right - diameter, bounds.Y, diameter, diameter, 270, 90); break; case eCornerArc.BottomLeft: a = new ArcData(bounds.X, bounds.Bottom - diameter, diameter, diameter, 90, 90); break; default: // eCornerArc.BottomRight: a = new ArcData(bounds.Right - diameter, bounds.Bottom - diameter, diameter, diameter, 0, 90); break; } return a; } enum eBorderSide { Top, Bottom, Left, Right, TopLeft, TopRight, BottomLeft, BottomRight } internal struct BorderDrawInfo { public bool HasLeftBorder; public bool HasRightBorder; public bool HasTopBorder; public bool HasBottomBorder; public bool IsTwistedDoubleBorder; /// /// Initializes a new instance of the BorderDrawInfo structure. /// /// /// /// /// /// public BorderDrawInfo(bool hasLeftBorder, bool hasRightBorder, bool hasTopBorder, bool hasBottomBorder, bool isTwistedDoubleBorder) { HasLeftBorder = hasLeftBorder; HasRightBorder = hasRightBorder; HasTopBorder = hasTopBorder; HasBottomBorder = hasBottomBorder; IsTwistedDoubleBorder = isTwistedDoubleBorder; } } } public enum eCornerArc { TopLeft, TopRight, BottomLeft, BottomRight } /// /// Represents information necessary to paint the style on canvas. /// public class ElementStyleDisplayInfo { /// Reference to ElementStyle object. public ElementStyle Style = null; /// Reference to Graphics object. public Graphics Graphics = null; /// ElementStyle bounds. public Rectangle Bounds = Rectangle.Empty; /// Get or sets whether layout is right-to-left. public bool RightToLeft = false; /// /// Gets or sets whether bottom and right border is "twisted" giving beveled look when double border is used. /// public bool IsTwistedDoubleBorder = false; /// Creates new instance of the object. public ElementStyleDisplayInfo() { } /// Creates new instance of the object and initializes it with default values. /// Style to initialize object with. /// Graphics object to initialize object with. /// Bounds to initialize object with. public ElementStyleDisplayInfo(ElementStyle style, Graphics g, Rectangle bounds) { this.Style = style; this.Graphics = g; this.Bounds = bounds; } /// Creates new instance of the object and initializes it with default values. /// Style to initialize object with. /// Graphics object to initialize object with. /// Bounds to initialize object with. public ElementStyleDisplayInfo(ElementStyle style, Graphics g, Rectangle bounds, bool isTwistedDoubleBorder) { this.Style = style; this.Graphics = g; this.Bounds = bounds; this.IsTwistedDoubleBorder = isTwistedDoubleBorder; } } #region eStyleBackgroundPathPart /// /// Specifies part of the background path. /// public enum eStyleBackgroundPathPart { /// /// Indicates complete background path /// Complete, /// /// Indicates Top half of background path /// TopHalf, /// /// Indicates Bottom half of background path /// BottomHalf } #endregion #region ArcData internal struct ArcData { public int X; public int Y; public int Width; public int Height; public float StartAngle; public float SweepAngle; public ArcData(int x, int y, int width, int height, float startAngle, float sweepAngle) { this.X = x; this.Y = y; this.Width = width; this.Height = height; this.StartAngle = startAngle; this.SweepAngle = sweepAngle; } } #endregion }