2017-01-15 87 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