1

メイン フォームにさまざまな図形 (四角形、円など) を追加する Windows フォーム アプリがあります。Figure は UserControl であり、GraphicsPath で定義した形状です。新しい図形を追加する方法:

 void AddElement(ShapeType shape, string guid)
    {
        Shape newShape = new Shape();
        newShape.Name = guid;
        newShape.Size = new Size(100, 100);           
        newShape.Type = shape;
        newShape.Location = new Point(100, 100);

        newShape.MouseDown += new MouseEventHandler(Shape_MouseDown);
        newShape.MouseMove += new MouseEventHandler(Shape_MouseMove);
        newShape.MouseUp += new MouseEventHandler(Shape_MouseUp);
        newShape.BackColor = this.BackColor;

        this.Controls.Add(newShape);
    }

Shape (Figure) クラス:

 private ShapeType shape;
 private GraphicsPath path = null;
 public ShapeType Type
    {
        get { return shape; }
        set
        {
            shape = value;
            DrawElement();
        }
    } 

 private void DrawElement()
     {
        path = new GraphicsPath();
        switch (shape)
        {
            case ShapeType.Rectangle:
                path.AddRectangle(this.ClientRectangle);
                break;

            case ShapeType.Circle:
                path.AddEllipse(this.ClientRectangle);
                break;

            case ShapeType.Line:
                path.AddLine(10,10,20,20);                   
                break;
        }
        this.Region = new Region(path);
    }

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    {
        if (path != null)
        {              
            e.Graphics.DrawPath(new Pen(Color.Black, 4), path);
        }
    }

図のサイズを変更するときは、次のように再描画します。

 protected override void OnResize(System.EventArgs e)
    {
        DrawElement();
        this.Invalidate();
    }

長方形や円などの形状を追加すると、すべて正常に機能します。しかし、Line を選択すると、フォームに何も表示されません。ブレークポイントは、プログラムがすべてのメソッドをステップインすることを示していますthis.Controls.Add(newShape);

なぜこれが機能しないのかわかりません。アドバイスをいただければ幸いです。

4

2 に答える 2

2

細いペンでも太いペンでも、開きを描くことができます。GraphicsPathただし、閉じた形状regionから設定する必要があります。そうしないと、ピクセルが表示される場所がありません。これは、リージョンをそのまま維持するのに役立ちます。しかし、あなたが知りたいことだけを知る必要があります:

if (shape != ShapeType.Line)   this.Region = new Region(path);

太い線のようなものにしたい場合は、多角形または一連の線を作成して、必要な形状の輪郭を描く必要があります。また、線をその領域内に配置する場合は、領域を設定するための閉じたポリゴン パスと、領域内に線を描画するための開いた線パスの 2 つのパスが必要になります。

編集: 閉じたパスを作成する最良の方法は、おそらく次のように使用Widen()しているペンでメソッドを使用することです:

GraphicsPath path2 = path.Widen(yourPen);

これにより、線のキャップと同様に太さが適切になり、より複雑なポリラインでも機能します。私はそれを試していませんが..

于 2014-03-29T21:24:57.867 に答える
1

線に面積がないからかもしれません。正の領域を持つ非常に薄い形状に置き換えてみてください。例えば:

const int thickness = 1;
path.AddLines(new[]
    {
        new Point(10, 10),
        new Point(20, 20),
        new Point(20 + thickness, 20 + thickness),
        new Point(10 + thickness, 10 + thickness)
    });
于 2014-03-29T20:24:54.480 に答える