[英]C# Graphics Draw Any Object
I want to draw many different shapes on a Windows Form. 我想在Windows窗体上绘制许多不同的形状。 The following code works only for rectangles. 以下代码仅适用于矩形。
// render list contains all shapes
List<Rectangle> DrawList = new List<Rectangle>();
// add example data
DrawList.Add(new Rectangle(10, 30, 10, 40));
DrawList.Add(new Rectangle(20, 10, 20, 10));
DrawList.Add(new Rectangle(10, 20, 30, 20));
// draw
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
foreach (Rectangle Object in DrawList)
{
g.FillRectangle(new SolidBrush(Color.Black), Object);
}
}
How can I improve the code to handle any type of shapes like rectangles, lines, curves, and so on? 如何改进代码以处理任何类型的形状,例如矩形,直线,曲线等?
I think I will need a list which can contain objects of different types and a function to draw any object depending on its type of shape. 我想我需要一个可以包含不同类型对象的列表,以及一个根据其形状类型绘制任何对象的函数。 But unfortunately I have no idea how to do that. 但不幸的是,我不知道该怎么做。
Something like this: 像这样:
public abstract class MyShape
{
public abstract void Draw(PaintEventArgs args);
}
public class MyRectangle : MyShape
{
public int Height { get; set; }
public int Width { get;set; }
public int X { get; set; }
public int Y { get; set; }
public override void Draw(Graphics graphics)
{
graphics.FillRectangle(
new SolidBrush(Color.Black),
new Rectangle(X, Y, Width, Height));
}
}
public class MyCircle : MyShape
{
public int Radius { get; set; }
public int X { get; set; }
public int Y { get; set; }
public override void Draw(Graphics graphics)
{
/* drawing code here */
}
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
List<MyShape> toDraw = new List<MyShape>
{
new MyRectangle
{
Height = 10,
Width: 20,
X = 0,
Y = 0
},
new MyCircle
{
Radius = 5,
X = 5,
Y = 5
}
};
toDraw.ForEach(s => s.Draw(e.Graphics));
}
Alternatively, you could create an extension method for each type you wish to draw. 或者,您可以为要绘制的每种类型创建扩展方法。 Example: 例:
public static class ShapeExtensions
{
public static void Draw(this Rectangle r, Graphics graphics)
{
graphics.FillRectangle(new SolidBrush(Color.Black), r);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.