2016-12-21 1 views
-1

EDIT: Это не дубликат «Как использовать событие OnPaint в C#», потому что я даже не знал, что он существует. Я задаю вопрос, когда не знаю ответа. Это как просить «Как проверить масло в моей машине», когда я даже не знаю, что такое палка для палки. Удалите знак дубликата, если он редактирует его таким образом, который объясняет, почему он не является дубликатом.Почему рисование на форме в его конструкторе не отображает ничего на форме?

Я пытаюсь создать случайный генератор рельефа. На данный момент я использую Windows Forms Graphics, чтобы нарисовать все. Я не могу заставить двигатель работать. Следующий код не отображает ничего в форме, хотя он должен нарисовать черный прямоугольник от 0,0 до 50,50. Может ли кто-нибудь решить?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Random_Terrain_Generator 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      Engine e = new Engine(100, 100); 
      e.Color3(Color.Blue); 
      e.rect(new Rectangle(0,0,50,50)); 
      Graphics fg = this.CreateGraphics(); 
      fg.DrawImage(e.getBuffer(), 1, 100, 100, 100); 
     } 
    } 

    public class Engine 
    { 
     Color fillColor; 
     Bitmap buffer; 
     Graphics bufferGraphics; 

     public Engine(int bufferWidth, int bufferHeight) 
     { 
      buffer = new Bitmap(bufferWidth, bufferHeight); 
      bufferGraphics = Graphics.FromImage(buffer); 
     } 

     public void fRect(Rectangle r) 
     { 
      bufferGraphics.FillRectangle(new SolidBrush(fillColor), r); 
     } 

     public void rect(Rectangle r) 
     { 
      bufferGraphics.DrawRectangle(new Pen(fillColor), r); 
     } 

     public void Color3(Color c) 
     { 
      fillColor = c; 
     } 

     public Bitmap getBuffer() 
     { 
      return buffer; 
     } 
    } 
} 
+2

Вы сделали все в конструкторе формы. Как только форма рисуется, ваша коробка ушла. Формы постоянно перекрашиваются, когда кажется, что нужно визуально обновлять. Это означает, что вам нужно рисовать каждый раз, когда это происходит. http://stackoverflow.com/questions/10076116/how-to-use-the-onpaint-event-in-c – TyCobb

+0

поможет ли это, если я поместил его в событие Form Load? Я делаю это после initializeConponent, поэтому я бы предположил, что он будет рисовать после формы. –

+1

Нет, вам нужно переопределить метод OnPaint, поэтому, когда это будет сделано, вы можете нарисовать его. Посмотрите на пример, который я связал. – TyCobb

ответ

1

Это сработало! Спасибо TyCobb за быстрый ответ.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Random_Terrain_Generator 
{ 
    public partial class Form1 : Form 
    { 
     Engine e; 

     public Form1() 
     { 
      InitializeComponent(); 

      e = new Engine(100, 100); 
      e.Color3(Color.Blue); 
      e.fRect(new Rectangle(0,0,50,50)); 
     } 

     protected override void OnPaint(PaintEventArgs pe) 
     { 
      // Call the OnPaint method of the base class. 
      base.OnPaint(pe); 
      pe.Graphics.DrawImage(e.getBuffer(), 1, 1, 100, 100); 

     } 
    } 

    public class Engine 
    { 
     Color fillColor; 
     Bitmap buffer; 
     Graphics bufferGraphics; 

     public Engine(int bufferWidth, int bufferHeight) 
     { 
      buffer = new Bitmap(bufferWidth, bufferHeight); 
      bufferGraphics = Graphics.FromImage(buffer); 
     } 

     public void fRect(Rectangle r) 
     { 
      bufferGraphics.FillRectangle(new SolidBrush(fillColor), r); 
     } 

     public void rect(Rectangle r) 
     { 
      bufferGraphics.DrawRectangle(new Pen(fillColor), r); 
     } 

     public void Color3(Color c) 
     { 
      fillColor = c; 
     } 

     public Bitmap getBuffer() 
     { 
      return buffer; 
     } 
    } 
} 

Я переопределяю событие OnPaint формы, которое перерисовывает прямоугольник в каждом кадре. Проблема заключалась в том, что форма рисовала над прямоугольником. How to use the OnPaint event in C#?

+2

Вам не нужно 'fg'. У 'PainteEventArgs' есть' Graphics' для вас. Рад, что это сработало для вас. – TyCobb

+1

Да, как правило, никогда не используйте CreateGraphics() для рисования на элементе управления. Он не останется действительным на неопределенный срок. Вместо этого всегда используйте свойство PaintEventArgs.Graphics. – Blorgbeard

+0

Хорошо, плохо меняйте. Благодаря! –

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