VC#表格闪烁

时间:2011-07-17 19:13:15

标签: c# windows winforms windows-7

所以这就是我想要做的事情。我正在使用SWF和SD命名空间进行游戏。当我使用1000/30间隔(30帧)的计时器时,在它的tick事件中我打电话给InvokeGraphics()。一切都呈现或多或少的细微,除了椭圆被绘制flickred.I尝试使用双缓冲和this.SetStyle(),但都失败。这是代码:

public partial class MainForm : Form
{
    int x = 0;
    public MainForm()
    {

        InitializeComponent();

        var sz = SystemInformation.PrimaryMonitorSize;
        this.FormBorderStyle = FormBorderStyle.None;
        this.Size = sz;
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);

        Timer tmr = new Timer();
        tmr.Enabled = true;
        tmr.Interval = 1000/30;
        tmr.Tick += delegate(object sender, EventArgs e)
        { 
            x++;
            this.InvokePaint(this,new PaintEventArgs(this.CreateGraphics(),this.Bounds));
        };
    }
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if((int)e.KeyChar == 27) Application.Exit();
        base.OnKeyPress(e);
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        var g = e.Graphics;

        g.Clear(Color.Firebrick);
        // this ellipse flickrs
        g.FillEllipse(Brushes.Green,x,64,64,64);

        base.OnPaint(e);
    }
    protected override void OnMouseClick(MouseEventArgs e)
    {

        base.OnMouseClick(e);
    }

}

1 个答案:

答案 0 :(得分:5)

使用this.CreateGraphics()不会 创建双缓冲绘制上下文。将窗体的DoubleBuffered属性设置为true。并使用间隔为32毫秒的Timer来强制刷新,只在其Tick事件处理程序中调用Invalidate()。