我有一个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);
}
在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);
。
我不明白为什么这行不通。我很感激任何建议。
2条答案
按热度按时间ckocjqey1#
您可以用细笔或粗笔绘制一个开放的
GraphicsPath
。但是region
必须从一个封闭的形状设置,否则没有地方可以显示像素。这将有助于保持你的区域完整;但你得知道,你想要什么样的如果你想让它像一条粗线,你必须创建一个多边形或一系列线来勾勒出你想要的形状。如果你想让你的线在那个区域内,你需要两条路径:一个封闭的多边形路径用于设置区域,一个开放的线路径用于在区域内绘制线。
**编辑:**创建闭合路径的最佳方法可能是使用
Widen()
方法和您正在使用的Pen,如下所示:这将得到正确的厚度以及线帽,也适用于更复杂的折线;我还没试过...
mlnl4t2r2#
可能是因为这条线没有面积。尝试用一个非常薄的形状有一个积极的领域。例如: