0
public partial class Form1 : Form
{
    Point downPoint , upPoint;
    List<Shapes> shapes = new List<Shapes>();
    public ShapesEnum shapeType;

    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        foreach (var s in shapes)
            s.Draw(e.Graphics);
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        downPoint = e.Location;
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        base.OnMouseUp(e);
        upPoint = e.Location;
        CreateShape();
        this.Invalidate();
    }

    private void CreateShape()
    {
        if (shapeType == ShapesEnum.Circle)
        {
            Rectangle rect = new Rectangle(downPoint.X, downPoint.Y, upPoint.X - downPoint.X, upPoint.Y - downPoint.Y);
            Ellipse ellipse = new Ellipse() { rect = rect };
            shapes.Add(ellipse);
        }

        else if (shapeType == ShapesEnum.Rectangle)
        {
            Rectangle rect = new Rectangle(downPoint.X, downPoint.Y, upPoint.X - downPoint.X, upPoint.Y - downPoint.Y);
            Rect rectangle = new Rect() { rect = rect };
            shapes.Add(rectangle);
        }

        else if (shapeType == ShapesEnum.Line)
        {
            Point pt1 = new Point (upPoint.X, upPoint.Y);
            Point pt2 = new Point (downPoint.X, downPoint.Y);

            Ln rectangle = new Ln() { PointUp = pt1, PointDown = pt2 };
            shapes.Add(rectangle);
        }
        lblStatus.Text = string.Format("dn:{0} up:{1} ct:{2}", downPoint, upPoint, shapes.Count());
    }

    private void btnCircle_Click(object sender, EventArgs e)
    {
        shapeType = ShapesEnum.Circle;
    }

    private void btnRectangle_Click(object sender, EventArgs e)
    {
        shapeType = ShapesEnum.Rectangle;
    }

    private void btnLine_Click(object sender, EventArgs e)
    {
        shapeType = ShapesEnum.Line;
    }

}

这是目前我的绘画程序的主要部分。

public enum ShapesEnum { Circle, Rectangle, Line }
abstract class Shapes
{
    public Rectangle rect { get; set; }
    public Color color { get; set; }
    public bool isFilled { get; set; }
    public abstract void Draw(Graphics g);
}

class Ellipse : Shapes
{
    public override void Draw(Graphics g)
    {
        g.DrawEllipse(Pens.Black, rect);
    }
}

class Rect : Shapes
{
    public override void Draw(Graphics g)
    {
        g.DrawRectangle(Pens.Black, rect);
    }
}

class Ln : Shapes
{
    public Point PointUp { get; set; }
    public Point PointDown { get; set; }

    public override void Draw(Graphics g)
    {
        g.DrawLine(Pens.Black, PointUp, PointDown);
    }
}

这是我的类,用于继承形状。根据形状,将调用其中一个类。


绘制椭圆效果很好。画线也是一样。但是,在绘制矩形时存在一个错误。如果我把鼠标从左上拖到右下放开,这将起作用。但是,如果我转到另一个方向,它在表单上是不可见的,但shapes.Count()仍然会添加到shapes.

是什么导致了这个错误?

4

1 回答 1

2

尝试这样的事情,以使起点和终点以正确的方式:

int x0 = Math.Min(upPoint.X, downPoint.X);
int y0 = Math.Min(upPoint.Y, downPoint.Y);
Point upperLeft = new Point(x0, y0);

int x1 = Math.Max(upPoint.X, downPoint.X);
int y1 = Math.Max(upPoint.Y, downPoint.Y);
Point lowerRight = new Point(x1, y1);

Rectangle rect = new Rectangle(x0, y0, x1 - x0, y1 - y0);
于 2014-03-24T20:51:28.210 回答