在列表中绘制所有行对象,之后添加,删除新行?

时间:2018-02-17 22:04:17

标签: c# image-processing

我在列表中保存了一些线对象并尝试在图片框上绘制一次,但每次在图片框的中间只绘制一条线时,是否有解决此问题的方法。 提前谢谢......

    public class Lines
    {
        public System.Drawing.Point startPoint = new System.Drawing.Point();
        public System.Drawing.Point endPoint = new System.Drawing.Point();
    }

    Lines b = new Lines();
    List<Lines> alllines = new List<Lines>();

//------------inside button click i wrote the following code----------

    b.startPoint.X = rectlist[i].X;
    b.startPoint.Y = (rectlist[i].Y + rectlist[i].Bottom) / 2;
    b.endPoint.X = rectlist[i].Right;
    b.endPoint.Y = (rectlist[i].Top + rectlist[i].Bottom) / 2;
    alllines.Add(b);

    this.OrignalimgPIcBX.Invalidate();

并且在图片框的paint事件中我写了这段代码

Graphics g = e.Graphics;
using (var pen = new Pen(Color.Black, 2))
{
    foreach (var lines in alllines)
    {
        g.DrawLine(pen, lines);
    }
}

有什么问题??!

现在正确的行列表 但是知道线对象没有绘制在正确的位置

我将图片框大小模式设为拉伸图像,是否有任何改变!

这是油漆事件

private void OrignalimgPIcBX_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        using (var pen = new Pen(Color.Black, 2))
        {
            foreach (var lines in alllines)
            {
                g.DrawLine(pen, lines.startPoint, lines.endPoint);

            }
        }
   }

1 个答案:

答案 0 :(得分:1)

只有3种可能的解释,

  • 你的所有行都是一样的
  • 除了一行之外的所有行都是从可查看区域中抽出来的
  • 或者你正在吃异常

您需要使用调试器并断开线条以确保它们使用正确的指标进行绘制

<强>更新

for (int i = 0; i < rectlist.Count; i++) 
{
    var b = new Lines();  // <-- you need to do this
    b.startPoint.X = rectlist[i].X; 
    b.startPoint.Y = (rectlist[i].Y + rectlist[i].Bottom) / 2; 
    b.endPoint.X = rectlist[i].Right; 
    b.endPoint.Y = (rectlist[i].Top + rectlist[i].Bottom) / 2; 
    alllines.Add(b); 
}

您的问题是您只是更改同一行并将其添加到列表

即你的名单一遍又一遍地以同一行结束