2017-01-15 51 views
1

我需要填补这个C从他的每一个形状。在这张图片中,我有一些形状,我想把颜色,红色或绿色。当我点击C中的一个形状,然后按下一个按钮来放置红色或绿色。我在PowerPoint中尝试这样做,但很难从0创建形状。想要在C#或vb.net中创建此C语言。如何绘制形状并用按钮给它们着色?

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

enter image description here

+1

这不是不可能的,但它将采取相当一些编码和数学来做到这一点。您需要构建基元的形状,即圆弧和直线,并将它们组合到一个图形路径中。一旦你有了他们,他们可以很容易地被选中和填补。但正确的路径将需要一些努力。 – TaW

+0

或者您可以尝试安装*** Microsoft.VisualBasic.PowerPacks ***使其更容易。你在那里包含了线形和椭圆形。但是正如Taw所说,没有一件容易的事情 - 如果我是你,我宁愿用Html中的CSS来玩,但你实际上没有提到你为什么需要这个。 – LuckyLuke82

回答

6

这是不太硬如我想,但我通过创建不是一个“C”,但一个半圈没有simplyfy任务。要创建'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在工作中表现出的参数:

enter image description here

正如你可以看到我选择一个,然后从调色板图像拾取颜色的颜色的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(); 
} 
+0

Thaks很多,很完美。 – Vladut