我有一个 Windows 窗体应用程序,我可以在主窗体中添加不同的图形(矩形、圆形等)。该图是一个 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);
}
在形状(图形)类中:
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);
。
我不明白为什么这不起作用。 我将不胜感激任何建议。
您可以用细笔或粗笔画开放的
GraphicsPath
。但是 region
必须从 闭合形状 设置,否则就没有地方可以显示像素。这将有助于保持您所在地区的完整性;但你需要知道,你想要它是什么:
if (shape != ShapeType.Line) this.Region = new Region(path);
如果您希望它像粗线一样,您必须创建一个多边形或一系列线条来勾勒出您想要的形状。如果您希望线条位于该区域内,则需要两条路径:一条用于设置区域的闭合多边形路径和一条用于在区域内绘制线条的开放线路径。
编辑: 创建闭合路径的最佳方法可能是使用
Widen()
方法和您正在使用的笔,如下所示:
GraphicsPath path2 = ..
path.Widen(yourPen);
这将使粗细以及线帽正确,并且也适用于更复杂的折线;不过我还没试过..
也许是因为这条线没有面积。尝试将其替换为具有正面积的非常薄的形状。例如:
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)
});