6

私は学生で、この辺りは初めてです。ペイントのようなプログラムを作成するためのコースプロジェクトがあります。DrawSelf、Containsectを含む基本クラスShapeがあります。今のところ、Rectangle、Ellipse、Triangleのメソッドとクラス。また、描画用のクラスである他の2つのクラス化された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);
    }
}

そして、これがもう1つです。

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);
    }
}

そこで、ユーザーが選択した1つの図形を回転させたいと思います。私はこのようにしようとします。それはそれを回転させます、しかし私はこれを手に入れます: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

私はあなたの質問を解釈するのに苦労しています。私の推測では、最初の図形を回転させて描画するとします。次に、別の形状を描画します。2番目の形状も回転します。

これは、すべてのDrawSelfメソッドが同じグラフィック参照で機能しているため、1つのメソッドで使用される変換は、同じコンテキストでの後続のすべての呼び出しに影響を与えるためです。

これを解決するには、各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 に答える