程序退出,代码为 1073741819 (0xc0000005) 'Access violation'



我正在使用Graphicpath在面板中绘制点和线。代码如下:

private void panel1_Paint_1(object sender, PaintEventArgs e)
    {                 
        Graphics G = e.Graphics;
        GraphicsPath gp = new GraphicsPath();
        foreach (var line in tockeKoordinate)
        {
            gp.AddLine((float) (line.startX), (float) (line.startY), (float) (line.endX), (float) (line.endY));
            gp.CloseFigure();
        }
        var rect = gp.GetBounds();
        var scale = Math.Min(1f * (int)(panel1.ClientSize.Width) / rect.Width,
                               1f * (int)(panel1.ClientSize.Height) / rect.Height);          
        using (Pen pen = new Pen(Color.Black, 0.0001f))
                {
                    G.SmoothingMode = SmoothingMode.AntiAlias;
                    G.Clear(Color.White);
                    G.TranslateTransform(0, +panel1.ClientSize.Height);
                    G.ScaleTransform(scale, -scale);
                    G.TranslateTransform(-rect.X, -rect.Y);
                    G.DrawPath(pen, gp);
               }
        if(checkBox1.Checked)
        {
            gp.ClearMarkers();
            foreach (var line2 in tockeZelene)
            {
                gp.AddLine((float)(line2.startX), (float)(line2.startY), (float)(line2.endX), (float)(line2.endY));
                gp.CloseFigure();
            }
            using (pen2);
            {
                G.DrawPath(pen2, gp);   <--- access violation here
            }  
        }      
    }

基本上我有两个ListsTockekoordinatetockeZelena。第一个包含所有要点,第二个点包含大约第一个点的30%,我想使用我的PEN2绘制绿色,该点是在开始时最初进行的。

假设检查了Checkbox1,我运行所有要点以获取矩形GetBounds,因此我可以用点坐标缩放面板1。

然后checkbox1。检查零件,应用程序在标记的行上退出。

有人知道会导致这一点吗?或至少知道一种方法来设置与向我展示有关上述错误的更多信息?

下面的这一行有点可疑..

 using (pen2); //<--this one!!!
 {
      G.DrawPath(pen2, gp);
 }

首先,DrawPath总是会抛出异常,因为您将使用处置对象。为了解决这个问题,请删除半彩...

using (pen2)
 {
      G.DrawPath(pen2, gp);
 }

第二,什么是pen2?谁在使用它?如果另一个线程使用它,则由于您对pen2的使用不是线程安全而发生的访问违规。

最后,除非您一直在重新创建油漆事件,否则不要从油漆事件中处理全局对象(pen2),因为每次您的控件都需要触发此事件以重新绘制其表面。这意味着,您的控件第二次需要重新绘制,它将使用处置对象。

相关内容

  • 没有找到相关文章

最新更新