private System.Collections.Generic.Dictionary<Color, SolidBrush> _brushCache =
new System.Collections.Generic.Dictionary<Color,SolidBrush>();
privatevoid DrawFilledArc (Graphics grp, Color color, int startAngle)
{
grp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
Rectangle main = this.ClientRectangle;
// If there is no region to be drawn, then this method terminates itself
if (main.Width - (2*this._ringThickness) < 1 || main.Height -(2*this._ringThickness) <= 1)
return;
// Calculates the region that will be filled
using (GraphicsPath outerPath = new GraphicsPath())
{
outerPath.AddPie(main, startAngle, this.PieAngle);
Rectangle sub = new Rectangle(main.X + this._ringThickness, main.Y + this._ringThickness, main.Width - (2 * this._ringThickness), main.Height - (2 * this._ringThickness));
using (GraphicsPath innerPath = new GraphicsPath())
{
innerPath.AddPie(sub, startAngle - 1, this.PieAngle + 2);
using (System.Drawing.Region mainRegion = new Region(outerPath))
{
using (System.Drawing.Region subRegion = new Region(innerPath))
{
mainRegion.Exclude(subRegion);
SolidBrush targetBrush;
if (_brushCache.ContainsKey(color))
{
targetBrush = _brushCache[color];
}
else
{
targetBrush = new SolidBrush(color);
_brushCache.Add(color,targetBrush);
}
// Fill that region
grp.FillRegion(targetBrush, mainRegion);
}
}
}
}
}