2015-07-28 1 views
1

Я использую Visual Studio 2013 для написания приложения Windows Forms C#. Я хочу нарисовать игровой доски на Form1_Load и нарисовать пешки при нажатии кнопки. Я написал два метода: InitDraw() и Draw(). Когда оба метода находятся в Form1_Load() или, это нормально, но если InitDraw() находится в Form1_Load() и Draw() находится в button1_Click() - он рисует, только если я нажимаю Alt или перемещаю окна из экрана и возвращаюсь на экран. Я добавил Invalidate(), но это не поможет.Как начать рисовать в одном событии и продолжить в другом?

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     Bitmap drawBitmap; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      InitDraw(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Draw(); 
     } 

     private void InitDraw() 
     { 
      drawBitmap = new Bitmap(500, 500); 
      pictureBox1.Image = drawBitmap; 
     } 

     private void Draw() 
     { 
      Graphics g = Graphics.FromImage(pictureBox1.Image); 
      Pen myPen = new Pen(Color.Black); 
      g.DrawLine(myPen, 0, 0, 100, 100); 
      myPen.Dispose(); 
      g.Dispose(); 
      Invalidate(); 
     } 
    } 
} 
+0

Почему вы не вызываете Draw() в Form1_Load()? – TuukkaX

+0

как насчет этого .Refresh()? –

+0

Я нажимаю на клик, потому что хочу начать игру в начале и две кнопки, такие как «Добавить пешку» и «Удалить пешку». Refresh() помогает. – Saku

ответ

1

Никто не мешает вам рисовать везде, где вы хотите, что нужно помнить, чтобы сделать это на растрового изображения вместо того, чтобы пытаться заставить его на экран. Под этим я подразумеваю, что вам нужно создать свой собственный объект Bitmap и любые функции ничьей, которые вы вызываете, вы вызываете их по этому поводу.

Чтобы на самом деле это показать на экране, вызовите функцию Invalidate на главном контроллере - не PictureBox. Что-то легкое, как панель. И в этом событии управления Paint просто нарисуйте свое изображение.

Вы были близки, но вы звоните Invalidate на форму, кроме того, что это ужасно неэффективно, чтобы перерисовать все, когда вы точно знаете, что нужно перерисовать, просто ничего не будет делать. Вы не полагаетесь на событие Paint, но по собственному переплёту PictureBox имеет Bitmap - Bitmap, чья ручка вы никогда не меняете. Что касается PictureBox, то все будет таким же, поэтому он больше не будет рисовать себя снова. Когда вы на самом деле вынуждаете его рисовать, перетаскивая окно за пределы экрана, а затем обратно в него читает растровое изображение и рисует то, что вы ожидаете.

+0

pictureBox1.Invalidate() вместо invalidate() помогает – Saku

0

Вы должны нарисовать изображение Paint. Windows может инициировать событие Paint в любой момент, например. если окно перед ним удалено или перемещается форма, содержащая изображение.

То, что вы рисуете на экране, неустойчиво; поэтому пусть Windows решает, когда (повторить) рисовать. Вы также можете вызвать перерисовки с

picturebox1.Invalidate(); 

или

picturebox1.Refresh(); 

Разница: Invalidate ждет, пока окно не находится в режиме ожидания. Refresh рисует сразу.

Если вы только рисуете Form_Load или Button_Click, ваш рисунок может потеряться, когда окна запускают краску самостоятельно. Вместо этого попробуйте позвонить picturebox1.Invalidate.

Смежные вопросы