Форма не отображается после Invalidate () - PullRequest
0 голосов
/ 02 марта 2010

По какой-то причине этот код на самом деле не рисует мой растровый файл ... или не показывает форму.

namespace GraphicsEngine
{
public partial class Form1 : Form
{

    Bitmap[] dude = new Bitmap[3];
    Bitmap dude0 = new Bitmap(@"C:\Directory.bmp");
    Point renderpoint = new Point(1, 1);

    public Form1()
    {

        dude[0] = new Bitmap(@"C:\Directory.bmp");
        InitializeComponent();

    }

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

    private void MainLoop()
    {
        double FPS = 30.0;
        long ticks1 = 0;
        long ticks2 = 0;
        double interval = (double)Stopwatch.Frequency / FPS;


        while (!this.IsDisposed)
        {

            ticks2 = Stopwatch.GetTimestamp();
            if (ticks2 >= ticks1 + interval)
            {
                ticks1 = Stopwatch.GetTimestamp();

                this.Invalidate(); 
            }

            Thread.Sleep(1);

        }
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {

        Graphics g = e.Graphics;

        g.DrawImage(dude0, renderpoint);
    }



}
}

Есть идеи?

Ответы [ 4 ]

1 голос
/ 02 марта 2010

Ваша проблема должна быть немного более очевидной, чем не видеть растровое изображение, вы также не должны видеть форму. Это потому, что вы никогда не завершаете событие Load. Вместо этого вы можете использовать событие Shown.

Проверьте в этой теме код истинного игрового цикла.

0 голосов
/ 02 марта 2010

Похоже, ваш MainLoop () может быть бесконечным циклом. Вы можете поместить Console.Out.WriteLine(ticks1); в цикл while, чтобы проверить это.

Он застревает в обработчике события Load, и ни одна из основных форм проверки не происходит. Это определенно рисует картину, если вы закомментируете вызов MainLoop ().

0 голосов
/ 02 марта 2010

Попробуйте заменить ваш звонок на this.Invalidate(); на this.Refresh();.

0 голосов
/ 02 марта 2010

Form1_Paint не вызывается, если только для UserPaint не установлено значение true. Попробуйте это как ваш конструктор

public Form1() {
  dude[0] = new Bitmap(@"C:\Directory.bmp");
  InitializeComponent();

  this.SetStyle( System.Windows.Forms.ControlStyles.UserPaint, true );
  this.SetStyle( System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, true );
  this.SetStyle( System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, true );
}

Просто будьте осторожны, когда вы делаете это, вы можете нести ответственность за все краски в форме.

...