当前位置:  开发笔记 > 编程语言 > 正文

如何用按钮绘制形状和颜色?

如何解决《如何用按钮绘制形状和颜色?》经验,为你挑选了1个好方法。

我需要填写这个C来表示他的每一个形状.在这张照片中,我有一些形状,我想把颜色,红色或绿色.当我从C点击一个形状时,我按一个按钮放红色或绿色.我在PowerPoint中尝试这个,但很难从0创建形状.想在C#或vb.net中创建此C.

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

在此输入图像描述



1> TaW..:

这是不太硬如我想,但我确实simplyfy通过创建不是一个"C",但一个任务半圈.要创建"C"形状,您需要将形状分为组:两个四分之一圆和一个矩形.将所有内容添加Shapes到同一个列表中!

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

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

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

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

您可以List像这样创建一个:

List FillList(int segments, int angle1, int angle2, int inner, int outer, int rings)
{
    List paths = new List();
    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();
}

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有