2016-06-20 45 views
0

私は、graphicsPathを使用してpanel1に点と線を描画しています。コードは以下の通りである:TockekoordinatetockeZelenaコード1073741819(0xc0000005) 'アクセス違反'で終了したプログラム

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 
      } 
     }  
    } 

は基本的に私は2 Listsを持っています。最初のものにはすべての点が含まれ、2番目の点には最初の点の約30%が含まれています。これは、最初に初期化されたpen2を使用して緑色に塗りたいものです。

checkbox1がチェックされていると仮定すると、矩形GetBoundsを得るためにすべての点を実行するので、ポイント座標でpanel1を拡大/縮小できます。

checkbox1.checkedの部分が表示され、マークされた行にアプリケーションが終了します。

これを引き起こす可能性があることは誰にも分かりますか?または、少なくとも、エラーの詳細を表示するためにVSを設定する方法を知っていますか?

答えて

1

以下この行は、あなたが破棄されたオブジェクトを使用するため、常に例外がスローされます。..まず

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

DrawPath少し疑わしいです。それに対処するには、セミコロンを削除してください...

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

次に、pen2は何ですか?誰がそれを使用していますか?それが別のスレッドによって使用されている場合は、pen2の使用がスレッドセーフではないため、アクセス違反が発生します。

最後に、ペイントイベント内でグローバルオブジェクト(pen2)を配置しないでください。コントロールをサーフェスを再描画する必要があるたびにトリガーされるため、常に再作成しない限りは使用しないでください。つまり、コントロールを再描画する必要がある2回目は、配置されたオブジェクトを使用します。

+0

はい、セミコロンを削除すると助けられましたが、paintメソッドの中に 'pen2'宣言を置くことはそのトリックでした。 – Romy

関連する問題