使用Windows窗体应用程序中的组合框更改颜色

时间:2018-02-14 09:51:11

标签: c# winforms

protected override void OnPaint(PaintEventArgs e)
{
    if (comboBox1.Text == "Circle")
    {
        e.Graphics.FillEllipse(Brushes.Red, new Rectangle(105, 120, 64, 64));
    }

    if (comboBox1.Text == "Rectangle")
    {
        e.Graphics.FillRectangle(Brushes.Red, new Rectangle(105, 120, 75, 50));
    }

    if(comboBox1.Text == "Triangle")
    {
        Point[] points = { new Point(140, 110), new Point(230, 190), new Point(50, 190) };
        e.Graphics.FillPolygon(Brushes.Red, points);
    }
}

我已经在上面创建了这些形状,并且它们在组合框中,但是我试图获得它,所以我的第二个组合框将改变形状的颜色,有什么办法吗?去做这个?我似乎无法在任何地方找到它。 第二个组合框包含红色,绿色,蓝色,自定义颜色。我有它所以颜色调色板出现但我不知道如何选择时将其设置为形状。

我如何参考形状并改变画笔颜色是我努力的部分

1 个答案:

答案 0 :(得分:0)

正如Hans Passant已经指出的那样:您需要使用SolidBrush对象来设置自定义颜色。这在帖子convert from Color to brush中有所描述。

在您的情况下,我会按以下方式填充颜色ComboBox

comboBox_Colour.DataSource = new List<Color> { Color.Red, Color.Blue, Color.Yellow, Color.Green };

现在,在OnPaint事件中,您可以检查是否已选择任何项目,然后直接从Color SelectedItem抓取comboBox_Colour。然后将其插入SolidBrush对象的构造函数中,并将SolidBrush提供给Fill...方法。它会起作用,因为SolidBrush继承自Brush

  

public sealed class SolidBrush : Brush

protected override void OnPaint(PaintEventArgs e)
{
    if (comboBox_Shape.SelectedIndex != -1 && comboBox_Colour.SelectedIndex != -1)
    {
        Color c = (Color)comboBox_Colour.SelectedItem;
        SolidBrush sb = new SolidBrush(c);
        if (comboBox_Shape.Text == "Circle")
        {
            e.Graphics.FillEllipse(sb, new Rectangle(105, 120, 64, 64));
        }
        else if (comboBox_Shape.Text == "Rectangle")
        {
            e.Graphics.FillRectangle(sb, new Rectangle(105, 120, 75, 50));
        }
        else if (comboBox_Shape.Text == "Triangle")
        {
            Point[] points = { new Point(140, 110), new Point(230, 190), new Point(50, 190) };
            e.Graphics.FillPolygon(sb, points);
        }
    }
}

修改

如果我在这里提供的颜色选择不够,您可以将结构Color必须提供的所有颜色转储到comboBox_Colour

List<Color> allColours = typeof(Color).GetProperties(
                     System.Reflection.BindingFlags.Static | 
                     System.Reflection.BindingFlags.Public)
                    .Select(x => (Color)x.GetValue(null)).ToList();

comboBox_Colour.DataSource = allColours;