using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using FastReport.Utils; namespace FastReport.Gauge.Linear { /// /// Represents a linear pointer. /// #if !DEBUG [DesignTimeVisible(false)] #endif public class LinearPointer : GaugePointer { #region Fields private float left; private float top; private float height; private float width; #endregion // Fields #region Properties /// /// Gets o sets the height of gauge pointer. /// [Browsable(false)] public float Height { get { return height; } set { height = value; } } /// /// Gets or sets the width of a pointer. /// [Browsable(false)] public float Width { get { return width; } set { width = value; } } #endregion // Properties #region Constructors /// /// Initializes a new instance of the /// /// The parent gauge object. public LinearPointer(GaugeObject parent) : base(parent) { height = 4.0f; width = 8.0f; } #endregion // Constructors #region Private Methods private void DrawHorz(FRPaintEventArgs e) { IGraphics g = e.Graphics; Pen pen = e.Cache.GetPen(BorderColor, BorderWidth * e.ScaleX, DashStyle.Solid); left = (float)(Parent.AbsLeft + 0.5f * Units.Centimeters + (Parent.Width - 1.0f * Units.Centimeters) * (Parent.Value - Parent.Minimum) / (Parent.Maximum - Parent.Minimum)) * e.ScaleX; top = (Parent.AbsTop + Parent.Height / 2) * e.ScaleY; height = Parent.Height * 0.4f * e.ScaleY; width = Parent.Width * 0.036f * e.ScaleX; float dx = width / 2; float dy = height * 0.3f; Brush brush = Fill.CreateBrush(new RectangleF(left - dx, top, width, height), e.ScaleX, e.ScaleY); PointF[] p = new PointF[] { new PointF(left, top), new PointF(left + dx, top + dy), new PointF(left + dx, top + height), new PointF(left - dx, top + height), new PointF(left - dx, top + dy) }; if ((Parent as LinearGauge).Inverted) { p[1].Y = top - dy; p[2].Y = top - height; p[3].Y = top - height; p[4].Y = top - dy; } GraphicsPath path = new GraphicsPath(); path.AddLines(p); path.AddLine(p[4], p[0]); g.FillAndDrawPath(pen, brush, path); } private void DrawVert(FRPaintEventArgs e) { IGraphics g = e.Graphics; Pen pen = e.Cache.GetPen(BorderColor, BorderWidth * e.ScaleX, DashStyle.Solid); left = (Parent.AbsLeft + Parent.Width / 2) * e.ScaleX; top = (float)(Parent.AbsTop + Parent.Height - 0.5f * Units.Centimeters - (Parent.Height - 1.0f * Units.Centimeters) * (Parent.Value - Parent.Minimum) / (Parent.Maximum - Parent.Minimum)) * e.ScaleY; height = Parent.Height * 0.036f * e.ScaleY; width = Parent.Width * 0.4f * e.ScaleX; float dx = width * 0.3f; float dy = height / 2; Brush brush = Fill.CreateBrush(new RectangleF(left, top - dy, width, height), e.ScaleX, e.ScaleY); PointF[] p = new PointF[] { new PointF(left, top), new PointF(left + dx, top - dy), new PointF(left + width, top - dy), new PointF(left + width, top + dy), new PointF(left + dx, top + dy) }; if ((Parent as LinearGauge).Inverted) { p[1].X = left - dx; p[2].X = left - width; p[3].X = left - width; p[4].X = left - dx; } GraphicsPath path = new GraphicsPath(); path.AddLines(p); path.AddLine(p[4], p[0]); g.FillAndDrawPath(pen, brush, path); } #endregion // Private Methods #region Public Methods /// public override void Assign(GaugePointer src) { base.Assign(src); LinearPointer s = src as LinearPointer; Height = s.Height; Width = s.Width; } /// public override void Draw(FRPaintEventArgs e) { base.Draw(e); if (Parent.Vertical) { DrawVert(e); } else { DrawHorz(e); } } /// public override void Serialize(FRWriter writer, string prefix, GaugePointer diff) { base.Serialize(writer, prefix, diff); LinearPointer dc = diff as LinearPointer; if (Height != dc.Height) { writer.WriteFloat(prefix + ".Height", Height); } if (Width != dc.Width) { writer.WriteFloat(prefix + ".Width", Width); } } #endregion // Public Methods } }