2014-10-04 118 views
2

我有一個小應用程序,看起來非常像Windows中的舊Paint。我使用圖片框Paint事件實現了所有的Graphic。唯一的問題是,當我點擊這個按鈕時,應該出現一個顏色對話框,讓我改變我的筆的顏色。但每當我點擊框從未出現的按鈕和我的程序卡住Paint事件,最精確的線,我做到以下幾點:顏色對話框沒有顯示

pictureBox1.Image = bmp; 

我做錯了嗎?請,我會很感激任何幫助!

我希望下面的代碼片段就足夠了。

這是我的PictureBox的Paint事件:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     using(Graphics g = Graphics.FromImage(bmp)) 
     { 
      if (lineButton && mouseIsUp) 
      { 
       g.DrawLine(myPen, mAnchorPoint, mFinalPoint); 
       mAnchorPoint = Point.Empty; 
       mFinalPoint = Point.Empty; 

      } 
      pictureBox1.Image = bmp; 
     } 
    } 

這是當我想改變我的筆的顏色,會啓動這個按鈕事件:

private void ColorButton_Click(object sender, EventArgs e) 
    { 
       ColorDialog cd = new ColorDialog(); 
       if (cd.ShowDialog() == DialogResult.OK) 
       { 
        myPen.Color = cd.Color; 
       } 

    } 
+1

* pictureBox1.Image = bmp; * calls * pictureBox1_Paint *,一個無止境的循環。 – 2014-10-04 12:44:38

回答

3

不要使用pictureBox1。 Image = bmp;裏面pictureBox1_Paint。相反:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    using(Graphics g = Graphics.FromImage(bmp)) 
    { 
     if (lineButton && mouseIsUp) 
     { 
      g.DrawLine(myPen, mAnchorPoint, mFinalPoint); 
      mAnchorPoint = Point.Empty; 
      mFinalPoint = Point.Empty; 

     } 
     //pictureBox1.Image = bmp; 
    } 

    e.Graphics.DrawImage(bmp, 0, 0); 
} 

或者,更好的方法,設置pictureBox1.Image = BMP;一次,在bmp(不在pictureBox1_Paint)上執行所有繪圖並最終調用pictureBox1.Invalidate();。您無需在pictureBox1_Paint()中編寫代碼。