我需要填补这个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