6

我是一名学生,我是新来的。我有一个课程项目来制作一个类似 Paint 的程序。我有一个带有 DrawSelf 的基类Shape,包含等。矩形、椭圆和三角形的方法和类。我还有另外两个分类的DisplayProccesor和DialogProcessor ,它们是用于绘图的类,它控制与用户的对话。这些是项目的要求。

public class DisplayProcessor
{

    public DisplayProcessor()
    {
    }

    /// <summary>
    /// List of shapes
    /// </summary>
    private List<Shape> shapeList = new List<Shape>();
    public List<Shape> ShapeList
    {
        get { return shapeList; }
        set { shapeList = value; }
    }

    /// <summary>
    /// Redraws all shapes in shapeList
    /// </summary>
    public void ReDraw(object sender, PaintEventArgs e)
    {
        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        Draw(e.Graphics);
    }

    public virtual void Draw(Graphics grfx)
    {
        int n = shapeList.Count;
        Shape shape;

        for (int i = 0; i <= n - 1; i++)
        {
            shape = shapeList[i];
            DrawShape(grfx, shape);
        }
    }

    public virtual void DrawShape(Graphics grfx, Shape item)
    {
        item.DrawSelf(grfx);
    }
}

这是另一个:

public class DialogProcessor : DisplayProcessor
{
    public DialogProcessor()
    {
    }

    private Shape selection;
    public Shape Selection
    {
        get { return selection; }
        set { selection = value; }
    }

    private bool isDragging;
    public bool IsDragging
    {
        get { return isDragging; }
        set { isDragging = value; }
    }

    private PointF lastLocation;
    public PointF LastLocation
    {
        get { return lastLocation; }
        set { lastLocation = value; }
    }

   public void AddRandomRectangle()
    {
        Random rnd = new Random();
        int x = rnd.Next(100, 1000);
        int y = rnd.Next(100, 600);

        RectangleShape rect = new RectangleShape(new Rectangle(x, y, 100, 200));
        rect.FillColor = Color.White;

        ShapeList.Add(rect);
    }
}

所以,我想旋转一个由用户选择的形状。我试试这样。它旋转它,但我明白了:http ://www.freeimagehosting.net/qj3zp

public class RectangleShape : Shape
{

    public override void DrawSelf(Graphics grfx)
    {
        grfx.TranslateTransform(Rectangle.X + Rectangle.Width / 2, Rectangle.Y + Rectangle.Height / 2);
        grfx.RotateTransform(base.RotationAngle);
        grfx.TranslateTransform( - (Rectangle.X + Rectangle.Width / 2), -( Rectangle.Y + Rectangle.Height / 2));
        grfx.FillRectangle(new SolidBrush(FillColor), Rectangle.X, Rectangle.Y, Rectangle.Width, Rectangle.Height);
        grfx.DrawRectangle(Pens.Black, Rectangle.X, Rectangle.Y, Rectangle.Width, Rectangle.Height);
        grfx.ResetTransform();
    }
}
4

2 回答 2

2

我很难解释你的问题。我的猜测是,当您旋转第一个形状并绘制它时。然后画另一个形状,第二个形状也旋转。

这是因为,所有 DrawSelf 方法都使用相同的图形参考,因此在一个方法上使用的任何转换都会影响同一上下文中的所有连续调用。

您可以通过在每个 DrawSelf 方法结束时简单地调用Graphics.ResetTransform方法来解决此问题。

public override void DrawSelf(Graphics grfx)
    {
        base.DrawSelf(grfx);

        //grfx.FillRectangle(new SolidBrush(FillColor), Rectangle.X, Rectangle.Y, Rectangle.Width, Rectangle.Height);
        //grfx.DrawRectangle(Pens.Black, Rectangle.X, Rectangle.Y, Rectangle.Width, Rectangle.Height);

        grfx.TranslateTransform(Rectangle.X + Rectangle.Width / 2, Rectangle.Y + Rectangle.Height/2);
        grfx.RotateTransform(base.RotationAngle);
        grfx.TranslateTransform(-(Rectangle.X + Rectangle.Width / 2), -(Rectangle.Y + Rectangle.Height/2));
        grfx.FillRectangle(new SolidBrush(FillColor), Rectangle.X, Rectangle.Y, Rectangle.Width, Rectangle.Height);
        grfx.DrawRectangle(Pens.Black, Rectangle.X,Rectangle.Y, Rectangle.Width, Rectangle.Height);
        grfx.ResetTransform();
    }
于 2012-10-19T10:43:33.047 回答
1

我已经解决了!问题是我为每个形状绘制选择,当我旋转形状时,选择保持不旋转。我对选择进行了与DrawSelf方法相同的转换,一切都很好!干杯!

于 2012-11-06T10:40:55.660 回答