361 lines
9.6 KiB
C#

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace DevComponents.Instrumentation
{
internal class GaugeFrameCircularRenderer : GaugeFrameRenderer
{
public GaugeFrameCircularRenderer(GaugeFrame gaugeFrame)
: base(gaugeFrame)
{
}
#region SetFrameRegion
internal override void SetFrameRegion()
{
if (GaugeFrame.GaugeControl != null)
{
using (GraphicsPath path = new GraphicsPath())
{
path.AddEllipse(GaugeFrame.Bounds);
GaugeFrame.GaugeControl.Region = new Region(path);
}
}
}
#endregion
#region SetBackClipRegion
internal override void SetBackClipRegion(PaintEventArgs e)
{
int inside = GaugeFrame.AbsBevelInside;
int outside = GaugeFrame.AbsBevelOutside;
Rectangle r = GaugeFrame.Bounds;
r.Inflate(-outside -inside, -outside -inside);
using (GraphicsPath path = new GraphicsPath())
{
path.AddEllipse(r);
e.Graphics.SetClip(path, CombineMode.Intersect);
}
}
#endregion
#region RenderFrame
#region RenderFrameByAngle
protected override void RenderFrameByAngle(PaintEventArgs e, Rectangle r)
{
Graphics g = e.Graphics;
Matrix myMatrix = new Matrix();
myMatrix.RotateAt(GaugeFrame.FrameColor.GradientAngle, GaugeFrame.Center);
e.Graphics.Transform = myMatrix;
using (Brush br = GaugeFrame.FrameColor.GetBrush(GaugeFrame.Bounds, 0))
g.FillEllipse(br, GaugeFrame.Bounds);
RenderFrameBorder(g);
using (Brush br = GaugeFrame.FrameColor.GetBrush(r, 180))
g.FillEllipse(br, r);
g.ResetTransform();
}
#endregion
#region RenderFrameByCenter
protected override void RenderFrameByCenter(PaintEventArgs e, Rectangle r)
{
Graphics g = e.Graphics;
using (GraphicsPath path = new GraphicsPath())
{
path.AddEllipse(GaugeFrame.Bounds);
using (PathGradientBrush br = new PathGradientBrush(path))
{
br.CenterPoint = GaugeFrame.Center;
br.CenterColor = GaugeFrame.FrameColor.Start;
br.SurroundColors = new Color[] { GaugeFrame.FrameColor.End };
br.SetSigmaBellShape(GaugeFrame.FrameSigmaFocus, GaugeFrame.FrameSigmaScale);
g.FillEllipse(br, GaugeFrame.Bounds);
}
path.AddEllipse(r);
using (PathGradientBrush br = new PathGradientBrush(path))
{
br.CenterPoint = GaugeFrame.Center;
br.CenterColor = GaugeFrame.FrameColor.End;
br.SurroundColors = new Color[] { GaugeFrame.FrameColor.Start };
g.FillEllipse(br, r);
}
}
RenderFrameBorder(g);
}
#endregion
#region PaintCircularFrameByHvCenter
protected override void RenderFrameByHorizontalCenter(PaintEventArgs e, Rectangle r)
{
RenderFrameByHvCenter(e, r, 90);
}
protected override void RenderFrameByVerticalCenter(PaintEventArgs e, Rectangle r)
{
RenderFrameByHvCenter(e, r, 0);
}
private void RenderFrameByHvCenter(PaintEventArgs e, Rectangle r, int angle)
{
Graphics g = e.Graphics;
Rectangle t = GaugeFrame.Bounds;
t.Height /= 2;
t.Width /= 2;
using (Brush br = GaugeFrame.FrameColor.GetBrush(t, angle))
{
if (br is LinearGradientBrush)
((LinearGradientBrush)br).WrapMode = WrapMode.TileFlipXY;
g.FillEllipse(br, GaugeFrame.Bounds);
}
t = r;
t.Height /= 2;
t.Width /= 2;
using (Brush br = GaugeFrame.FrameColor.GetBrush(t, angle + 180))
{
if (br is LinearGradientBrush)
((LinearGradientBrush)br).WrapMode = WrapMode.TileFlipXY;
g.FillEllipse(br, r);
}
RenderFrameBorder(g);
}
#endregion
#region RenderFrameByNone
protected override void RenderFrameByNone(PaintEventArgs e, Rectangle r)
{
Graphics g = e.Graphics;
using (Brush br = new SolidBrush(GaugeFrame.FrameColor.Start))
g.FillEllipse(br, GaugeFrame.Bounds);
if (GaugeFrame.FrameColor.End.IsEmpty == false)
{
using (Brush br = new SolidBrush(GaugeFrame.FrameColor.End))
g.FillEllipse(br, r);
}
RenderFrameBorder(g);
}
#endregion
#region RenderFrameBorder
private void RenderFrameBorder(Graphics g)
{
if (GaugeFrame.FrameColor.BorderWidth > 0)
{
using (Pen pen = new Pen(
GaugeFrame.FrameColor.BorderColor, GaugeFrame.FrameColor.BorderWidth))
{
pen.Alignment = PenAlignment.Inset;
g.DrawEllipse(pen, GaugeFrame.Bounds);
}
}
}
#endregion
#endregion
#region RenderrBack
#region RenderBackByAngle
protected override void RenderBackByAngle(PaintEventArgs e, Rectangle r)
{
Graphics g = e.Graphics;
Matrix myMatrix = new Matrix();
myMatrix.RotateAt(GaugeFrame.BackColor.GradientAngle, GaugeFrame.Center);
e.Graphics.Transform = myMatrix;
using (Brush br = GaugeFrame.BackColor.GetBrush(r, 0))
g.FillEllipse(br, r);
g.ResetTransform();
RenderBackBorder(g, r);
}
#endregion
#region RenderBackByCenter
protected override void RenderBackByCenter(PaintEventArgs e, Rectangle r)
{
Graphics g = e.Graphics;
using (GraphicsPath path = new GraphicsPath())
{
path.AddEllipse(r);
using (PathGradientBrush br = new PathGradientBrush(path))
{
br.CenterColor = GaugeFrame.BackColor.Start;
br.SurroundColors = new Color[] { GaugeFrame.BackColor.End };
br.CenterPoint = GaugeFrame.Center;
br.SetSigmaBellShape(GaugeFrame.BackSigmaFocus, GaugeFrame.BackSigmaScale);
g.FillRectangle(br, r);
}
}
RenderBackBorder(g, r);
}
#endregion
#region RenderBackByHvCenter
protected override void RenderBackByHorizontalCenter(PaintEventArgs e, Rectangle r)
{
RenderBackByHvCenter(e, r, 90);
}
protected override void RenderBackByVerticalCenter(PaintEventArgs e, Rectangle r)
{
RenderBackByHvCenter(e, r, 0);
}
private void RenderBackByHvCenter(PaintEventArgs e, Rectangle r, int angle)
{
Graphics g = e.Graphics;
Rectangle t = r;
t.Height /= 2;
t.Width /= 2;
using (Brush br = GaugeFrame.BackColor.GetBrush(t, angle))
{
if (br is LinearGradientBrush)
((LinearGradientBrush)br).WrapMode = WrapMode.TileFlipXY;
g.FillEllipse(br, r);
}
RenderBackBorder(g, r);
}
#endregion
#region RenderBackByNone
protected override void RenderBackByNone(PaintEventArgs e, Rectangle r)
{
Graphics g = e.Graphics;
using (Brush br = new SolidBrush(GaugeFrame.BackColor.Start))
g.FillEllipse(br, r);
RenderBackBorder(g, r);
}
#endregion
#region RenderBackBorder
private void RenderBackBorder(Graphics g, Rectangle r)
{
if (GaugeFrame.BackColor.BorderWidth > 0)
{
using (Pen pen = new Pen(
GaugeFrame.BackColor.BorderColor, GaugeFrame.BackColor.BorderWidth))
{
pen.Alignment = PenAlignment.Inset;
g.DrawEllipse(pen, r);
}
}
}
#endregion
#endregion
#region PreRenderContent
internal override void PreRenderContent(PaintEventArgs e)
{
if (GaugeFrame.AddGlassEffect == true)
AddGlassEffect(e, 45);
}
#endregion
#region PostRenderContent
internal override void PostRenderContent(PaintEventArgs e)
{
if (GaugeFrame.AddGlassEffect == true)
AddGlassEffect(e, 90);
}
#endregion
#region AddGlassEffect
private void AddGlassEffect(PaintEventArgs e, float angle)
{
Graphics g = e.Graphics;
Rectangle r = GaugeFrame.BackBounds;
r.Height /= 2;
if (r.Height > 0)
{
Color color1 = Color.FromArgb(100, Color.White);
using (LinearGradientBrush br =
new LinearGradientBrush(r, color1, Color.Transparent, angle))
{
g.FillEllipse(br, r);
}
}
}
#endregion
}
}