如何使用GDI +绘制环形(甜甜圈)?

我一直试图在C#中绘制一个带有透明孔和渐变边缘的环 (厚度环),但收效甚微。 有没有人对如何做到这一点有任何建议?

这是一个很好的Blend Utility

这是最终结果 – 感谢BlueMonkMN

Rectangle GetSquareRec(double radius, int x, int y) { double r = radius; double side = Math.Sqrt(Math.Pow(r, 2) / 2); Rectangle rec = new Rectangle(x - ((int)side), y - ((int)side), (int)(side * 2) + x, (int)(side * 2) + y); return rec; } void Form1_Paint(object sender, PaintEventArgs e) { Graphics gTarget = e.Graphics; gTarget.SmoothingMode = SmoothingMode.AntiAlias; GraphicsPath pTemp = new GraphicsPath(); Rectangle r = GetSquareRec(200, 225, 225); pTemp.AddEllipse(r); pTemp.AddEllipse(GetSquareRec(50, 225, 225)); Color[] colors = new Color[5]; colors[0] = Color.FromArgb(192, 192, 192); colors[1] = Color.FromArgb(105, 0, 0); colors[2] = Color.FromArgb(169, 169, 169); colors[3] = Color.FromArgb(0, 0, 0); colors[4] = Color.FromArgb(0, 0, 0); float[] positions = new float[5]; positions[0] = 0f; positions[1] = 0.1f; positions[2] = 0.35f; positions[3] = 0.5f; positions[4] = 1f; ColorBlend Cb = new ColorBlend(); Cb.Colors = colors; Cb.Positions = positions; PathGradientBrush pgb = new PathGradientBrush(pTemp); pgb.InterpolationColors = Cb; pgb.CenterPoint = new PointF(rX + (r.Width / 2), rY + (r.Height / 2)); gTarget.FillPath(pgb, pTemp); } 

http://sofzh.miximages.com/c%23/www.freeimagehosting.net

这就是我在滚动游戏开发工具包中的表现 :

 pTemp = new GraphicsPath(); pTemp.AddEllipse(Start.X, Start.Y, End.X - Start.X, End.Y - Start.Y); pTemp.AddEllipse((Start.X * 3 + End.X) / 4f, (Start.Y * 3 + End.Y) / 4f, (End.X - Start.X) / 2f, (End.Y - Start.Y) / 2f); PathGradientBrush pgb = new PathGradientBrush(pTemp); Blend b = new Blend(); b.Factors = new float[] { 0, 1, 1 }; b.Positions = new float[] { 0, .5F, 1 }; pgb.Blend = b; pgb.CenterColor = ((SolidBrush)CurrentBrush).Color; pgb.SurroundColors = new Color[] {CurrentPen.Color}; gTarget.FillPath(pgb, pTemp); pgb.Dispose(); pTemp.Dispose(); 

annulus截图http://sofzh.miximages.com/c%23/annulus.png

我编辑了这个样本的原始SGDK代码,因为最初我不够聪明,无法缩放渐变以排除洞,但现在我想我是:)。

如果您希望看到这样的渐变:

替代文字http://sofzh.miximages.com/c%23/annulus2.png

然后将混合代码更改为如下所示:

 Blend blend = new Blend(); blend.Factors = new float[] { 0, 1, 0, 0 }; blend.Positions = new float[] { 0, 0.25F, .5F, 1 }; pgb.Blend = blend; 

您可以使用两个对Graphics.DrawArc组合的调用,绘制环的顶部和底部或左右部分,一次一个部分。