using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace DevComponents.Instrumentation.Primitives { public class KnobStyle1 : BaseKnob { /// /// Constructor /// /// Associated knob control public KnobStyle1(KnobControl knobControl) : base(knobControl) { } #region Knob Configuration #region ConfigureKnob /// /// Configures the given knob control /// by establishing various default object parameters /// /// public override void ConfigureKnob(PaintEventArgs e) { base.ConfigureKnob(e); // Calculate default sizes and bounding object rectangles ZoneIndWidth = 2; MajorTickSize = new Size((int)(KnobWidth * 0.015), (int)(KnobWidth * 0.017)); MinorTickSize = new Size(MajorTickSize.Width / 2, MajorTickSize.Height); IndTickHeight = (int)ZoneIndWidth; CalculateBoundingRects(); // Fill in the default knob colors DefaultColorTable.MajorTickColor = Color.Black; DefaultColorTable.MinorTickColor = Color.Black; DefaultColorTable.ZoneIndicatorColor = Color.Black; DefaultColorTable.KnobIndicatorPointerColor = Color.Gray; DefaultColorTable.KnobIndicatorPointerBorderColor = Color.Gray; DefaultColorTable.KnobFaceColor = new LinearGradientColorTable(Color.Black, Color.Gray, 40); DefaultColorTable.KnobIndicatorColor = new LinearGradientColorTable(Color.Gray, Color.White, 40); DefaultColorTable.MinZoneIndicatorColor = new LinearGradientColorTable(Color.White, Color.Green); DefaultColorTable.MaxZoneIndicatorColor = new LinearGradientColorTable(Color.Yellow, Color.Red); } #endregion #region CalculateBoundingRects /// /// Calculates several default control /// // bounding rectangles /// private void CalculateBoundingRects() { // Calculate the bounding Zone indicator rectangle and width int delta = MaxLabelWidth + MajorTickSize.Height + (int)(KnobWidth * 0.04f); ZoneIndicatorBounds = new Rectangle(delta, delta, KnobWidth - (delta * 2), KnobWidth - (delta * 2)); // Calculate the KnobFace and inset face rectangles delta += 1; KnobFaceBounds = new Rectangle(delta, delta, KnobWidth - (delta * 2), KnobWidth - (delta * 2)); // Calculate the KnobIndicator bounding rectangle delta += (int)(KnobWidth * .07f); KnobIndicatorBounds = new Rectangle(delta, delta, KnobWidth - (delta * 2), KnobWidth - (delta * 2)); // Calculate the TickLabel bounding rect delta = (int)((MaxLabelWidth + IndTickHeight) * .85f); TickLabelBounds = new Rectangle(ZoneIndicatorBounds.Location, ZoneIndicatorBounds.Size); TickLabelBounds.Inflate(delta, delta); // Calculate the focus rectangle FocusRectBounds = new Rectangle(KnobIndicatorBounds.Location, KnobIndicatorBounds.Size); delta = (int)(KnobIndicatorBounds.Width * .035); FocusRectBounds.Inflate(-delta, -delta); } #endregion #endregion #region Part rendering code #region RenderZoneIndicator /// /// Renders the zone indicator /// /// public override void RenderZoneIndicator(PaintEventArgs e) { if (ZoneIndicatorBounds.Width > 10 && ZoneIndicatorBounds.Height > 10) { Graphics g = e.Graphics; using (Pen pen = new Pen(ZoneIndicatorColor, 2)) g.DrawEllipse(pen, ZoneIndicatorBounds); } } #endregion #region RenderKnobFace /// /// Renders the knob face /// /// public override void RenderKnobFace(PaintEventArgs e) { if (KnobFaceBounds.Width > 10 && KnobFaceBounds.Height > 10) { Graphics g = e.Graphics; using (Brush br = KnobFaceColor.GetBrush(KnobFaceBounds)) g.FillEllipse(br, KnobFaceBounds); } } #endregion #region RenderKnobIndicator /// /// Renders the knob face /// /// public override void RenderKnobIndicator(PaintEventArgs e) { if (KnobIndicatorBounds.Width > 10 && KnobIndicatorBounds.Height > 10) { Graphics g = e.Graphics; // Render the Indicator shadow Rectangle r = new Rectangle(KnobIndicatorBounds.X, KnobIndicatorBounds.Y, KnobIndicatorBounds.Width, KnobIndicatorBounds.Height); int delta = (int) (KnobWidth * .025f); r.Offset(delta, delta); using (SolidBrush br = new SolidBrush(Color.FromArgb(160, KnobFaceColor.Start))) { g.FillEllipse(br, r); } r.Offset(-delta, -delta); // Render the indicator using (LinearGradientBrush br = new LinearGradientBrush(KnobIndicatorBounds, KnobIndicatorColor.End, KnobIndicatorColor.Start, -40f)) g.FillEllipse(br, KnobIndicatorBounds); delta = (int) (r.Width * .02f); r.Inflate(-delta, -delta); using (Brush br = KnobIndicatorColor.GetBrush(r)) g.FillEllipse(br, r); // Render the indicator dimple r = GetIndicatorRect(); delta = (int) (r.Width * .05f); r.Inflate(delta, delta); using (Brush lgb = new LinearGradientBrush(r, Color.White, KnobIndicatorPointerColor, -40f)) { g.FillEllipse(lgb, r); } r.Inflate(-delta, -delta); using (LinearGradientBrush lgb = new LinearGradientBrush(r, KnobIndicatorPointerColor, Color.White, 220f)) { g.FillEllipse(lgb, r); } } } /// /// Returns the knob indicator rectangle /// /// private Rectangle GetIndicatorRect() { float degrees = (float)(Knob.SweepAngle / ValueCount) * (float)(Knob.Value - Knob.MinValue) + Knob.StartAngle; double radians = GetRadians(degrees); int dx = KnobIndicatorBounds.X + KnobIndicatorBounds.Width / 2; int dy = KnobIndicatorBounds.Y + KnobIndicatorBounds.Height / 2; int h = (int)(KnobIndicatorBounds.Width * .3f); int x = (int)(Math.Cos(radians) * h + dx); int y = (int)(Math.Sin(radians) * h + dy); int radius = (int)(KnobIndicatorBounds.Width * .12f); Rectangle r = new Rectangle(x - radius, y - radius, radius * 2, radius * 2); return (r); } #endregion #endregion } }