2017-10-04 6 views
0

私のフォームには、ピクチャボックスがあります。私はイメージの上に矢印を描くことができるようにしたかったのです。私はそこに途中で入ることができた。フォームのロードイベントでは、画像をピクチャボックスに割り当てます。私は下のコードで矢印を作成することができます。問題は、フォームのロードイベントで割り当てられた画像が消去されるように矢印を作成するたびに発生します。なぜ画像が消去されるのですか?フォームの読み込み中に割り当てたイメージを、その上に矢印を描きながら維持するにはどうすればよいですか?絵の上に絵を描いている間にピクチャボックスイメージを保持する

private bool isMoving = false; 
    private Point mouseDownPosition = Point.Empty; 
    private Point mouseMovePosition = Point.Empty; 
    private List<Tuple<Point, Point>> lines = new List<Tuple<Point, Point>>(); 
    Pen _Pen; 

    private void Test_Load(object sender, EventArgs e) 
    { 
     pictureBox1.Image = Properties.Resources.background;   
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 

     if (isMoving) 
     { 
      if (pictureBox1.Image == null) 
      { 
       Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
       using (Graphics g = Graphics.FromImage(bmp)) 
       { 
        g.Clear(Color.White); 
       } 
       pictureBox1.Image = bmp; 
      } 

      using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 
      { 
       g.Clear(pictureBox1.BackColor); 

       AdjustableArrowCap bigArrow = new AdjustableArrowCap(5, 5); 
       _Pen = new Pen(Color.IndianRed, 3); 
       _Pen.CustomEndCap = bigArrow; 
       g.DrawLine(_Pen, mouseDownPosition, mouseMovePosition); 
       _Pen.Dispose(); 
      } 
     } 
    } 



    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     isMoving = true; 
     mouseDownPosition = e.Location; 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (isMoving) 
     { 
      mouseMovePosition = e.Location; 
      pictureBox1.Invalidate(); 
     } 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (isMoving) 
     { 
      lines.Add(Tuple.Create(mouseDownPosition, mouseMovePosition)); 
     } 
     isMoving = false; 
    } 

私はこの問題は、ここでこのラインをg.Clear(pictureBox1.BackColor);

答えて

1

だと思いますはい、問題はあなたが線を描画する前に、全体の制御領域を消去し、ここで、このラインでg.Clear(pictureBox1.BackColor);です。あなたが直接e.Graphicsに描画する

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (isMoving) 
    { 
     if (pictureBox1.Image == null) e.Graphics.Clear(Color.White); 

     // Add this line for high quality drawing: 
     e.Graphics.SmoothingMode = SmoothingMode.HighQuality; 

     AdjustableArrowCap bigArrow = new AdjustableArrowCap(5, 5); 
     _Pen = new Pen(Color.IndianRed, 3); 
     _Pen.CustomEndCap = bigArrow; 
     e.Graphics.DrawLine(_Pen, mouseDownPosition, mouseMovePosition); 
     _Pen.Dispose(); 
    } 
} 
+0

こんにちは桜を、これは働いていました。ありがとうございました!これは、背景画像を保存し、その上に矢印を描画しますが、なぜpicturebox画像が背景画像の上に描かれた矢印と等しくないのか分かりますか?私がこれをテストしたのは、別のピクチャボックスコントロールを自分のフォームに入れて、 'picturebox2.image = picturebox1.image'と書いただけで、私のバックグラウンドイメージしか表示されませんでした。 – taji01

+0

'if(pictureBox1.Image == null)'を 'if((PictureBoxとしての送信者.Image == null)'に変更します。とにかく、私はあなたのコメントをはっきりと理解していません。可能であれば、新しいコードで質問を編集してください。もし私が助けることができるかどうかわかります – Sakura

+0

こんにちはさくら、私はここで質問しました。 https://stackoverflow.com/questions/46592322/paint-drawline-image-into-picturebox-image – taji01

関連する問題