2014-10-04 2 views
2

У меня есть небольшое приложение, которое очень похоже на старую краску из Windows. Я выполнил всю графику, используя событие Paint Box. Единственная проблема заключается в том, что когда я нажимаю эту кнопку, появляется диалоговое окно «Цвет» и позволяю мне менять цвет моего пера. Но всякий раз, когда я нажимаю кнопку никогда не появляется окно и моя программа застревает в случае краски, наиболее точно на линии, где я сделать следующее:Диалоговое окно цвета не отображается

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; * вызывает * pictureBox1_Paint *, бесконечный цикл. –

ответ

3

Не используйте pictureBox1. Изображение = bmp; внутри фотографияBox1_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 (не в pictureBox1_Paint) и окончательный вызов pictureBox1.Invalidate();. Вам не нужно писать код в pictureBox1_Paint().