如何用按钮绘制形状和颜色?

我需要填写这个C来表示他的每一个形状。 在这张照片中,我有一些形状,我想把颜色,红色或绿色。 当我从C中单击一个形状时,按一个按钮将红色或绿色。 我在PowerPoint中尝试这个但很难从0创建形状。想在C#或vb.net中创建这个C.

我的问题是,如何通过在C#或vb.net中按一个按钮,以C的forms创建这些形状并对其进行着色。 非常感谢。

在此处输入图像描述

它并不像我想象的那么难,但我只是通过创造一个’C’而不是半圈来完成任务 。 要创建“C”形状,您需要将形状分为组:两个四分之一圆和一个矩形。将所有Shapes添加到同一个列表中!

处理将是相同的,只是数学部分会有所不同。 实际上,矩形部分的数学运算甚至比它对弧的极其简单的方式更复杂:-)

这是一个非常简单的Shape类的示例:

 class Shape { public GraphicsPath Path { get; set; } public Color FillColor { get; set; } public Shape(GraphicsPath gp) { Path = gp; } } 

您可以像这样为它创建List

 List FillList(int segments, int angle1, int angle2, int inner, int outer, int rings) { List paths = new List(); float deltaA = 1f * (angle2 - angle1) / segments; float width = 1f * (outer - inner ) / rings; for (int s = 0; s < segments; s++) { float a = angle1 + s * deltaA; for (int r = 0; r < rings; r++) { float w1 = r * width; float w2 = w1 + width; GraphicsPath gp = new GraphicsPath(); RectangleF rect1 = new RectangleF(w1, w1, (outer - w1) * 2, (outer - w1) * 2); RectangleF rect2 = new RectangleF(w2, w2, (outer - w2) * 2, (outer - w2) * 2); gp.AddArc(rect1, a, deltaA); gp.AddArc(rect2, a + deltaA, -deltaA); gp.CloseFigure(); paths.Add(new Shape(gp)); } } return paths; } 

我添加了一些NumericUpDowns来演示工作中的参数:

在此处输入图像描述

如您所见,我通过选择一个然后从调色板图像中选择一种颜色来为Shapes着色。

这是FormPaint事件:

 private void Form1_Paint(object sender, PaintEventArgs e) { foreach (Shape gp in paths) { using (SolidBrush br = new SolidBrush(gp.FillColor)) if (gp.FillColor != null) e.Graphics.FillPath(br, gp.Path); e.Graphics.DrawPath(Pens.Black, gp.Path); if (gp == selected) e.Graphics.DrawPath(Pens.OrangeRed, gp.Path); } 

}

如果它们有一个并且也以某种颜色绘制,则形状用它们的颜色填充; 我使用固定的黑色Pen ,如果有一个,则使用红色的Selected形状。

整个选择和着色就像这样简单:

 Shape selected = null; private void pictureBox1_MouseClick(object sender, MouseEventArgs e) { if (selected != null) { selected.FillColor = ((Bitmap)pictureBox1.Image).GetPixel(eX, eY); Invalidate(); } } private void Form1_MouseClick(object sender, MouseEventArgs e) { selected = null; foreach (Shape gp in paths) if (gp.Path.IsVisible(e.Location)) { selected = gp; break; } Invalidate(); }