1

我有一个 Windows 窗体应用程序,可以在其中向主窗体添加不同的图形(矩形、圆形等)。该图是一个用户控件,它是我用 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);
    }

在形状(图)类中:

 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但是 aregion必须从封闭的形状设置,否则没有地方可以显示您的像素。这将有助于保持您所在地区的完整;但你需要知道,正是你想要的:

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

如果你想让它像一条粗线,你必须创建一个多边形或一系列线来勾勒出你想要的形状。如果您希望您的线位于该区域内,您将需要两条路径:一条用于设置区域的封闭多边形路径和一条用于在该区域内绘制线的开放线路径。

编辑: 创建封闭路径的最佳方法可能是使用Widen()您正在使用的 Pen 的方法,如下所示:

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 回答