Invalidate()后不显示表单

时间:2010-03-01 22:56:33

标签: c# .net winforms drawing bitmap

出于某种原因,此代码实际上并未绘制我的位图文件...或显示表单。

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 个答案:

答案 0 :(得分:1)

你的问题应该比没有看到位图更明显,你也不应该看到这个形式。那是因为你永远不会完成Load事件。您可以使用已显示的事件。

检查this thread以获取真实游戏循环的代码。

答案 1 :(得分:0)

除非您将UserPaint设置为true,否则不会调用Form1_Paint。试试这个作为你的构造函数

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 );
}

请注意,当您这样做时,您可能需要对表单上的所有颜料负责。

答案 2 :(得分:0)

尝试使用this.Invalidate();替换您的this.Refresh();来电。

答案 3 :(得分:0)

看起来你的MainLoop()可能是一个无限循环。您可以将Console.Out.WriteLine(ticks1);放入while循环中以验证此操作。

它被卡在Load事件处理程序中,并且没有发生主表单验证。如果您注释掉对MainLoop()的调用,它肯定会画出图片。