【问题标题】:How to draw shapes and color them with a button? [closed]如何使用按钮绘制形状并为其着色? [关闭]
【发布时间】:2017-01-15 09:38:25
【问题描述】:

我需要为他的每个形状填充这个 C。在这张照片中,我有一些形状,我想在其中添加颜色,红色或绿色。当我从 C 中单击一个形状并按一个按钮放置红色或绿色时。我在 PowerPoint 中尝试此操作,但很难从 0 创建形状。想要在 C# 或 vb.net 中创建此 C。

我的问题是,如何通过按 C# 或 vb.net 中的一个按钮以 C 的形式创建这些形状并为它们着色。非常感谢。

【问题讨论】:

  • 这并非不可能,但要做到这一点需要相当多的编码和数学。您需要从图元(即弧和线)构造形状并将它们组合在图形路径中。一旦有了这些,就可以轻松地选择和填充它们。但要走对路需要付出一些努力。
  • 或者您可以尝试安装 Microsoft.VisualBasic.PowerPacks 以使其更容易。你在那里包括了线形和椭圆形。但正如 Taw 所说,这不是一件容易的事——如果我是你,我宁愿在 Html 中使用 CSS,但你实际上并没有提到为什么需要这个。

标签: c# vb.net


【解决方案1】:

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

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

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

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

    public Shape(GraphicsPath gp) { Path = gp; }
}

你可以像这样为它创建一个List<Shape>

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;
}

我添加了几个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(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();
}

【讨论】:

  • 非常感谢,非常完美。
猜你喜欢
  • 2016-12-16
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2012-07-24
  • 2014-09-05
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多