我需要填補這個C從他的每一個形狀。在這張圖片中,我有一些形狀,我想把顏色,紅色或綠色。當我點擊C中的一個形狀,然後按下一個按鈕來放置紅色或綠色。我在PowerPoint中嘗試這樣做,但很難從0創建形狀。想要在C#或vb.net中創建此C語言。如何繪製形狀並用按鈕給它們着色?
我的問題是,怎麼可能以C的形式創建這些形狀,並通過在C#或vb.net中按下一個按鈕來爲它們着色。非常感謝。
我需要填補這個C從他的每一個形狀。在這張圖片中,我有一些形狀,我想把顏色,紅色或綠色。當我點擊C中的一個形狀,然後按下一個按鈕來放置紅色或綠色。我在PowerPoint中嘗試這樣做,但很難從0創建形狀。想要在C#或vb.net中創建此C語言。如何繪製形狀並用按鈕給它們着色?
我的問題是,怎麼可能以C的形式創建這些形狀,並通過在C#或vb.net中按下一個按鈕來爲它們着色。非常感謝。
這是不太硬如我想,但我通過創建不是一個「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
在工作中表現出的參數:
正如你可以看到我選擇一個,然後從調色板圖像拾取顏色的顏色的Shapes
..
這裏是Form
的Paint
事件:
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();
}
Thaks很多,很完美。 – Vladut
這不是不可能的,但它將採取相當一些編碼和數學來做到這一點。您需要構建基元的形狀,即圓弧和直線,並將它們組合到一個圖形路徑中。一旦你有了他們,他們可以很容易地被選中和填補。但正確的路徑將需要一些努力。 – TaW
或者您可以嘗試安裝*** Microsoft.VisualBasic.PowerPacks ***使其更容易。你在那裏包含了線形和橢圓形。但是正如Taw所說,沒有一件容易的事情 - 如果我是你,我寧願用Html中的CSS來玩,但你實際上沒有提到你爲什麼需要這個。 – LuckyLuke82