C# 如何用按钮绘制形状并给它们上色?

C# 如何用按钮绘制形状并给它们上色?,c#,vb.net,C#,Vb.net,我需要把他的每一个形状都填上C。在这些图片中,我有一些形状,我想把颜色,红色或绿色。当我点击C中的一个形状并按下一个按钮时,会显示红色或绿色。我在PowerPoint中尝试了这一点,但很难从0创建形状。希望在C#或vb.net中创建此C 我的问题是,如何能够以C的形式创建这些形状,并通过在C#或vb.net中按一个按钮对其进行着色。非常感谢 这并没有我想象的那么难,但我通过创建一个半圆而不是“C”来简单地完成了任务。要创建“C”形,您需要将形状分成三组:两个四分之一圆和一个矩形。。将所有形状添加

我需要把他的每一个形状都填上C。在这些图片中,我有一些形状,我想把颜色,红色或绿色。当我点击C中的一个形状并按下一个按钮时,会显示红色或绿色。我在PowerPoint中尝试了这一点,但很难从0创建形状。希望在C#或vb.net中创建此C

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


这并没有我想象的那么难,但我通过创建一个半圆而不是“C”来简单地完成了任务。要创建“C”形,您需要将形状分成三组:两个四分之一圆和一个矩形。。将所有
形状添加到同一列表中

处理过程是相同的,只是数学部分不同。事实上,矩形部分的数学运算甚至比它处理圆弧的极其简单的方法还要复杂一点:-)

下面是一个非常简单的
形状
类的示例:

class Shape
{
    public GraphicsPath Path { get; set; }
    public Color FillColor { get; set; }

    public Shape(GraphicsPath gp) { Path = gp; }
}
您可以像这样为它创建一个
列表

List<Shape> FillList(int segments, int angle1, int angle2, int inner, int outer, int rings)
{
    List<Shape> paths = new List<Shape>();
    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;
}
}

如果形状有颜色,则填充它们的颜色,并以某种颜色绘制;我使用固定的黑色
,如果有,则使用红色笔
选中的
形状

整个选择和着色过程如下所示:

Shape selected = null;

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
    if (selected != null)
    {
        selected.FillColor = ((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y);
        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();
}

这不是不可能的,但要做到这一点需要相当多的编码和数学。您需要从基本体(即圆弧和直线)构造形状,并将它们组合成图形。一旦你有了这些,他们可以很容易地选择和填补。但是,要获得正确的路径需要一些努力。或者,您可以尝试安装Microsoft.VisualBasic.PowerPacks以使其更容易。这里包括了线形和椭圆形。但正如Taw所提到的,这不是一项容易的任务——如果我是你,我更愿意在Html中使用CSS,但你并没有真正提到你为什么需要它。Thaks很多,非常完美。
Shape selected = null;

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
    if (selected != null)
    {
        selected.FillColor = ((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y);
        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();
}